Вот моя первая процедура (пример)
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, когда теперь будет выбрана строка, но в моем случае вставляется повторяющаяся строка. Любая помощь будет оценена по достоинству. И сделайте сообщение, если кому-то нужна дополнительная информация о том же.
testt1testt2
, составленные из (TMP_PMT_APP_VARIABLES_REF #1, TMP_PMT_CONFIG_TO_LOB_DAT #2) и (TMP_PMT_APP_VARIABLES_REF #2, TMP_PMT_CONFIG_TO_LOB_DAT #1). Тогда следующий запуск будет иметь (TMP_PMT_APP_VARIABLES_REF #2, TMP_PMT_CONFIG_TO_LOB_DAT #2) и (TMP_PMT_APP_VARIABLES_REF #1, TMP_PMT_CONFIG_TO_LOB_DAT #1 б>). Что откровенно нелогично. - person APC   schedule 11.09.2012t_new
) столбцами из двух существующих таблиц (t1
,t2
). Я ожидаю, что будет какая-то бизнес-логика, определяющая соединение междуt1
иt2
. Но у тебя их нет. Таким образом, вы заполняетеt_new
записями, полученными путем объединения случайных строк изt1
со случайными строками вt2
. Программирование — это упражнение в логике, и часть описания работы — сложные требования, которые являются неполными, двусмысленными или просто неправильными. - person APC   schedule 12.09.2012