【问题标题】:PL/SQL: how do I prompt user input in a procedure?PL/SQL:如何在过程中提示用户输入?
【发布时间】:2015-12-09 15:29:12
【问题描述】:

这是关于我正在做的一个大型项目的一小部分的问题。我尝试了以下方法,但只得到下面的两个错误:

SET SERVEROUTPUT ON

CREATE OR REPLACE PROCEDURE HELLO AS
DECLARE
variable1 NUMBER(1);
variable2 CHAR(1);

BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World');
variable1 := &please_enter_1_or_0;
variable2 := &please_enter_y_or_n;
END;
/

错误(2,5):PLS-00103:预期时遇到符号“DECLARE” 下列之一:开始函数杂注过程子类型类型 当前的 光标删除存在先前的外部语言符号“开始”是 替换为“DECLARE”以继续。

错误(10,8):PLS-00103:遇到符号“文件结尾”时 期待以下之一:(开始案例声明结束异常 exit for goto if loop mod null pragma raise return select update 而与
插入打开的回滚保存点设置 sql 执行提交 forall 合并 管道清洗

我们获得了如何标记代码的标记方案,对于本节,相关标准是:

“脚本是否使用过程?”和

“脚本是否提示正确/错误和团队/个人并正确处理提供的数据?”。

项目简介引用“开发一个提示正确/错误的过程(使用 &),然后更新表”(其中 table 是表的名称)。

变量的目的是更新现有的记录属性。即如果用户选择 1 和 n 则将记录中的 null 更新为 2。如果是 1 和 y 则更新为 1,如果是 0 和 y/n 则更新为 0。

【问题讨论】:

  • PL/SQL 在 RDBMS 上运行时不处理用户交互,因此您应该首先以不同的方式获取参数,然后通过绑定将它们传递给过程或匿名块。用户交互必须由客户端或中间层架构处理。
  • 还有一件事 & 符号只被 SQL*Plus 接受,它预处理语句并在将具有替换值的代码发送到 RDBMS 之前进行所需的替换。请您的同事帮助您查找有关它的信息。服务器编程的这一面对于新手来说可能很难看。请注意,一旦 PL/SQL 块开始,就没有简单的交互方式,最好避免这样做。

标签: sql oracle plsql user-input procedure


【解决方案1】:

PL/SQL 是一种用于编写自主程序的语言。它不是为用户交互而设计的。输入值作为参数传递。 所以你的程序应该是这样的

CREATE OR REPLACE PROCEDURE hello
    ( p1 in number
    , p2 in varchar2 )
AS
    l_salutation varchar2(20) := 'Hello World';
BEGIN
    DBMS_OUTPUT.PUT_LINE(l_salutation);
    DBMS_OUTPUT.PUT_LINE('p1 = ' || p1);
    DBMS_OUTPUT.PUT_LINE('p2 = ' || p2);
END;
/

请注意,不需要使用命名过程进行 DECLARE。 AS 和 BEGIN 之间的部分用于声明变量,就像我对 l_salutation 所做的那样。

您可以在调用程序时为这些参数提供值。在 SQL*Plus 中,它的工作方式如下:

SET SERVEROUTPUT ON

accept p1 prompt "please enter 1 or 0: "
accept p2 prompt "please enter Y or N: "

exec HELLO (&p1, '&p2')

【讨论】:

  • 不知何故对我来说不起作用,我不得不在我的情况下使用exec HELLO (&p1, &p2),否则绑定会出现问题。
【解决方案2】:

这段代码只适用于SQL*Plus,不能用于生成存储过程!!!

DECLARE
variable1 NUMBER(1);
variable2 CHAR(1);

BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World');
variable1 := &please_enter_1_or_0;
variable2 := '&please_enter_y_or_n';
END;

注意最后一个语句中的区别,其中最后一个替换变量在字符串中被引用以被 PL/SQL 语法正确接受。无论如何,正如我在对您的问题的最后评论中告诉您的那样,这不是用户交互,而只是语句预处理的结果。每次输入不同的值时,RDBMS 都会执行不同的源代码。

您使用“程序”的要求可能并不意味着使用 STORED 程序(这是不可能的),但他们只是打算使用 SQL*Plus 脚本,要求澄清。

【讨论】:

  • 感谢您的评论。抱歉我的经验不足,我还在学习 PL/SQL。这可能是我误解的原因。我们获得了如何标记代码的标记方案,对于本节,相关标准将是:“脚本是否使用过程?”和“脚本是否提示正确/错误和团队/个人并正确处理提供的数据?”。项目简介引用“开发一个提示正确/错误的过程(使用&),然后更新表”(其中表是我拥有的表的名称)
【解决方案3】:

您不能在 PL/SQL 过程或包中直接从客户端接收消息。

您可以做的最好的模拟是与表数据交互,让用户将数据插入表并对此做出反应,或者使用高级队列(这几乎是相同的事情)。

或者,在调用过程时接受用户输入作为参数。

【讨论】:

  • 我不太确定该怎么做。我需要使用“程序”。您的建议虽然很好,但似乎超出了我的培训内容。重要的是,变量的目的是更新现有的记录属性。即如果用户选择 1 和 y 然后将记录中的 null 更新为 2。如果它是 1 并且 n 则更新为 1,如果 0 和 y/n 则更新为 0
  • 你只是不能与用户交互来提示他们,但你可以接受参数作为过程调用的一部分,所以过程将被称为:hello(1,'Y')
【解决方案4】:

您可以删除声明以纠正该 or 错误

【讨论】:

  • 我删除了声明,并运行了脚本。我收到消息说它已编译但有错误:错误(9,5):PL/SQL:语句被忽略。错误(9,18):PLS-00201:必须声明标识符“Y”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多