gpt4 book ai didi

sql - 为什么在Sql中不能使用Plsql包变量和常量?

转载 作者:行者123 更新时间:2023-12-05 03:37:30 25 4
gpt4 key购买 nike

创建一些包:

create or replace package my_package is
some_var number := 10;
end;

并在Sql中使用:

select my_package.some_var from dual

所以它给出错误 PLS-221

附言我知道我可以使用包装函数。我的问题是为什么不允许这样做。任何人都可以指出文档中的原因吗?

最佳答案

我要跳起来试着回答你的问题。这是我有时听说过的,而且确实作为增强请求已经有一段时间了(基本 ER:ENH 6525013),正如@Anum Kumar 指出的那样。

为什么不可能?好吧,我认为 PL/SQL 的 Oracle 开发人员只是将包视为逻辑子程序和例程的集合。因此,将变量直接提供给外部 API(OCI 或 Java)从来都不是这个概念的意图。

据我所知,您并没有真正的文档链接告诉您这是不可能的,但是如果您阅读概念本身的文档,您可能会得到一些见解:

A package is a schema object that groups logically related PL/SQL types, variables, constants, subprograms, cursors, and exceptions. A package is compiled and stored in the database, where many applications can share its contents. A package always has a specification, which declares the public items that can be referenced from outside the package. In either the package specification or package body, you can map a package subprogram to an external Java or C subprogram by using a call specification, which maps the external subprogram name, parameter types, and return type to their SQL counterparts.

这是关键,您可以将包的任何子程序映射到任何外部 Java、C 例程;但是如果没有相应的子程序(在您的情况下是函数),您不能直接引用常量变量。

但是,您不能在 SQL 上使用它,但可以在 PL/SQL 中使用。请记住,Oracle 在库缓存中包含不同的区域来处理 SQL 和 PLSQL。库缓存保存可执行形式的 PL/SQL 程序和 Java 类。这些项目统称为程序单元。

例子

CREATE OR REPLACE PACKAGE pkg IS
n NUMBER := 5;
END pkg;
/

Package created.

SQL> CREATE OR REPLACE PACKAGE sr_pkg IS
PRAGMA SERIALLY_REUSABLE;
n NUMBER := 5;
END sr_pkg;
/

Package created.

SQL> select sr_pkg.n from dual ;
select sr_pkg.n from dual
*
ERROR at line 1:
ORA-06553: PLS-221: 'N' is not a procedure or is undefined


SQL> set serveroutput on
SQL> BEGIN
pkg.n := 10;
sr_pkg.n := 10;
END;
/

PL/SQL procedure successfully completed.

SQL> BEGIN
DBMS_OUTPUT.PUT_LINE('pkg.n: ' || pkg.n);
DBMS_OUTPUT.PUT_LINE('sr_pkg.n: ' || sr_pkg.n);
END;
/
pkg.n: 10
sr_pkg.n: 5

PL/SQL procedure successfully completed.

在上面的示例中,我不能使用 SQL 引擎来引用常量变量,因为我需要一个子程序或例程(这是一个 OCI 调用,但它很可能是一个 Java 程序、ProC 等. 我专门使用其中一个包作为 serially_reusable ,即使我尝试,您也可以检查变量如何不改变。

但是,如果我不使用 SQL 引擎,我可以在 PL/SQL 中毫无问题地使用它。

我希望它能澄清。

关于sql - 为什么在Sql中不能使用Plsql包变量和常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69269447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com