插入数据如何在oracle中使用execute immediate?

时间:2015-01-24 07:22:55

标签: sql oracle

我正在使用oracle 10g。我希望执行动态插入查询,从过程中的另一个查询中选择该字段。

    sql_stmt := 'INSERT INTO tt_causalvarien VALUES(:breakdate, :batch, :procode, :rpcaption, :rvminmaxs, :rpvalue)';

   EXECUTE IMMEDIATE sql_stmt USING  select brkngdte,batch,prdtcode,'RP1','S',getminmax('qtyadded','vttrcwfdetatdryer','S','prdcode','PRC002','vttrcwfaddatdryer') Test_Sample
              from skybluem.VMtrcwfhdailyplansheet;
你能帮帮忙吗?你可以给我一些如何编写这类查询的提示。

2 个答案:

答案 0 :(得分:2)

不确定我的示例是否是静态的和动态的,但一般来说,为了这个目的,您不需要execute immediate,只需插入一个表中选择:< / p>

  INSERT INTO tt_causalvarien 
SELECT brkngdte,batch,prdtcode,'RP1','S',getminmax('qtyadded','vttrcwfdetatdryer','S','prdcode','PRC002','vttrcwfaddatdryer') 
FROM skybluem.VMtrcwfhdailyplansheet;

答案 1 :(得分:2)

动态查询用于在运行时构建SQL语句。由于您可以将整个语句作为 text 访问,因此您比使用编译时已知的SQL语句具有更大的灵活性。请参阅Oracle's documentation

从广义上讲,如果您需要更改SQL查询中的值,则需要动态SQL。

根据您的示例,您有3个选项:

  1. 正如@evilive在她自己的回答中所解释的那样,根据你的例子,你可以将你的陈述重写为一个简单的INSERT ... SELECT。请注意,这不一定要插入一个行。根据您的数据/确切查询,这可以触发几个行的插入。或者 no 行。
  2. 您可以使用PL / SQL SELECT .. INTO和数据替换(        不要忘记根据需要声明变量:                 breakdate,batch,procode,                 rpcaption,rvminmaxs,                 rpvalue)

       select "brkngdte", "batch", "prdtcode", 'RP1', 'S',
              getminmax('qtyadded', 'vttrcwfdetatdryer', 'S', 'prdcode', 'PRC002', 'vttrcwfaddatdryer') Test_Sample
       into breakdate, batch, procode, rpcaption, rvminmaxs,
              rpvalue
       from skybluem.VMtrcwfhdailyplansheet;
    
       INSERT INTO tt_causalvarien VALUES(breakdate, batch, procode, rpcaption, rvminmaxs, rpvalue);
    
       This will trigger an exception if the `select` statement returns no row or several rows.
    
  3. 如果您确实需要动态构建INSERT查询(比如因为表的名称仅在运行时已知):

       sql_stmt := 'INSERT INTO ' || some_table || ' VALUES(:breakdate, :batch, :procode, :rpcaption, :rvminmaxs, :rpvalue)';
       --                         ^^^^^^^^^^^^^^^^
       --                   *this* require dynamic SQL
    
       select "brkngdte", "batch", "prdtcode", 'RP1', 'S',
              getminmax('qtyadded', 'vttrcwfdetatdryer', 'S', 'prdcode', 'PRC002', 'vttrcwfaddatdryer') Test_Sample
       into breakdate, batch, procode, rpcaption, rvminmaxs,
              rpvalue
       from skybluem.VMtrcwfhdailyplansheet;
    
       EXECUTE IMMEDIATE sql_stmt USING breakdate, batch, procode, rpcaption, rvminmaxs, rpvalue;
    

    再次,当您使用SELECT ... INTO时,PL / SQL运行时确保将选择一行且仅一行。如果情况并非如此,则会触发异常。


  4. 此外,根据OP请求,如果SELECT查询也是动态,您可以使用EXECUTE IMMEDIATE ... INTO来获取行数据。之后,根据您的使用情况,您可以使用EXECUTE IMMEDIATE ... USING INSERT语句 sel_stmt := 'select "brkngdte", "batch" ... from skybluem.VMtrcwfhdailyplansheet'; sql_stmt := 'INSERT INTO ' || some_table || ' VALUES(:breakdate, :batch, :procode, :rpcaption, :rvminmaxs, :rpvalue)'; EXECUTE IMMEDIATE sel_stmt INTO breakdate, batch, procode, rpcaption, rvminmaxs, rpvalue; EXECUTE IMMEDIATE sql_stmt USING breakdate, batch, procode, rpcaption, rvminmaxs, rpvalue; 。这是一个充满活力的&#34;例如:

    {{1}}

    有关各种支持的语法,请参阅EXECUTE IMMEDIATE reference documentation,有关介绍材料,请参阅Using the EXECUTE IMMEDIATE Statement in PL/SQL