我正在使用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;
你能帮帮忙吗?你可以给我一些如何编写这类查询的提示。
答案 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个选项:
INSERT ... SELECT
。请注意,这不一定要插入一个行。根据您的数据/确切查询,这可以触发几个行的插入。或者 no 行。您可以使用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.
如果您确实需要动态构建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运行时确保将选择一行且仅一行。如果情况并非如此,则会触发异常。
此外,根据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。