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

Stored procedures 如何在数据库的表中执行dmls?,stored-procedures,plsql,Stored Procedures,Plsql,我在oracle数据库的temp_表中有100个DML。该表中有3列,分别为序号、DMLS和状态。表如下所示。 序号,dmls,状态 1,插入到……,空 2,更新表…,空 100,删除表…,空 我希望基于seqno逐行读取表,并在数据库的该行中执行dml。成功执行后,此表中的status列应更新为FINISHED。如果DML无法执行,它应该更新为FAILED并停止,而不处理下一行。我写了下面的过程,但它没有做必要的。谁能告诉我我在这里错过了什么 CREATE or REPLACE PROCE

我在oracle数据库的temp_表中有100个DML。该表中有3列,分别为序号、DMLS和状态。表如下所示。 序号,dmls,状态

1,插入到……,空

2,更新表…,空

100,删除表…,空

我希望基于seqno逐行读取表,并在数据库的该行中执行dml。成功执行后,此表中的status列应更新为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;
2个问题

1它必须为空状态 2立即执行“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;
/

非常感谢你的答复,先生。我做了些改变,它成功了。但是,当我运行该过程时,语句失败,因为表更新为status=failure。我将同一条语句从DMLS_TBL表复制并粘贴到编辑器中,它成功地执行了。我检查了insert语句中的语法错误,但没有找到任何错误。不确定我遗漏了什么。该语句终于有分号了?@Sean Add DBMS_OUTPUT.PUT_LINEI.DMLS | | |错误:'| | SQLERRM;到内部异常块,这将显示它失败的原因!