DML发生后提示用户的设计模式,然后执行DDL?

Design Pattern for Prompting Users after DML occurs, then performing DDLs?

我正在尝试编写一个 PLSQL 脚本,我可以 运行 从 SQLPlus 中执行,一般来说,类似于以下内容:

  1. 对几个表执行一些 DML 操作。
  2. 提示用户确认在步骤 1 中采取的操作。
  3. 确认后,执行提交和一系列 DDL 操作,否则回滚。

理想情况下,我想减少用户所需的手动输入,理想情况下让脚本完成所有工作(包括用户指定时的commit/rollback和发生错误时回滚)。

我试过以下方法:

  1. 将 DML 和 DDL 分离到它们自己的 PLSQL 块中。

    问题:

    • 如果DML块中有错误,DDL块仍然执行。
    • 无法处理我在 SQLPlus 界面上清楚地提出的自定义错误(即它只产生大的 ORA 错误消息,我更愿意捕获它并只显示自定义字符串消息)。
  2. 将单独的块包装在一个错误处理块中。

    问题:

    • 失去提示用户输入的能力。

我不可能是第一个想要在 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.