Oracle 使用open。。。有关…,请参阅,而不是executeimmediate为什么要将insert和select语句分开?为什么不将一个插入存储到。。。是否改为在表中选择..语句?然后运行executeimmediate v_sql_语句就成了一件简单的事情。
Oracle 使用open。。。有关…,请参阅,而不是executeimmediate为什么要将insert和select语句分开?为什么不将一个插入存储到。。。是否改为在表中选择..语句?然后运行executeimmediate v_sql_语句就成了一件简单的事情。,oracle,plsql,execute-immediate,bulk-collect,Oracle,Plsql,Execute Immediate,Bulk Collect,使用open。。。有关…,请参阅,而不是executeimmediate为什么要将insert和select语句分开?为什么不将一个插入存储到。。。是否改为在表中选择..语句?然后运行executeimmediate v_sql_语句就成了一件简单的事情。或者,如果insert和select语句位于不同的列中,而不是将insert语句存储为insert into。。。。值(…),为什么不让它插入到…,这样您就可以执行立即执行v|u ins_语句| chr(10)| v|u sel_语句inser
使用
open。。。有关…
,请参阅,而不是executeimmediate
为什么要将insert和select语句分开?为什么不将一个插入存储到。。。是否改为在表中选择..
语句?然后运行executeimmediate v_sql_语句就成了一件简单的事情代码>。或者,如果insert和select语句位于不同的列中,而不是将insert语句存储为insert into。。。。值(…)
,为什么不让它插入到…
,这样您就可以执行立即执行v|u ins_语句| chr(10)| v|u sel_语句代码>insert语句看起来如何?也许将有可能收集插入到。。。选择语句并动态执行它。或者作为另一种方式,将Select查询结果插入临时表并在insert语句中使用。我不明白Select
和insert
是如何协同工作的。这些“插入查询”是什么?它们只是插入数据的表吗?您是否可以重新编写此代码:执行立即“插入到”| | var|u insert_table | | | | var|u selquery
?@Cumberddame你能举一些简单的例子来说明这些语句是什么样子的吗?我想知道是否有一种方法可以直接插入到表中,而无需将数据存储在PL/SQL数组中。。。有关…
,请参阅,而不是executeimmediate
为什么要将insert和select语句分开?为什么不将一个插入存储到。。。是否改为在表中选择..
语句?然后运行executeimmediate v_sql_语句就成了一件简单的事情代码>。或者,如果insert和select语句位于不同的列中,而不是将insert语句存储为insert into。。。。值(…)
,为什么不让它插入到…
,这样您就可以执行立即执行v|u ins_语句| chr(10)| v|u sel_语句代码>insert语句看起来如何?也许将有可能收集插入到。。。选择语句并动态执行它。或者作为另一种方式,将Select查询结果插入到临时表中,并在insert语句中使用它
PROCEDURE SEL_INS
AS
CURSOR C
IS
SELECT
SELEQRY SELQRY,
INSQUERY INSERTQRY,
cols COLS
FROM TAB1;
selqry VARCHAR2(1000);
insqry VARCHAR2(1000);
tab1 vartable:=vartable();
cols NUMBER;
BEGIN
tab1:=vartable(NULL);
FOR X IN C
LOOP
selqry:= X.SELQRY;
cols:=X.COLS;
EXECUTE immediate selqry bulk collect INTO tab1;
-- select statement is concatenated before executing. so that each index has one record
--with values separated by commas
--- a sample column in tab1 will have values like (abc,abc1,abc2)
FOR i IN 1..tab1.count
LOOP
insqry :=X.INSERTQRY;
--- insert query will have values like insert into tab2 values('abc,'abc1','abc2')
EXECUTE immediate insqry;
END LOOP;
END LOOP;
END SEL_INS;
PROCEDURE SEL_INS AS
CURSOR C IS
SELECT SELEQRY, INSQUERY, COLS
FROM TAB1;
selqry VARCHAR2(1000);
insqry VARCHAR2(1000);
tab1 vartable;
cols NUMBER;
cur INTEGER;
res INTEGER;
col_cnt INTEGER;
desctab DBMS_SQL.DESC_TAB;
i INTEGER;
BEGIN
FOR aQuery IN C LOOP
tab1 := vartable();
cur := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(cur, aQuery.SELEQRY, DBMS_SQL.NATIVE);
DBMS_SQL.DESCRIBE_COLUMNS(cur, col_cnt, desctab)
FOR i IN 1..col_cnt LOOP
DBMS_SQL.DEFINE_COLUMN(cur, i, desctab(i).COL_NAME, 2000);
END LOOP;
res := DBMS_SQL.EXECUTE_AND_FETCH(cur, TRUE);
FOR i IN 1..col_cnt LOOP
tab1.EXTEND;
DBMS_SQL.COLUMN_VALUE(cur, i, tab1(tab1.LAST));
END LOOP;
DBMS_SQL.CLOSE_CURSOR(cur);
-- ... do whatever with tab1(xyz) -> otherwise this procedure would be an overkill
cur := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(cur, aQuery.INSQUERY, DBMS_SQL.NATIVE);
i := tab1.FIRST;
WHILE i IS NOT NULL LOOP
DBMS_SQL.BIND_VARIABLE(cur, ':b'||i, tab1(i));
i := tab1.NEXT(i);
END LOOP;
res := DBMS_SQL.EXECUTE(cur);
DBMS_SQL.CLOSE_CURSOR(cur);
END LOOP;
END;
DBMS_SQL.EXECUTE(cur);
WHILE (DBMS_SQL.FETCH_ROWS(cur) > 0) LOOP
...
END LOOP;
INSERT INTO sel_ins (selqry, insquery)
SELECT 'select col1, col2, col3 from table1' selqry, 'insert into other_table1 (col1, col2, col3)') insqry FROM dual
UNION ALL
SELECT 'select col1, col2 from table2' selqry, 'insert into other_table2 (col1, col2)') insqry FROM dual
UNION ALL
SELECT 'select col1, col2, col3 from table3 where col4 = ''fred''' selqry, 'insert into other_table3 (col1, col2, col3)') insqry FROM dual;
PROCEDURE sel_ins IS
CURSOR ins_sel_cur IS
SELECT seleqry selqry, insquery insqry, cols cols
FROM tab1;
v_selqry tab1.seleqry%TYPE;
v_insqry tab1.insquery%TYPE;
BEGIN
FOR ins_sel_rec IN ins_sel_cur
LOOP
EXECUTE IMMEDIATE ins_sel_rec.v_insqry || CHR(10) || ins_sel_rec.v_selqry;
END LOOP;
END;
/
INSERT INTO sel_ins (selqry, insquery, cols)
SELECT 'select <COLS> from table1' selqry, 'insert into other_table1 (<COLS>)') insqry, 'col1, col2, col3' cols FROM dual
UNION ALL
SELECT 'select <COLS> from table2' selqry, 'insert into other_table2 (<COLS>)') insqry, 'col1, col2' cols FROM dual
UNION ALL
SELECT 'select <COLS> from table3 where col4 = ''fred''' selqry, 'insert into other_table3 (<COLS>)') insqry, 'col1, col2, col3' cols FROM dual;
execute immediate replace(ins_sel_rec.v_insqry, '<COLS>', ins_sel_rec.cols) ||
chr(10) ||
replace(ins_sel_rec.v_selqry, '<COLS>', ins_sel_rec.cols);