Oracle PLSQL:两个不同数据库的不同行为

mmo*_*mmo 0 oracle plsql

我自己写了一个小的 PL/SQL 实用程序。对一个数据库(我的 Windows 10 笔记本电脑上的 Oracle XE 安装)执行它(使用 SQL-Developer)它工作得很好,但是对另一个数据库(也是 Oracle XE,但在 Linux 服务器上)执行它我收到编译错误我的剧本!?!?怎么可能?

我得到的错误是:

ORA-06550: line 17, column 35:
PLS-00491: numeric literal required
ORA-06550: line 18, column 35:
PLS-00491: numeric literal required
ORA-06550: line 19, column 35:
PLS-00491: numeric literal required
ORA-06550: line 20, column 35:
PLS-00491: numeric literal required
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
Run Code Online (Sandbox Code Playgroud)

引用的位置在我的脚本开头的本节中:

DECLARE
    -- limits and boundaries    
    MAX_NAME_LENGTH         CONSTANT NUMBER(3)          := 30; -- for table and column names
    MAX_VALUE_LENGTH        CONSTANT NUMBER(5)          := 10000; -- for column values

    -- our starting point:
    m_owner                 VARCHAR2(MAX_VALUE_LENGTH)  := 'C##TEST';
    m_start_table_name      VARCHAR2(MAX_NAME_LENGTH)   := 'XML_MELDUNG_QUEUE'; 
    m_start_column_name     VARCHAR2(MAX_NAME_LENGTH)   := 'XML_MELDUNG_ID'; 
    m_start_value           VARCHAR2(MAX_VALUE_LENGTH)  := '5647'; 
...
Run Code Online (Sandbox Code Playgroud)

确切的位置原来是常量的用法,即“...(MAX_....)”子句。

似乎在第二个系统上,常量定义和这些常量在进一步声明中的使用与定位我的本地数据库时的工作方式不同。

我完全不解!这里有什么问题?为什么这样的 PL/SQL 声明在使用一个 Oracle XE DB 时会起作用,而在使用另一个时不起作用?我的意思是:我会理解,如果找不到某个实体,但是根据所使用的数据库编译错误(或不编译)???

任何想法或指针?

Chr*_*xon 5

使用常量声明可变长度是 Oracle 数据库 12.2 中添加的一个特性。

所以我怀疑你本地安装的XE是18c。另一个是11.2。

您可以通过运行来验证这一点:

select * from v$version;
Run Code Online (Sandbox Code Playgroud)