簡體   English   中英

表變量在參數中用於填充oracle存儲過程中的表

[英]Table variable as in parameter to populate a table in oracle Stored procedure

大多數情況下,我避免將表變量作為存儲過程的輸入參數。 因為我不知道如何處理它們,但在這種情況下我沒有其他選擇。 我有一個要求,數百條記錄將從Oracle Agile PLM傳遞到數據庫。 我要做的是從輸入記錄/列表中填充表。 為了實現這一點,我開發了一個對象類型,然后是該對象類型的表類型。

CREATE OR REPLACE TYPE TEST_USER.MD_TYPE AS OBJECT
                  (QUERY_REF VARCHAR2 (1000 BYTE),
                   COL_NAME VARCHAR2 (100 BYTE),
                   COL_LENGTH VARCHAR2 (50 BYTE),
                   COL_SEQ NUMBER)
/

CREATE OR REPLACE TYPE TEST_USER.MD_TYPE_TABLE  AS TABLE OF  MD_TYPE
/

存儲過程:

CREATE OR REPLACE PROCEDURE SP_TEST2
(
  P_MD_TABLE IN MD_TYPE_TABLE,
  p_success OUT number 
) 
IS

BEGIN

  INSERT INTO MDATA_TABLE
  (
QUERY_REF ,
                   COL_NAME ,
                   COL_LENGTH ,
                   COL_SEQ 

  )
    SELECT  ea.*
    FROM  TABLE(P_MD_TABLE) ea;

    p_success :=1;
    EXCEPTION 
    WHEN OTHERS THEN
    p_success := -1;
END SP_TEST2;

問題是我不知道如何填充,第一個參數P_MD_TABLE然后是MDATA_TABLE。 程序編譯沒有任何錯誤。 我沒有測試過這個程序。

請幫忙。

通過將參數傳遞給MD_TYPE來加載MD_TYPE_TABLE的過程

CREATE OR REPLACE PROCEDURE SP_UPLOAD_MD_TYPE
(
P_QUERY_REF VARCHAR2,
P_COL_NAME VARCHAR2,
P_COL_LENGTH VARCHAR2,
p_col_seq NUMBER,
p_no_of_rows_to_insert NUMBER,
p_num OUT NUMBER
)
IS

    p_type_tbl  MD_TYPE_TABLE := MD_TYPE_TABLE(); --initialize

BEGIN
  <<vartype>>
         FOR i IN 1..p_no_of_rows_to_insert
         LOOP
    p_type_tbl.extend();
    p_type_tbl(p_type_tbl.last) := MD_TYPE(P_QUERY_REF, P_COL_NAME, P_COL_LENGTH, p_col_seq);
         END LOOP vartype;


    SP_TEST2(p_type_tbl, p_num);


END;

您可以使用extend/ bulk collect填充table type

使用extend

p_type_tbl.extend();
p_type_tbl(p_type_tbl.last) := MD_TYPE('QUERY_REF1', 'COL_NAME1', 'COL_LENGTH1', 1);

或使用bulk collect

SELECT MD_TYPE(c1, c2... cn)
  BULK COLLECT INTO p_type_tbl
  FROM   some_table;

演示

DECLARE
    p_type_tbl  MD_TYPE_TABLE := MD_TYPE_TABLE(); --initialize
    p_num NUMBER;
BEGIN
    p_type_tbl.extend();
    p_type_tbl(p_type_tbl.last) := MD_TYPE('QUERY_REF1', 'COL_NAME1', 'COL_LENGTH1', 1);

    p_type_tbl.extend();
    p_type_tbl(p_type_tbl.last) := MD_TYPE('QUERY_REF2', 'COL_NAME2', 'COL_LENGTH2', 2);

    SP_TEST2(p_type_tbl, p_num);

    DBMS_OUTPUT.PUT_LINE(p_num);
END;
/

產量
1

SELECT * FROM MDATA_TABLE;

產量

QUERY_REF   COL_NAME    COL_LENGTH  COL_SEQ
QUERY_REF1  COL_NAME1   COL_LENGTH1 1
QUERY_REF2  COL_NAME2   COL_LENGTH2 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM