Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/pandas/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Plsql 在DML发生后提示用户,然后执行DDL的设计模式?_Plsql_Sqlplus - Fatal编程技术网

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

Plsql 在DML发生后提示用户,然后执行DDL的设计模式?,plsql,sqlplus,Plsql,Sqlplus,我正在尝试编写一个PLSQL脚本,我可以从SQLPlus运行该脚本,通常执行以下操作: 在几个表上执行一些DML操作 提示用户确认步骤1中采取的操作 确认后,执行提交和一系列DDL操作,否则回滚 理想情况下,我希望减少用户所需的手动输入,理想情况下让脚本完成所有工作(包括在用户指定时提交/回滚,以及在发生错误时回滚) 我尝试了以下方法: 将DML和DDL分离到各自的PLSQL块中 问题: 如果DML块中存在错误,DDL块仍将执行 无法处理我在SQLPlus接口上清晰地提出的自定义错误(即,它只

我正在尝试编写一个PLSQL脚本,我可以从SQLPlus运行该脚本,通常执行以下操作:

  • 在几个表上执行一些DML操作
  • 提示用户确认步骤1中采取的操作
  • 确认后,执行提交和一系列DDL操作,否则回滚
  • 理想情况下,我希望减少用户所需的手动输入,理想情况下让脚本完成所有工作(包括在用户指定时提交/回滚,以及在发生错误时回滚)

    我尝试了以下方法:

  • 将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.
    

    可能您可以保留两个块结构,但是如果第一个块没有设置某个主变量,则第二个块什么也不做。我不确定您在SQL*Plus中引发的这些自定义错误是什么,但是.PLSQL/SQL*Plus不擅长模拟用户界面程序,您应该更喜欢任何其他语言来更好地控制此类操作。嘿,William,我所说的“干净”是指我想捕捉错误并显示自定义消息,而不是繁琐的ORA错误消息块。如何从一个单独的匿名块中引用另一个匿名块中的变量?您可以使用异常处理程序包装一个PL/SQL块,在该异常处理程序中,您可以使用raise_application_error将丑陋的ORA错误消息转换为您自己的错误消息(可能不那么丑陋);但我同意Kaushik的观点,这项任务可能并不适合像SQL*Plus这样的命令行工具。