我坚持一些简单的程序,我无法弄清楚原因。 这是我的代码,我在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
出了什么问题?
答案 0 :(得分:2)
1)永远不要在SYS
或SYSTEM
架构中创建对象。这些是为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;
在现实世界中,您只应在想要操纵数据库状态时使用过程(即您正在执行INSERT
,UPDATE
,DELETE
,{{ 1}}等。如果要在不更改数据库状态的情况下执行计算,或者想要操作参数中传递的数据,则可以使用函数。