Stored procedures 如何在数据库的表中执行dmls?
我在oracle数据库的temp_表中有100个DML。该表中有3列,分别为序号、DMLS和状态。表如下所示。 序号,dmls,状态 1,插入到……,空 2,更新表…,空 100,删除表…,空 我希望基于seqno逐行读取表,并在数据库的该行中执行dml。成功执行后,此表中的status列应更新为FINISHED。如果DML无法执行,它应该更新为FAILED并停止,而不处理下一行。我写了下面的过程,但它没有做必要的。谁能告诉我我在这里错过了什么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
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;到内部异常块,这将显示它失败的原因!