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;

这是我的第二个程序(示例)

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;

我的问题陈述是,从第一个过程我得到两个 refcursor 作为输出,在第二个过程中我试图读取它们并将它们放入一个临时表中,该表将由另一个过程使用。不能合并这两个 select 语句,因为它们具有不同的输出集。有没有更好的机制可以这样做,就像我的方法一样,当我运行第一个过程时(比如第一个选择返回 4 行,第二个选择返回 6 行),需要将 6 行插入到临时表中但是当现在有行获取时,从第一个选择中读取的列将作为 NULL 插入,但在我的情况下,重复的行被插入。任何帮助,将不胜感激。如果有人需要更多信息,请发布。

4

1 回答 1

1

如果我对您的理解正确,那么您实际上并不需要将它们联合起来-而是加入它们。
由于这两个表之间没有真正的关系,并且您需要“双方”中的空值,因此您需要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 个 refcursors,那么我的方法是不相关的......
但你可以做的是有 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 回答