1

我创建了一个名为greet的过程:

create procedure greet(message in char(50))
as  
begin 
  dbms_output.put_line('Greet Message : ' || message);
end;

该过程编译成功,但是当我尝试将其称为:

execute greet('Hey ! This is a self created procedure :)');

我收到一个错误:

execute greet('Hey ! This is a self created procedure :)')
Error report:
ORA-06550: line 1, column 7:  
PLS-00905: object SUHAIL.GREET is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

这是什么错误?为什么我会得到它?

注意:“suhail”是连接到 oracle 服务器的当前用户的名称

4

2 回答 2

6

我不相信您的程序编译成功。当我尝试在我的系统上编译它时,出现语法错误

SQL> create procedure greet(message in char(50))
  2  as
  3  begin
  4    dbms_output.put_line('Greet Message : ' || message);
  5  end;
  6  /

Warning: Procedure created with compilation errors.

SQL> sho err
Errors for PROCEDURE GREET:

LINE/COL ERROR
-------- -----------------------------------------------------------------
1/32     PLS-00103: Encountered the symbol "(" when expecting one of the
         following:
         := ) , default varying character large
         The symbol ":=" was substituted for "(" to continue.

如果我解决了语法错误(您不能为输入参数指定长度),它可以工作

SQL> ed
Wrote file afiedt.buf

  1  create or replace procedure greet(message in char)
  2  as
  3  begin
  4    dbms_output.put_line('Greet Message : ' || message);
  5* end;
SQL> /

Procedure created.

SQL> set serveroutput on;
SQL> execute greet('Hey ! This is a self created procedure :)');
Greet Message : Hey ! This is a self created procedure :)

PL/SQL procedure successfully completed.

如果您真的希望将输入参数声明为CHAR. 几乎总是,您应该使用VARCHAR2字符串。遇到真正需要CHAR.

于 2013-03-13T09:20:43.130 回答
1

这是工作老兄;

create or replace
procedure greet(message in char)
as  
begin 
  dbms_output.put_line('Greet Message : ' || message);
end;

请参阅 char 数据类型的主要属性是输入数据的长度小于您指定的大小它将添加空格。varchar2 不会发生这种情况。

  1. 在上述过程中,违反了 char 属性,因此它几乎像 varchar2 一样对待。因此,如果您删除输入参数的大小,它将起作用并且字符支持最大输入长度。
于 2013-03-13T09:59:47.190 回答