如何在 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