SQL Plus 无法使用 Accept 将参数传递给我的存储过程

Posted

技术标签:

【中文标题】SQL Plus 无法使用 Accept 将参数传递给我的存储过程【英文标题】:SQL Plus can't pass parameters to my stored procedure by using Accept 【发布时间】:2016-01-09 20:55:49 【问题描述】:

我遇到了一个问题,我无法将一些字符串从命令行传递到我的存储过程。我可以传递数字,但我不能传递 varchar 的..

accept nr1    char prompt 'Name: ';
accept nr2    char prompt 'Surname: ';
accept nr3    char prompt 'Username: ';
accept nr4    char prompt 'GroupCode: ';

execute CreateUsers('&nr1','&nr2','&nr3','&nr4');

我试过用这个

accept nr1   prompt 'Name: ';
accept nr2    prompt 'Surname: ';
accept nr3    prompt 'Username: ';
accept nr4    prompt 'GroupCode: ';

declare
    p_name varchar(30) := '&nr1',
    p_surname varchar(30) := '&nr2',
    p_Username varchar(30) := '&nr3',
    p_GroupCode varchar(30) := '&nr4';

begin
execute CreateUsers(p_name,p_surname,p_username,p_GroupCode);

end;
/

该存储过程具有varchar2 参数,它可以与类似的东西一起使用

execute CreateUsers ('anne','123','annie','DBA');

感谢您的帮助,谢谢!

编辑 1 添加错误信息。

编辑 2

编辑 3

【问题讨论】:

我看不出与处理在 SQL*Plus accept 语句中输入的参数有关的任何问题。屏幕截图中的错误是由于两件事:(a)您将错误数据传递给存储过程,以及(b)存储过程中的错误处理不足:它很可能正在执行 SELECT ... INTO ... 并且失败了处理查询没有返回数据的情况。最后,请不要在任何预定义模式中创建对象,例如 SYSTEM:而是创建一个单独的用户并使用它。 不是真的,我确实有错误处理,传递与图像中相同的参数 (1,2,3,4) 可以完成这项工作,而使用接受则不会。我确实上传了第二张图片,其中我使用了第二个代码摘录。从命令行传递的相同参数可以解决问题,因此必须有一些与如何接受相关的东西 第二个屏幕截图中的错误是抱怨DECLARE 块中变量声明后的逗号。 DECLARE 块中的每个变量声明都必须以分号结尾。用分号替换逗号。 用分号替换了逗号,部分解决了问题,我在执行 CreateUsers 区域仍然遇到问题,我认为我没有正确传递参数?还加了一张照片 删除EXECUTEEXECUTE 不是 PL/SQL 关键字:它是一个 SQL*Plus 快捷方式,它只是将行的其余部分包含在 BEGINEND; 中。查看您的第一个屏幕截图。 【参考方案1】:

正如 cmets 中所讨论的,问题出在这个 PL/SQL 块中:

declare
    p_name varchar(30) := '&nr1',
    p_surname varchar(30) := '&nr2',
    p_Username varchar(30) := '&nr3',
    p_GroupCode varchar(30) := '&nr4';

begin
execute CreateUsers(p_name,p_surname,p_username,p_GroupCode);

end;
/

块的declare 部分中的变量声明应以分号而不是逗号结尾,并且execute 不应在PL/SQL 块内使用。

该块应如下所示:

declare
    p_name varchar(30) := '&nr1';
    p_surname varchar(30) := '&nr2';
    p_Username varchar(30) := '&nr3';
    p_GroupCode varchar(30) := '&nr4';

begin
  CreateUsers(p_name,p_surname,p_username,p_GroupCode);

end;
/

【讨论】:

以上是关于SQL Plus 无法使用 Accept 将参数传递给我的存储过程的主要内容,如果未能解决你的问题,请参考以下文章

SQL*Plus 禁用或跳过 ACCEPT PROMPT

命令 ACCEPT sql plus

无法将多个参数传递给 SQL 语句到通配符 [重复]

Linq To NHibernate Plus sql 用户定义函数

如何将参数传递给 DbContext.Database.ExecuteSqlCommand 方法?

如何将 XML 数据作为参数传递给从 C# 到 Sql 服务器的 TVP 参数