2

我创建了一个程序如下

 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:语句被忽略”

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

我究竟如何声明标识符?

提前致谢。

4

2 回答 2

8

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

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

create or replace procedure "GETCUSTNAMEZZz"

创建一个具有确切名称“GETCUSTNAMEZZz”的过程,而这个:

create or replace procedure GETCUSTNAMEZZz

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

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

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

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

于 2013-05-06T20:27:07.963 回答
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 通常会自动将所有内容转换为大写,这就是它也不起作用的原因。

于 2013-05-06T19:53:54.453 回答