SQLPLUS对象系统。是无效的

时间:2014-03-09 20:31:09

标签: oracle plsql syntax-error

我坚持一些简单的程序,我无法弄清楚原因。 这是我的代码,我在sqlplus中运行:

CREATE OR REPLACE PROCEDURE NormalizeName(fullname IN NVARCHAR2)
IS
BEGIN
    SELECT TRIM(fullname) INTO fullname FROM DUAL;
    DBMS_OUTPUT.PUT_LINE(fullname);
END NormalizeName;
/

BEGIN
    NormalizeName('Alice Wonderland   ');
END;
/

当我运行它时,我收到错误:

Warning: Procedure created with compilation errors.

        NormalizeName('Alice Wonderland   ');
        *
ERROR at line 2:
ORA-06550: line 2, column 2:
PLS-00905: object SYSTEM.NORMALIZENAME is invalid
ORA-06550: line 2, column 2:
PL/SQL: Statement ignored

出了什么问题?

1 个答案:

答案 0 :(得分:2)

1)永远不要在SYSSYSTEM架构中创建对象。这些是为Oracle保留的。如果要创建对象,请先创建新模式。

2)当您在SQL * Plus中看到创建了包含编译错误的过程时,请键入show errors以查看错误。

3)错误似乎是您的SELECT语句正在尝试写入fullname参数。但该参数定义为IN参数,而不是IN OUT,因此它是只读的。但是,如果将参数定义为IN OUT,则无法将字符串常量传递给过程,则需要在调用块中定义局部变量。除了调用dbms_output之外,没有任何其他操作的过程没有多大意义,因为不能保证任何人都会看到写入该缓冲区的数据。我的猜测是你真的想要一个返回标准化名称的函数。像

这样的东西
CREATE OR REPLACE FUNCTION NormalizeName( p_full_name IN VARCHAR2 )
  RETURN VARCHAR2
IS
BEGIN
  RETURN TRIM( p_full_name );
END;

然后你可以打电话

DECLARE
  l_normalized_name VARCHAR2(100);
BEGIN
  l_normalized_name := NormalizeName( 'Alice Wonderland     ' );
  dbms_output.put_line( l_normalized_name );
END;

如果你真的需要一个程序,因为这是一个家庭作业

CREATE OR REPLACE PROCEDURE NormalizeName( p_fullname IN VARCHAR2 )
AS
BEGIN
  dbms_output.put_line( TRIM( p_fullname ));
END;

在现实世界中,您只应在想要操纵数据库状态时使用过程(即您正在执行INSERTUPDATEDELETE,{{ 1}}等。如果要在不更改数据库状态的情况下执行计算,或者想要操作参数中传递的数据,则可以使用函数。