我创建了一个程序如下
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:语句被忽略“
这是我创建的确切步骤,参数正确。
我究竟如何申报标识符?
提前致谢。
答案 0 :(得分:8)
“必须声明标识符”错误的原因是区分大小写。
Oracle标识符通常会自动转换为全部大写,但是当您用双引号将它们括起来时,大小写将被保留。所以这个:
create or replace procedure "GETCUSTNAMEZZz"
创建一个具有确切名称“GETCUSTNAMEZZz”的过程,同时:
create or replace procedure GETCUSTNAMEZZz
会创建一个名为“GETCUSTNAMEZZZ”的程序(全部大写)。
调用程序时,您没有使用引号。所以它正在寻找不存在的“GETCUSTNAMEZZZ”,因为你创建它是“GETCUSTNAMEZZz”。
作为一项规则,我建议完全避免使用双引号,因为它们只是造成这种混淆而没有提供太多的好处。可悲的是,许多用于生成代码的工具都将它们粘贴在一起。
(请注意,这是关于标识符而不是字符串值。当您比较字符串值(例如'This is a String')和/或变量(例如VARCHAR2类型的变量)时,大小写总是很重要。)
答案 1 :(得分: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通常会自动将所有内容转换为大写,这就是为什么它也无效。