0

これが私の最初の手順です(サンプル)

CREATE OR REPLACE PROCEDURE GPTOWNER_CORP_AMF.testt1
AS
po_status VARCHAR2(100);
po_cur_1 SYS_REFCURSOR;
po_cur_2 SYS_REFCURSOR;
BEGIN
OPEN po_cur_1 FOR
select app_var_row_seq,app_var_name,app_var_value,app_var_description,r_date
 from TMP_PMT_APP_VARIABLES_REF
where ROWNUM < 5;

OPEN po_cur_2 FOR
select config_to_lob_row_seq,config_row_seq,lobref_row_seq,r_date
 from  TMP_PMT_CONFIG_TO_LOB_DAT 
 where ROWNUM < 6;
 TESTT2(po_cur_1,po_cur_2,po_status);
 DBMS_output.put_line(po_status);
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE(SQLERRM||SQLCODE);
END;

これが私の2番目の手順です(サンプル)

CREATE OR REPLACE procedure GPTOWNER_CORP_AMF.testt2 (pi_cur_1 IN sys_refcursor, pi_cur_2 IN sys_refcursor,po_status OUT VARCHAR2)
AS
app_var_row_seq NUMBER;
app_var_name VARCHAR2(100);
app_var_value VARCHAR2(1000);
app_var_description VARCHAR2(1000);
r_date1 DATE;
config_to_lob_row_seq NUMBER;
config_row_seq VARCHAR2(100);
lobref_row_seq NUMBER;
r_date2 DATE;
BEGIN
    LOOP
        FETCH pi_cur_1 into app_var_row_seq,app_var_name,app_var_value,app_var_description,r_date1;
        FETCH pi_cur_2 into config_to_lob_row_seq,config_row_seq,lobref_row_seq,r_date2;

        EXIT WHEN (pi_cur_2%NOTFOUND AND pi_cur_1%NOTFOUND ) ; 

        INSERT INTO testt1testt2 (colid,col1,col2,col3,col4,col5,col6,col7,col8,col9) 
                    VALUES(colid.nextval,app_var_row_seq,app_var_name,app_var_value,app_var_description,r_date1,config_to_lob_row_seq,config_row_seq,lobref_row_seq,r_date2);
    END LOOP;
    DBMS_OUTPUT.PUT_LINE ('rows inserted:' || pi_cur_1%ROWCOUNT || 'and' || pi_cur_2%ROWCOUNT);   
EXCEPTION
    WHEN OTHERS THEN
       DBMS_OUTPUT.PUT_LINE(SQLERRM||SQLCODE);
END;

私の問題は、最初の手順から出力として2つのrefcursorを取得し、2番目の手順でそれらを読み取って、別の手順で使用される一時テーブルに入れようとしているということです。出力のセットが異なるため、2 つの select ステートメントを結合できません。そうするためのより良いメカニズムはありますか?最初の選択から読み取られた列は、行がフェッチされたときに NULL として挿入されますが、私の場合は重複した行が挿入されています。どんな助けでも大歓迎です。そして、誰かが同じことについてさらに情報が必要な場合は投稿してください。

4

1 に答える 1

1

私があなたの言うことを正しく理解していれば、実際にそれらを結合する必要はありませんが、それらに参加してください。
2 つのテーブル間に実際の関係はなく、「両側」に null が必要なため、full outer joinそれらが必要です。

それらの間に関係がない場合、なぜ両方を同じ一時テーブルに置く必要があるのか​​ 、私はあなたに尋ねません。しかし、これを行う場合、単に ? を使用しないのはなぜinsert-selectですか?

INSERT INTO testt1testt2 (colid,col1,col2,col3,col4,col5,col6,col7,col8,col9) 
SELECT colid.nextval, app_var_row_seq,app_var_name,app_var_value,app_var_description, t1.r_date,
                      config_to_lob_row_seq,config_row_seq,lobref_row_seq, t2.r_date
FROM (select app_var_row_seq,app_var_name,app_var_value,app_var_description,r_date
      from TMP_PMT_APP_VARIABLES_REF
      where ROWNUM < 5) t1 
FULL OUTER JOIN (select config_to_lob_row_seq,config_row_seq,lobref_row_seq,r_date
                 from  TMP_PMT_CONFIG_TO_LOB_DAT 
                 where ROWNUM < 6) t2 on 1=2

更新:
要件が 2 つの参照カーソルを取得することである場合、私のアプローチは関係ありません...
ただし、できることは、次のような 2 つの挿入コマンドを使用することです。

INSERT INTO testt1testt2 (colid,col1,col2,col3,col4,col5,col6,col7,col8,col9) 
     VALUES (colid.nextval,app_var_row_seq,app_var_name,app_var_value,app_var_descript‌​ion,r_date1,null,null,null,null); 

そして他のような:

INSERT INTO testt1testt2 (colid,col1,col2,col3,col4,col5,col6,col7,col8,col9)
     VALUES (colid.nextval,null,null,null,null,null,config_to_lob_row_seq,config_row_s‌​eq,lobref_row_seq,r_date2);

本当にうまくやりたい場合はbulk insert、パフォーマンスのために使用できます。こちらの例を参照してください

于 2012-09-11T07:40:46.207 に答える