3

我使用了相同的代码,但不是运行选项 1 和 2 中的脚本,而是脚本要求这个

这是我使用的链接:How to make a menu in SQLPlus or PL/SQL?

    PROMPT  1: Make a sales invoice 
    PROMPT  2: Inquire a sales invoice    
    accept selection PROMPT "Enter option 1-2: "

    set term off
    column script new_value v_script  --Q1. What's column script?
    select case '&selection.'          --from accept above
    when '1' then '@test1.sql'  --script to run when chosen option 1.
    when '2' then '@test2.sql'  --script to run when chosen option 2.
    else '@FinalAssignment.sql' --this script
    end as script  --Q2. What script is this referring to? 
    from dual; --Q3. Don't know this

    set term on

    @&v_script. --Q4. What script is being ran here?

这是我得到的输出

    SQL> @myScript
    1: Make a sales invoice
    2: Inquire a sales invoice
    Enter option 1-2: 1
    Enter value for v_script: 1
    SP2-0310: unable to open file "1.sql"

我的脚本文件的名称是“myScript”,所以我认为如果输入了无效选项,菜单应该自行重新加载。但是由于某种原因它没有这样做..

我不明白这一点,而且即使执行一个脚本,我也希望代码循环运行,它应该返回菜单并要求另一个选择。如果再次输入无效选项,它应该返回菜单供用户选择另一个选项。

我的包含循环的代码在这里:

    PROMPT  1: Make a sales invoice 
    PROMPT  2: Inquire a sales invoice    
    accept selection PROMPT "Enter option 1-2: "

    set term off
    LOOP
    column script new_value v_script  --Q1. What's column script?
    select case '&selection'          --from accept above
    when '1' then @test1.sql --script to run when chosen option 1.
    when '2' then @test2.sql  --script to run when chosen option 2.
    when '3' then @test3.sql
    EXIT WHEN &selection = 4;
    else '@myScript.sql' --this script
    end as script  --Q2. What script is this referring to? 
    from dual; --Q3. Don't know this
    END LOOP;
    set term on

    @&v_script. --Q4. What script is being ran here?
4

1 回答 1

0

以下作品:

PROMPT  1: Make a sales invoice 
PROMPT  2: Inquire a sales invoice    
accept selection PROMPT "Enter option 1-2: "

column script new_value v_script
select case '&selection'
when '1' then '@test1.sql'
when '2' then '@test2.sql'
else '@FinalAssignment.sql'
end as script
from dual;

prompt '&v_script'

@&v_script

您在代码中的注释导致问题(不知道您的脚本版本中是否有它们)

它所做的是提示输入一个值并将其粘贴在一个名为“selection”的变量中。然后它从对偶中进行选择并调用返回的列“脚本” - 前一个“列”命令正在寻找具有此名称的列,当它看到一个时,它会创建一个名为“v_script”的新变量并将值从将“脚本”列放入其中。(例如“@test1.sql”)

最后,这个变量被用作要调用的脚本的名称。

在 sqlplus 中创建循环很棘手,而且可能不是一件明智的事情。

通过您正在尝试的机制再次调用您的脚本也将遇到 sqlplus 的调用深度(大约 20 个脚本,IIRC) - 虽然不知道在以后的版本中是否已删除/增加。

请注意,“@”表示“在 sqlpath 中运行具有给定名称的脚本 - 在所选结果中添加另一个“@”会将其变为“@@”,这意味着“在当前目录中运行脚本”。

于 2013-05-23T12:29:58.080 回答