如何在SQL * Plus ACCEPT命令中使用绑定变量值作为提示

时间:2016-03-17 09:02:56

标签: oracle sqlplus

我想在SQL * Plus脚本中使用绑定变量值作为输入提示。这是我尝试过的:

1)我定义了绑定变量如下

SQL>var prompt varchar2(100)

2)并使用PL / SQL

分配值
SQL>exec select 'your name' into :prompt from dual

3)现在我可以按如下方式打印或选择绑定变量值:

SQL>select :prompt from dual;

:PROMPT
------------------------------------
your name


SQL>print prompt

PROMPT
------------------------------------
your name

4)现在我想将“你的名字”显示为ACCEPT提示,但我不知道如何实现:

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运行它但这看起来像一个可怕的黑客

2 个答案:

答案 0 :(得分:1)

您可以将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等。(除了print,这是一个客户端命令但是为此目的存在。)

当然,如果你这样做,那么你真的不需要绑定变量,你可以直接用以下方式完成:

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)

答案 1 :(得分:1)

如上所述使用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