Я читал больше о BULK COLLECT и использовании dbms_sql и пытался применить его к одной из моих процедур В моей хранимой процедуре основная логика является INSERT в таблицу из значений другого таблица, какИспользование BULK COLLECT и dbms_sql
CREATE OR replace PROCEDURE My_procedure (pi_date IN DATE,
po_error OUT VARCHAR2,
po_error_desc OUT nocopy VARCHAR2)
AS
curr_date DATE;
BEGIN
CURR_DATE := PI_DATE;
INSERT INTO t1
(col1,
col2,
col3,
col4,
col5)
SELECT t2.col1,
t2.col2,
t2.col3,
t2.col4,
CURR_DATE
EXCEPTION
WHEN OTHERS THEN
PO_ERROR := -1;
PO_ERROR_DESC := 'proc nam : '
|| 'my_procedure'
|| ', err_num :'
|| SQLCODE
|| ' | , err_msg :'
|| SQLERRM;
ROLLBACK;
DBMS_SESSION.free_unused_user_memory;
END;
Однако, поскольку данные, которые будут вставлены в другую таблицу огромен, на мой второй модифицированной методике
Я использовал BULK COLLECT и DBMS_SQL ниже
CREATE OR replace PROCEDURE My_procedure (pi_date DATE,
po_error OUT VARCHAR2,
po_error_desc OUT nocopy VARCHAR2)
AS
v_curr_date DATE;
l_col1 dbms_sql.Varchar2_Table;
l_col2 dbms_sql.Varchar2_Table;
l_col3 dbms_sql.Number_Table;
l_col4 dbms_sql.Number_Table;
CURSOR c1 IS
SELECT *
FROM t2;
BEGIN
V_CURR_DATE := PI_DATE;
PO_ERROR := 0;
OPEN c1;
LOOP
FETCH c1 bulk collect INTO l_col1, l_col2, l_col3, l_col4 limit 1000;
forall indx IN 1..l_col1.COUNT
INSERT INTO t2
(col1,
col2,
col3,
col4,
col5)
VALUES (L_col1(indx),
L_col2(indx),
L_col3(indx),
L_col4(indx),
V_CURR_DATE);
EXCEPTION
WHEN OTHERS THEN
PO_ERROR := -1;
PO_ERROR_DESC := 'proc nam : '
|| 'my_procedure'
|| ', err_num :'
|| SQLCODE
|| ' | , err_msg :'
|| SQLERRM;
ROLLBACK;
DBMS_SESSION.free_unused_user_memory;
END;
Так вот мой второй пример, я использовал BULK собрать согласно документации, однако
Может кто-то poinpoint точного использования dbms_sql.Varchar2_Table
?
Как было показано выше, если фактическая длина col1 является VARCHAR2 (40), но dbms_sql.Varchar2_Table
использует VARCHAR2(2000)
TYPE varchar2_table IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
Каков ваш точный вопрос? Ваш предоставленный код пронизан синтаксическими ошибками. Вы должны указать точные источники, с которыми работаете, и указать, в чем проблема, с которой вы работаете, в – Sathya
. Мой вопрос - это подход, который я использовал в примере второй использования BULK COLLECT и использование dbms_sql для ввода INSERT в другую таблицу. правильно или нет. Надеюсь, все в порядке. – ronan