Plsql 在DML发生后提示用户,然后执行DDL的设计模式?
我正在尝试编写一个PLSQL脚本,我可以从SQLPlus运行该脚本,通常执行以下操作:Plsql 在DML发生后提示用户,然后执行DDL的设计模式?,plsql,sqlplus,Plsql,Sqlplus,我正在尝试编写一个PLSQL脚本,我可以从SQLPlus运行该脚本,通常执行以下操作: 在几个表上执行一些DML操作 提示用户确认步骤1中采取的操作 确认后,执行提交和一系列DDL操作,否则回滚 理想情况下,我希望减少用户所需的手动输入,理想情况下让脚本完成所有工作(包括在用户指定时提交/回滚,以及在发生错误时回滚) 我尝试了以下方法: 将DML和DDL分离到各自的PLSQL块中 问题: 如果DML块中存在错误,DDL块仍将执行 无法处理我在SQLPlus接口上清晰地提出的自定义错误(即,它只
- 如果DML块中存在错误,DDL块仍将执行
- 无法处理我在SQLPlus接口上清晰地提出的自定义错误(即,它只会生成一条大的ORA错误消息,我更希望捕获该错误并只显示一条自定义字符串消息)
- 失去提示用户输入的功能
谢谢。也许您应该使用脚本语言来实现复杂的交互逻辑,但在SQL*Plus中,在两个单独的块之间传递信息的一种方法是使用主机变量:
set serverout on size 10000
set autoprint off
set feedback off
var status number
begin
update sometable set somecolumn = 1
where whatever = somethingelse;
:status := 1;
end;
/
begin
if :status = 1 then
dbms_output.put_line('The update worked.');
else
dbms_output.put_line('Something went wrong.');
end if;
end;
/
输出:
update sometable set somecolumn = 1
*
ERROR at line 2:
ORA-06550: line 2, column 12:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 2, column 5:
PL/SQL: SQL Statement ignored
Something went wrong.
可能您可以保留两个块结构,但是如果第一个块没有设置某个主变量,则第二个块什么也不做。我不确定您在SQL*Plus中引发的这些自定义错误是什么,但是.PLSQL/SQL*Plus不擅长模拟用户界面程序,您应该更喜欢任何其他语言来更好地控制此类操作。嘿,William,我所说的“干净”是指我想捕捉错误并显示自定义消息,而不是繁琐的ORA错误消息块。如何从一个单独的匿名块中引用另一个匿名块中的变量?您可以使用异常处理程序包装一个PL/SQL块,在该异常处理程序中,您可以使用raise_application_error将丑陋的ORA错误消息转换为您自己的错误消息(可能不那么丑陋);但我同意Kaushik的观点,这项任务可能并不适合像SQL*Plus这样的命令行工具。