DML发生后提示用户的设计模式,然后执行DDL?
Design Pattern for Prompting Users after DML occurs, then performing DDLs?
我正在尝试编写一个 PLSQL 脚本,我可以 运行 从 SQLPlus 中执行,一般来说,类似于以下内容:
- 对几个表执行一些 DML 操作。
- 提示用户确认在步骤 1 中采取的操作。
- 确认后,执行提交和一系列 DDL 操作,否则回滚。
理想情况下,我想减少用户所需的手动输入,理想情况下让脚本完成所有工作(包括用户指定时的commit/rollback和发生错误时回滚)。
我试过以下方法:
将 DML 和 DDL 分离到它们自己的 PLSQL 块中。
问题:
- 如果DML块中有错误,DDL块仍然执行。
- 无法处理我在 SQLPlus 界面上清楚地提出的自定义错误(即它只产生大的 ORA 错误消息,我更愿意捕获它并只显示自定义字符串消息)。
将单独的块包装在一个错误处理块中。
问题:
- 失去提示用户输入的能力。
我不可能是第一个想要在 DML 更改后根据用户输入执行 DDL 操作的人。是否存在尝试执行此操作序列的既定模式,或者这是语言无法做到的事情?
谢谢。
可能您应该寻找一种脚本语言来实现复杂的交互逻辑,但是在 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.
我正在尝试编写一个 PLSQL 脚本,我可以 运行 从 SQLPlus 中执行,一般来说,类似于以下内容:
- 对几个表执行一些 DML 操作。
- 提示用户确认在步骤 1 中采取的操作。
- 确认后,执行提交和一系列 DDL 操作,否则回滚。
理想情况下,我想减少用户所需的手动输入,理想情况下让脚本完成所有工作(包括用户指定时的commit/rollback和发生错误时回滚)。
我试过以下方法:
将 DML 和 DDL 分离到它们自己的 PLSQL 块中。
问题:
- 如果DML块中有错误,DDL块仍然执行。
- 无法处理我在 SQLPlus 界面上清楚地提出的自定义错误(即它只产生大的 ORA 错误消息,我更愿意捕获它并只显示自定义字符串消息)。
将单独的块包装在一个错误处理块中。
问题:
- 失去提示用户输入的能力。
我不可能是第一个想要在 DML 更改后根据用户输入执行 DDL 操作的人。是否存在尝试执行此操作序列的既定模式,或者这是语言无法做到的事情?
谢谢。
可能您应该寻找一种脚本语言来实现复杂的交互逻辑,但是在 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.