如何在 SQL*Plus ACCEPT 命令中使用绑定变量值作为提示符
How to use bind variable value as prompt in SQL*Plus ACCEPT command
我想在 SQL*Plus 脚本中使用绑定变量值作为输入提示。这是我尝试过的:
1) 我定义的绑定变量如下
SQL>var prompt varchar2(100)
2) 并使用 PL/SQL
赋值
SQL>exec select 'your name' into :prompt from dual
3) 现在我可以打印或 select 绑定变量值如下:
SQL>select :prompt from dual;
:PROMPT
------------------------------------
your name
SQL>print prompt
PROMPT
------------------------------------
your name
4) 现在我想让 "your name" 显示为接受提示,但我不知道如何实现:
SQL>accept input prompt 'prompt'
prompt
SQL>accept input prompt ':prompt'
:prompt
5) 我可以将绑定值分配回替换变量吗,可以这样做:
SQL>define prompt = 'your name subst'
SQL>accept input prompt '&prompt.>'
your name subst>Bob
SQL>def input
DEFINE INPUT = "Bob" (CHAR)
我认为可以做到这一点的唯一方法是将 SPOOLing 放入 temp.sql 文件中,然后 运行 使用 @temp.sql 但这似乎是一个可怕的 hack
您可以在查询中使用 the column ... new_value
syntax,但除非您是来自脚本的 运行(因此 set termout off
生效),否则您会得到额外的空白行:
SQL> var prompt varchar2(100)
SQL> exec select 'your name' into :prompt from dual
PL/SQL procedure successfully completed.
SQL> set feedback off
SQL> column o_prompt new_value n_prompt noprint
SQL> select :prompt as o_prompt from dual;
SQL> accept input prompt '&n_prompt.>'
your name>Bob
SQL> def input
DEFINE INPUT = "Bob" (CHAR)
我不认为有任何方法可以直接从绑定变量定义替换变量,或者在纯粹的客户端语句中使用绑定变量,如 define、accept 等(打印除外,它是一个客户端命令,但为此目的而存在)。
当然,如果你这样做,那么你真的不需要绑定变量,你可以更直接地做到这一点:
SQL> set feedback off
SQL> column o_prompt new_value n_prompt noprint
SQL> select 'your name' as o_prompt from dual;
SQL> accept input prompt '&n_prompt.>'
your name>Bob
SQL> def input
DEFINE INPUT = "Bob" (CHAR)
使用 COL .. NEW_VALUE 如前所述。
来自我对 SQL*Plus 变量的全面讨论 https://blogs.oracle.com/opal/entry/sqlplus_101_substitution_varia#3_2 :
SQL> variable mybv varchar2(14)
SQL> begin
2 /* ... */
3 :mybv := 'report.log';
4 end;
5 /
使用查询将绑定变量的值传递给新的替代变量"nv":
SQL> column mybvcol new_value nv noprint
SQL> select :mybv mybvcol from dual;
现在您可以在 SPOOL 命令中使用替换变量:
SQL> spool &nv
SPOOL 命令的执行就像您键入的一样
SQL> spool report.log
我想在 SQL*Plus 脚本中使用绑定变量值作为输入提示。这是我尝试过的:
1) 我定义的绑定变量如下
SQL>var prompt varchar2(100)
2) 并使用 PL/SQL
赋值SQL>exec select 'your name' into :prompt from dual
3) 现在我可以打印或 select 绑定变量值如下:
SQL>select :prompt from dual;
:PROMPT
------------------------------------
your name
SQL>print prompt
PROMPT
------------------------------------
your name
4) 现在我想让 "your name" 显示为接受提示,但我不知道如何实现:
SQL>accept input prompt 'prompt'
prompt
SQL>accept input prompt ':prompt'
:prompt
5) 我可以将绑定值分配回替换变量吗,可以这样做:
SQL>define prompt = 'your name subst'
SQL>accept input prompt '&prompt.>'
your name subst>Bob
SQL>def input
DEFINE INPUT = "Bob" (CHAR)
我认为可以做到这一点的唯一方法是将 SPOOLing 放入 temp.sql 文件中,然后 运行 使用 @temp.sql 但这似乎是一个可怕的 hack
您可以在查询中使用 the column ... new_value
syntax,但除非您是来自脚本的 运行(因此 set termout off
生效),否则您会得到额外的空白行:
SQL> var prompt varchar2(100)
SQL> exec select 'your name' into :prompt from dual
PL/SQL procedure successfully completed.
SQL> set feedback off
SQL> column o_prompt new_value n_prompt noprint
SQL> select :prompt as o_prompt from dual;
SQL> accept input prompt '&n_prompt.>'
your name>Bob
SQL> def input
DEFINE INPUT = "Bob" (CHAR)
我不认为有任何方法可以直接从绑定变量定义替换变量,或者在纯粹的客户端语句中使用绑定变量,如 define、accept 等(打印除外,它是一个客户端命令,但为此目的而存在)。
当然,如果你这样做,那么你真的不需要绑定变量,你可以更直接地做到这一点:
SQL> set feedback off
SQL> column o_prompt new_value n_prompt noprint
SQL> select 'your name' as o_prompt from dual;
SQL> accept input prompt '&n_prompt.>'
your name>Bob
SQL> def input
DEFINE INPUT = "Bob" (CHAR)
使用 COL .. NEW_VALUE 如前所述。
来自我对 SQL*Plus 变量的全面讨论 https://blogs.oracle.com/opal/entry/sqlplus_101_substitution_varia#3_2 :
SQL> variable mybv varchar2(14)
SQL> begin
2 /* ... */
3 :mybv := 'report.log';
4 end;
5 /
使用查询将绑定变量的值传递给新的替代变量"nv":
SQL> column mybvcol new_value nv noprint
SQL> select :mybv mybvcol from dual;
现在您可以在 SPOOL 命令中使用替换变量:
SQL> spool &nv
SPOOL 命令的执行就像您键入的一样
SQL> spool report.log