我知道这方面最常见的问题是不同的名称或参数。除非我的眼睛真的很差,否则这里不是这样的:
CREATE OR REPLACE PACKAGE my_api IS
PROCEDURE sync_batch(x_return_status OUT VARCHAR2);
END my_api;
/
CREATE OR REPLACE PACKAGE BODY my_api IS
PROCEDURE sync_batch(x_return_status OUT VARCHAR2) IS
BEGIN
x_return_status := 'test';
END sync_batch;
END my_api;
/
这导致:
包体MY_API: PLS-00323:子程序或游标'SYNC_BATCH‘的错误在包规范中声明,必须在包体中定义。
当我在测试环境中使用sqlplus 11.2.0.1.064位连接到12.1.0.2.064位数据库时,就会发生这种情况。当我使用sqlplus 11.2.0.1.0连接到我们客户的11.2.0.1.064位数据库时,不会发生这种情况。我可以添加更多的过程,但是这个sync_batch过程总是会出现错误。重命名这个过程也不能解决这个问题,所以我不认为它是一个保留的名称或什么的。
有人知道还会发生什么吗?
更新2018-09-17: -这太奇怪了.我删除了整个代码,并再次输入它,现在错误消失了。
当我在我的完整代码中做同样的事情时,该过程的错误消失了--但是在下一个过程中重新出现,不是直接下一个过程,而是后面的那个过程。
我在VisualStudio2017中输入了一个.sql文件,在此之前和重新键入它时都是如此,并从那里复制了代码,以便在SQLPlus中执行。会不会是编码问题?VS表示有签名的UTF-8,代码页65001,行尾=当前设置。我的Oracle数据库使用NLS_CHARACTERSET = WE8MSWIN1252
发布于 2018-09-14 11:44:54
只是尝试用您给出的确切脚本创建包和包主体。通过IDE和SQLPlus成功地创建和编译了(但是,我使用了12*版本的SQLPlus)。
您是否按照正确的顺序创建包对象--首先是标头,然后是正文?当您创建包含编译错误的包,然后尝试重新编译它时,会发生什么?这不管用吗?
我知道SQLPlus在脚本中的空行有问题,所以在通过SQLPlus执行脚本时一定不要使用它们。
发布于 2018-09-14 11:54:51
与您所拥有的版本相同:
工作正常。所以..。不知道。一个愚蠢的建议,当然,但是-你能弹出数据库吗?
M:\>sqlplus scott@orcl
SQL*Plus: Release 11.2.0.1.0 Production on Pet Ruj 14 13:50:04 2018
Copyright (c) 1982, 2010, Oracle. All rights reserved.
Enter password:
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options
SQL> set linesize 200
SQL> SELECT * FROM v$version;
BANNER CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production 0
PL/SQL Release 12.1.0.2.0 - Production 0
CORE 12.1.0.2.0 Production 0
TNS for Linux: Version 12.1.0.2.0 - Production 0
NLSRTL Version 12.1.0.2.0 - Production 0
SQL> CREATE OR REPLACE PACKAGE my_api
2 IS
3 PROCEDURE sync_batch (x_return_status OUT VARCHAR2);
4 END my_api;
5 /
Package created.
SQL> CREATE OR REPLACE PACKAGE BODY my_api
2 IS
3 PROCEDURE sync_batch (x_return_status OUT VARCHAR2)
4 IS
5 BEGIN
6 x_return_status := 'test';
7 END sync_batch;
8 END my_api;
9 /
Package body created.
SQL>
SQL> DROP PACKAGE my_api;
Package dropped.
SQL>
https://stackoverflow.com/questions/52330921
复制相似问题