如何在数据库的表中执行dmls?

时间:2014-11-11 15:27:29

标签: stored-procedures plsql

我在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;

1 个答案:

答案 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;
/