我使用了相同的代码,但是脚本没有在选项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?
答案 0 :(得分: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”的变量中。然后它从dual执行select并调用返回的列“script” - 前一个“column”命令正在查找具有此名称的列,当它看到一个时,它会创建一个名为“v_script”的新变量并放入来自将“脚本”列放入其中。 (例如“@ test1.sql”)
最后,此变量将用作要调用的脚本的名称。
在sqlplus中创建循环很棘手,可能不是一件明智的事情。
通过您正在尝试的机制再次调用脚本也会遇到sqlplus的调用深度(大约20个脚本,IIRC) - 不知道是否在以后的版本中删除/增加了它。
请注意,“@”表示“在sqlpath中运行具有给定名称的脚本 - 在所选结果中添加另一个”@“将其转换为”@@“,这意味着”在当前目录中运行脚本“。