Oracle SQLPLUS对象系统。无效

Oracle SQLPLUS对象系统。无效,oracle,plsql,syntax-error,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('A

我被一些简单的程序卡住了,我不知道为什么。 这是我在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)切勿在
SYS
SYSTEM
架构中创建对象。这些是留给甲骨文的。如果要创建对象,请先创建一个新模式

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

3) 错误似乎是您的
SELECT
语句试图写入
fullname
参数。但是该参数被定义为
IN
参数,而不是
IN OUT
,因此它是只读的。但是,如果将参数定义为
IN-OUT
,则无法将字符串常量传递给过程,则需要在调用块中定义局部变量。除了调用
dbms\u 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;

在现实世界中,您应该只在希望操纵数据库状态时使用过程(即,您正在执行
插入
更新
删除
合并
,等等)。当您希望在不更改数据库状态的情况下执行计算,或者当您希望操作传入参数的数据时,可以使用函数。

我实际上需要的是一个过程而不是函数,这只是我课程的一些家庭作业。这就是为什么它如此简单,除了修剪和dbms之外没有做更多的事情。“show error”表示“expression‘FULLNAME’不能用作INTO目标”,这证实了问题在于FULLNAME是只读的,但是我不能将函数作为解决方案,因为我被要求编写一个过程。@Princeslilly-我已经用一个过程的示例更新了答案。在现实中,这不是你应该使用的程序。谢谢。我需要做的实际练习比这更复杂,但我现在能够理解代码中的错误。