oracle - SQLPLUS 对象系统。是无效的

标签 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) 永远不要在 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;

在现实世界中,您应该只在您想要操作数据库状态时使用过程(即,您正在执行 INSERTUPDATEDELETEMERGE 等)。当您想要在不更改数据库状态的情况下执行计算或想要操作传入参数的数据时,您可以使用函数。

关于oracle - SQLPLUS 对象系统。是无效的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22287752/

相关文章:

sql - 基本问题 : basic PL/SQL console output?

python - TypeError : calculations() missing 1 required positional argument: 'entries'

oracle - “xmlparserv2”(v12.2.0.1)中的 “com.oracle.jdbc:ojdbc8”突然损坏了吗?

Oracle 时间戳、最大值和最小值

sql - Oracle PL/SQL CASE 语句可以包含 SELECT 查询吗?

sql - PL/SQL 触发器问题

error-handling - 除以零是否被视为错误或故障?

python - Python 2 :Simple Program

sql - 如果 FK 出现不止一次,如何对表格中的项目求和?

oracle - Oracle中SQL Server APPLY的等效项是什么?