我在oracle数据库的temp_table表中有100个DMLS。该表中有3列seq_no,DMLS,Status。该表如下所示。 的SeqNo,DMLS,状态
1,插入......,NULL
2,更新表.....,NULL
100,删除表...,NULL
我想基于seqno逐行读取表,并在数据库的该行中执行dml。成功执行后,此表中的状态列应更新为FINISHED。如果DML未能执行,则应更新为FAILED并在此处停止而不处理下一行。我写了下面的程序,但它没有做到需要。谁能告诉我这里缺少什么?
CREATE or REPLACE PROCEDURE DML_PROC is
CURSOR dml_cur is SELECT SEQ_NO,DMLS,STATUS FROM DMLS_TBL where STATUS=NULL order by SEQ_NO;
BEGIN
FOR I IN dml_cur
LOOP
EXECUTE IMMEDIATE 'I.DMLS';
UPDATE DMLS_TBL SET STATUS='SUCCESS'
WHERE SEQ_NO=I.SEQ_NO;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN NULL;
END DML_PROC;
答案 0 :(得分:0)
2个问题;
1)必须是STATUS IS NULL
2)EXECUTE IMMEDIATE 'I.DMLS'
..实际上是执行字符串'I.DMLS'
本身,而不是它的值。
更改的代码可能如下所示。我为每个要执行的DML添加了一个BEGIN块并捕获状态。
CREATE or REPLACE PROCEDURE DML_PROC is
CURSOR dml_cur is
SELECT SEQ_NO,DMLS,STATUS
FROM DMLS_TBL
where STATUS IS NULL
order by SEQ_NO;
V_STATUS VARCHAR2(10);
BEGIN
FOR I IN dml_cur
LOOP
V_STATUS := 'SUCCESS';
<<execute_ddl>>
BEGIN
EXECUTE IMMEDIATE I.DMLS;
EXCEPTION
WHEN OTHERS THEN
V_STATUS := 'FAILURE';
DBMS_OUTPUT.PUT_LINE(I.DMLS ||' Error : ' ||SQLERRM);
END execute_ddl;
UPDATE DMLS_TBL SET STATUS = V_STATUS
WHERE SEQ_NO = I.SEQ_NO;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
NULL;
END DML_PROC;
/