【问题标题】:SQL plus loop in .sql script.sql 脚本中的 SQL 加循环
【发布时间】:2018-01-11 00:44:47
【问题描述】:

我是编写 SQL plus 脚本的新手,但遇到了一个问题。我想为我的 PL/SQL 实用程序编写安装脚本,它会询问用户一些问题(通过 ACCEPT 命令),然后列出将要做什么(通过 PROMPT)并要求确认(再次通过 ACCEPT)。这部分没问题,但我有问题,如果他接受,我需要运行一些 PL/SQL 脚本,或者如果他拒绝,我需要再次问他所有问题。在 SQL 中加上任何选项如何进行交互式循环,该循环根据变量内容决定是继续运行 PL/SQL 脚本还是循环回到循环的开头?

在伪代码中我想要这样的东西:

 while ('&confirmation' != 'y'){
    /*ask some questions*/
    ACCEPT info_1 CHAR PROMPT 'text_1';
    ACCEPT info_2 CHAR PROMPT 'text_2';
    ...
    /*write some summary*/
    PROMPT 'text_2';
    /*ask for confirmation */
    ACCEPT confirmation CHAR PROMPT 'are these information correct? (y/n)';
 }
 @skript

谢谢

【问题讨论】:

    标签: oracle sqlplus


    【解决方案1】:

    input.sql

    accept username char prompt "username: "
    accept password char prompt "password: "
    
    prompt
    prompt &username
    prompt &password
    prompt
    prompt
    
    accept confirm char prompt "correct? (y|n): "
    
    column col noprint new_value runscript
    select
      decode(lower('&confirm'),
        'y', 'task.sql',
        'n', 'input.sql') col
    from dual;
    
    prompt &runscript
    @&runscript
    

    task.sql

    prompt run my tasks with &username and &password in place
    

    测试

    me@XE> @input
    username: a
    password: b
    
    a
    b
    
    correct? (y|n): y
    old   2:   decode(lower('&confirm'),
    new   2:   decode(lower('y'),
    
    task.sql
    run my tasks with a and b in place
    me@XE> @input
    username: a
    password: b
    
    a
    b
    
    
    correct? (y|n): n
    old   2:   decode(lower('&confirm'),
    new   2:   decode(lower('n'),
    
    input.sql
    username: etc...
    

    【讨论】:

    • 谢谢,这很好,但是如果我在“循环”之后有更多任务(例如创建日志文件或执行另一个提示),如果我这样做,是否意味着如果用户在第一次尝试时没有确认,最后一部分将被执行多个?
    猜你喜欢
    • 2016-01-30
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 2018-12-31
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多