如何在 PL/SQL 块 (IF/THEN) 中执行“插入...选择...
Posted
技术标签:
【中文标题】如何在 PL/SQL 块 (IF/THEN) 中执行“插入...选择...【英文标题】:How to do "Insert into... Select... in a PL/SQL block (IF/THEN) 【发布时间】:2014-10-23 15:25:04 【问题描述】:我正在尝试在 PL/SQL Developer 中运行以下脚本,但我收到一条错误消息,提示“V_INSERT”不是过程或未定义,并且该语句被忽略。
有人可以帮忙吗?谢谢!
DECLARE chktime date; v_trunc varchar2(200); v_insert varchar2(200);
BEGIN
Select trunc(max(a.action_timestamp)) into chktime from hcr_dm.hcr_dm_fact a;
If chktime <> trunc(sysdate) then
v_trunc:='truncate table yxg3509.account_crosswalk_hcrdm';
execute immediate v_trunc;
Else
v_trunc:='truncate table yxg3509.product_to_ah_092514';
v_insert:='insert into yxg3509.product_to_ah_092514
select prod.oracle_prod_code,
prod.oracle_prod_description,
prod.ah_code,
prod.effective_date
from hcr_sandbox.product_to_ah prod';
execute immediate v_trunc; v_insert;
END IF;
END;
【问题讨论】:
立即执行 v_trunc; v_插入;一条 exec 语句是否正确? 这是问题所在:立即执行 v_trunc; v_insert; 该;是第一个问题 第二个是你需要分开2个执行 ps:这种情况下不需要动态插入 【参考方案1】:您需要使用两个 EXECUTE IMMEDIATE
语句来执行此操作:
DECLARE
chktime date;
v_trunc varchar2(2000);
v_insert varchar2(2000);
BEGIN
Select trunc(max(a.action_timestamp)) into chktime from hcr_dm.hcr_dm_fact a;
If chktime <> trunc(sysdate) then
v_trunc:='truncate table yxg3509.account_crosswalk_hcrdm';
execute immediate v_trunc;
Else
v_trunc:='truncate table yxg3509.product_to_ah_092514';
v_insert:='insert into yxg3509.product_to_ah_092514
select prod.oracle_prod_code,
prod.oracle_prod_description,
prod.ah_code,
prod.effective_date
from hcr_sandbox.product_to_ah prod';
execute immediate v_trunc;
execute immediate v_insert;
END IF;
END;
尽管 IMO 没有理由对 INSERT 语句使用 EXECUTE IMMEDIATE,我也看不出将 TRUNCATE TABLE 语句放入变量的充分理由,因此您可能会更好:
DECLARE
chktime date;
BEGIN
Select trunc(max(a.action_timestamp))
into chktime
from hcr_dm.hcr_dm_fact a;
If chktime <> trunc(sysdate) then
execute immediate 'truncate table yxg3509.account_crosswalk_hcrdm';
Else
execute immediate 'truncate table yxg3509.product_to_ah_092514';
insert into yxg3509.product_to_ah_092514
select prod.oracle_prod_code,
prod.oracle_prod_description,
prod.ah_code,
prod.effective_date
from hcr_sandbox.product_to_ah prod;
END IF;
END;
分享和享受。
【讨论】:
我根据你的修改了我的脚本。虽然没有错误消息,但它没有将记录插入到表中。只执行了 truncate 语句...我尝试了两个示例,结果相同。如果作为独立脚本执行,我还验证了插入语句是正确的。知道为什么会这样吗?谢谢! 尝试调试,从该块创建一个临时过程,然后逐步查看发生了什么。 @gcbm1984 - 你提交过更改吗? 不,这就是问题所在!以上是关于如何在 PL/SQL 块 (IF/THEN) 中执行“插入...选择...的主要内容,如果未能解决你的问题,请参考以下文章