Oracle PLSQL:如何根据每个值使用替换变量?

Posted

技术标签:

【中文标题】Oracle PLSQL:如何根据每个值使用替换变量?【英文标题】:Oracle PLSQL : How to use substitution variable based on each value? 【发布时间】:2018-02-16 06:25:46 【问题描述】:
Declare
  v_test varchar2(30) := 'enter value for A';
  v_temp;
Begin
  v_temp := &v_test;
  dbms_output.put_line('v_temp :='||v_temp);
end;

在执行上面的 PLSQL 块时,对于替换变量 &v_test,而不是提示输入 v_test 的值,它应该提示 v_test 中的值。 即它应该提示“输入 A 的值”。 所以每次如果我改变 v_test 的值,那么这个值应该会提示。

有什么解决办法吗?

【问题讨论】:

【参考方案1】:

PL/SQL 不是一种交互式语言,它用于编写 API 而不是 UI。同样,SQL*Plus 也没有配备 IF 或 ELSE 等控制字,它不是一种编程语言。

如果您需要更智能的 UI 来启动您的代码,您应该使用 UI 编程工具。当您使用 SQL*Plus 时,您的用户可以访问操作系统,因此 shell 脚本或.bat 文件似乎是最佳选择。另外,we can run web pages straight out of the database 可能有点过度设计,这取决于您的要求可能有多复杂。

如果这些建议都没有吸引力,您可以尝试更详细的 SQL*Plus 提示:

ACCEPT v_test CHAR FORMAT 'A30' 
PROMPT 'Enter the test you want to run: A , B or C :'       
ACCEPT v_deptno NUMBER FORMAT '99' 
PROMPT 'If you chose A please enter DEPT NO or skip:'       
ACCEPT v_mgr CHAR FORMAT 'A30'
PROMPT 'If you chose B please enter MGR NAME or skip:'       
ACCEPT v_stdt DATE FORMAT 'YYYY-MM-DD'
PROMPT 'If you chose C enter START DATE (YYYY-MM-DD) or skip:'       
ACCEPT v_endt DATE FORMAT 'YYYY-MM-DD'
PROMPT 'If you chose C enter END DATE (YYYY-MM-DD) or skip:'       

现在您可以将这些变量传递给一个匿名块,该块确实具有确定已呈现哪些值并采取适当操作所需的 IF 和 ELSE 控制字。

我同意它笨拙且不太宽容,因此用户会讨厌它;但正如我所说,这不是这些工具真正应该做的。无论如何,find out more。

【讨论】:

【参考方案2】:

你可以这样使用:

Declare 
  v_temp  varchar2(30);
Begin
  v_temp := &enter_value_for_A;
  dbms_output.put_line('v_temp :='||v_temp);
end;

【讨论】:

【参考方案3】:

你可以像这样修改你的代码,

Declare
    v_temp varchar2(30) := &B;
Begin
   dbms_output.put_line('v_temp :='||v_temp);
end;
/

Declare
    v_temp varchar2(30) := &A;
Begin
   dbms_output.put_line('v_temp :='||v_temp);
end;
/

【讨论】:

以上是关于Oracle PLSQL:如何根据每个值使用替换变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何调用Oracle plsql中另一个存储函数返回名称的存储函数?

Oracle PlSql 问题集锦 - replace 隐式转换的探索

Oracle PlSql 问题集锦 - replace 隐式转换的探索

plsql updatexml-无法根据属性更新值

使用PLSQL Developer 连接远程oracle实例

使用PLSQL Developer 连接远程oracle实例