Oracle PL SQL 中的 ACCEPT 语句

Posted

技术标签:

【中文标题】Oracle PL SQL 中的 ACCEPT 语句【英文标题】:ACCEPT statement in Oracle PL SQL 【发布时间】:2016-02-16 19:50:37 【问题描述】:

我是 PL SQL 的初学者。

我正在尝试使用 PL SQL ACCEPT 语句接受变量中的字符串。 这是代码 -

ACCEPT lastname CHAR FORMAT 'A20' PROMPT 'Enter employee lastname:  '
DECLARE
BEGIN

DBMS_OUTPUT.PUT_LINE(lastname);  
END;

我在 SQL Developer 中没有收到任何错误或输出。我无法理解我在这里缺少什么。

基本上,我要做的是从用户那里读取一个值(字符串),然后在我对表的查询中使用它。

【问题讨论】:

您一定遇到了无效标识符错误... 不。没有任何错误。 【参考方案1】:

ACCEPT 是 SQL*Plus and SQL Developer client command,而不是 PL/SQL 命令。您正在设置一个替换变量,您可以在匿名块中 use 使用:

ACCEPT lastname CHAR FORMAT 'A20' PROMPT 'Enter employee lastname:  '

SET serveroutput on;

BEGIN
  DBMS_OUTPUT.PUT_LINE('&lastname');  
END;
/

在 SQL 中使用它会更常见:

select '&lastname' from dual;

PL/SQL 不是为交互使用而设计的,但不清楚您将真正做什么。


SQL Developer(至少是 4.1.3 版)似乎无法像处理 SQL*Plus 一样处理 format,这可能是一个错误。如果您按照问题所示使用 ACCEPT 并且上面的代码没有提示或脚本输出;日志窗格显示来自 Accept.java:341 的“严重”消息。如果您还提供默认值,它确实有效:

ACCEPT lastname CHAR FORMAT 'A20' DEFAULT 'dummy' PROMPT 'Enter employee lastname:  '

提示对话框中不显示默认值,如果您只是确定对话框,您的替换变量将包含该默认值 - 这是“如果未给出回复”的预期行为。如果您不想要默认值,那么您会有点卡住 - 指定 null 默认值(使用 '')也会收到同样严重的消息,这可能是相关的。

【讨论】:

为什么我在 SQL Developer 中执行上述代码时什么都看不到?我想要做的是在一个变量中捕获用户的输入,然后在我的 SQL 语句的 where 子句中使用。 我不知道。您是作为脚本运行还是作为语句运行?您需要为此编写脚本。您确定您有活动连接吗? 尝试将其作为脚本和语句运行。 Oracle SQL Developer 只是说“任务​​在 ... 秒内完成”,但没有任何反应。我很确定我有一个活跃的连接。刚刚编辑了上面的问题。 (最后一行) 我尝试删除 FORMAT 'A20' 并成功运行。谢谢。 有趣,这是 SQL*Plus(允许格式)和 SQL Developer 之间的行为差​​异;奇怪的是它完全停止响应 - 怀疑这是一个错误而不是故意的。日志记录页面显示了对 validateDefaultAndFormat(Accept.java:341) 的引用。奇怪的是,如果您还提供默认值,它确实有效。

以上是关于Oracle PL SQL 中的 ACCEPT 语句的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL ACCEPT 命令返回无效标识符?

PL/SQL开发中动态SQL的使用方法

Java 存储过程是不是比 Oracle 中的 PL/SQL 慢?

oracle 的 PL/SQL 中的 & 和 : 有啥区别?

PL/SQL:ORACLE 中的感叹号

Oracle:使用 SQL 或 PL/SQL 查找动态 SQL 中的错误位置