我正在尝试编写一个包含几块SQL代码的Oracle过程。在两个块之间,我想在LOG_TBL
中插入一个递增的步骤号和SYSTIMESTAMP
。
但实际上发生的是,V_STEP_NUM
只计算一次,也就是我给V_INSERT_LOG_SQL
赋值的时候。因此,我只得到一堆STEP_NUMBER
或0
的行。
但是,如果我用显式SQL替换EXECUTE IMMEDIATE V_INSERT_LOG_SQL;
:
EXECUTE IMMEDIATE
'INSERT INTO LOG_TBL (STEP_NUMBER,BEGIN_TIME) VALUES
('||V_STEP_NUM||',SYSTIMESTAMP)'
则它如预期的那样工作,具有递增的步骤编号。
我做错了什么?
CREATE OR REPLACE PROCEDURE my_procedure
IS
V_STEP_NUM NUMBER(2);
V_INSERT_LOG_SQL CLOB;
BEGIN
V_STEP_NUM := 0;
V_INSERT_LOG_SQL := 'INSERT INTO LOG_TBL (STEP_NUMBER,BEGIN_TIME) VALUES ('||V_STEP_NUM||',SYSTIMESTAMP)';
BEGIN
V_STEP_NUM:= V_STEP_NUM + 1;
END;
BEGIN
EXECUTE IMMEDIATE V_INSERT_LOG_SQL;
COMMIT;
[SOME MORE SQL CODE]
BEGIN
V_STEP_NUM:= V_STEP_NUM + 1;
END;
BEGIN
EXECUTE IMMEDIATE V_INSERT_LOG_SQL;
COMMIT;
END;
[SOME MORE SQL CODE]
END;
1条答案
按热度按时间j2cgzkjk1#
在开始时将
V_INSERT_LOG_SQL
定义为然后就再也不改了要每次传递一个新的值,可以每次构造一个新的字符串来捕获
V_INSERT_LOG_SQL
的当前值,或者(对SQL缓存更好),将其作为绑定变量传递:但是,除非有比这里显示的更多的需求,否则您根本不需要动态SQL:
或者更好的是,使用单独的过程进行日志记录: