我被一些简单的程序困住了,我不知道为什么。
这是我在 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
架构。这些是为 Oracle 保留的。如果要创建对象,请先创建一个新模式。
2) 当您看到在 SQL*Plus 中创建了一个带有编译错误的过程时,输入 show errors
查看错误。
3) 错误似乎是您的 SELECT
语句正在尝试写入 fullname
范围。但是该参数被定义为 IN
参数,而不是 IN OUT
, 所以它是只读的。如果将参数定义为 IN OUT
,但是,您不能将字符串常量传递给过程,您需要在调用 block 中定义一个局部变量。除了调用 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
、 MERGE
等)。当您想要在不更改数据库状态的情况下执行计算或想要操作传入参数的数据时,您可以使用函数。
关于oracle - SQLPLUS 对象系统。是无效的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22287752/