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);