如何调用plsql程序

时间:2013-05-06 19:35:49

标签: oracle plsql procedure

我创建了一个程序如下

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

这是我创建的确切步骤,参数正确。

我究竟如何申报标识符?

提前致谢。

2 个答案:

答案 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通常会自动将所有内容转换为大写,这就是为什么它也无效。