【问题标题】:how to call a plsql procedure如何调用plsql过程
【发布时间】:2013-04-30 15:08:23
【问题描述】:

我创建了一个程序如下

 create or replace procedure "GETCUSTNAMEZZz"
(cust_identifier1 IN NVARCHAR2(10))
is
begin
DBMS_OUTPUT.PUT_LINE (FNAME || ' ' || LNAME FROM customer WHERE  cust_id=cust_identifier1)
end;

然后我尝试调用该过程

BEGIN

GETCUSTNAMEZZz('C2')  ;  


END;

这个 sql 给我一个错误,标识符 'GETCUSTNAMEZZZ' 必须声明 ORA-06550:第 3 行,第 5 列:PL/SQL:语句被忽略"

这是我创建的确切过程,并且参数正确。

具体如何声明标识符?

提前致谢。

【问题讨论】:

  • 你应该可以如图所示调用它,但记得在执行前输入SET SERVEROUTPUT ON SIZE 1000(或任何大小)。问题是您的 proc 不存在,因为它没有编译。我看到了一些问题:(1)使用NVARCHAR2而不是NVARCHAR2(10)作为参数,(2)您必须先查询FNAMELNAME到变量中才能显示它们,(3)行以DBMS_OUTPUT.PUT_LINE 开头的代码末尾需要一个分号。如果您创建一个 proc 并获得“created with errors”,请输入“show errors”以查看错误。
  • 如果我正确设置了这个,即使 oracle 说创建了过程,它在调用时也可能无法编译??
  • 正确 - 如果创建时出现错误,Oracle 仍会让您尝试调用它;它将重新编译,但在您的情况下重新编译将失败。请参阅下面的@DaveCosta 答案。您的 proc 仍然存在问题,但您可以通过不使用双引号为自己省去很多麻烦——它们已经让您付出了代价。
  • ORA-00904: invalid identifier 的可能重复项
  • 如果您在创建数据库对象时使用双引号,并且您不小心使用了大小写混合,那么您注定要使用双引号和 完全相同的大小写随后引用该对象。没有引号,生活就轻松多了。

标签: oracle plsql procedure


【解决方案1】:

“标识符必须声明”错误的原因是区分大小写。

Oracle 标识符通常会自动转换为全部大写,但是当您将它们括在双引号中时,会保留大小写。所以这个:

create or replace procedure "GETCUSTNAMEZZz"

使用确切名称“GETCUSTNAMEZZz”创建一个过程,同时:

create or replace procedure GETCUSTNAMEZZz

将创建一个具有确切名称“GETCUSTNAMEZZZ”(全部大写)的过程。

调用过程时没有使用引号。所以它正在寻找不存在的“GETCUSTNAMEZZZ”,因为您将它创建为“GETCUSTNAMEZZz”。

作为一项规则,我建议完全避免使用双引号,因为它们只会造成这种混乱而没有提供太多好处。可悲的是,许多用于生成代码的工具都喜欢将它们粘贴到所有地方。

(请注意,这是关于标识符而不是字符串值。当您比较字符串值(例如“这是一个字符串”)和/或变量(例如 VARCHAR2 类型的变量)时,大小写始终很重要。)

【讨论】:

  • 这是漫长的一天。相信我,我再也不会靠近双引号了:)
【解决方案2】:

此过程将无法编译。所以你不能调用它。此外,您必须添加SET SERVEROUTPUT ON,否则您将看不到DBMS_OUTPUT.PUT_LINE

您将 SELECT 您想要显示的内容 INTO 另一个变量。如果你有多个结果,那么你可能仍然会失败。所以最好使用游标。

create or replace procedure GETCUSTNAMEZZz
(cust_identifier1 IN NVARCHAR2(10))
is
begin
  for c in (SELECT FNAME || ' ' || LNAME as flname FROM customer WHERE  cust_id=cust_identifier1) 
  loop 
    DBMS_OUTPUT.PUT_LINE (c.flname);
  end loop;
end getcustnamezzz;

然后你可以运行它

set serverouput on
BEGIN
  GETCUSTNAMEZZz('C2')  ;  
END;

编辑:值得一提的是,Dave Costa 指出引号实际上使过程名称区分大小写,但 Oracle 通常会自动将所有内容转换为大写,这就是它也不起作用的原因。

【讨论】:

  • 甲骨文 11g。创建程序绝对是一场噩梦。功能、触发器、连接等一切正常,但我已经在这里待了 6 个小时,试图让基本程序正常工作。 “第 5 行错误:PLS-00103:遇到符号“)”当预期以下之一时:. ( * @ % & - + ; / at mod remaining rem return 返回 and or | | multiset 0.08 seconds" 输入该代码时出现。
  • 认为您忘记了光标中的select 8-) 希望客户 ID 是唯一的,但如果它可能不是,那么光标可能很有用,无论如何也很高兴知道。另外参数不应该有(10),你不能像那样限制传递的字符串的大小。
  • 感谢一百万它确实有效!错误地认为 cust_identifier 必须具有与 cust_id 相同的类型 nvarchar2(10)。干杯。
猜你喜欢
  • 2015-03-09
  • 2013-05-18
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
相关资源
最近更新 更多