【发布时间】:2019-11-18 20:49:20
【问题描述】:
以下示例定义了两个函数,F1 和 F2。 F1 调用 F2 并使用其结果。我只想通过在包规范中声明 F1 来公开访问它,并将 F2 保留为包的私有。
CREATE OR REPLACE PACKAGE PBL1 AS
TYPE t_record IS RECORD(
foo NUMBER
);
TYPE t_table IS TABLE OF t_record;
FUNCTION F1 RETURN t_table PIPELINED;
END PBL1;
CREATE OR REPLACE PACKAGE BODY PBL1 AS
FUNCTION F2 RETURN t_table PIPELINED AS
r t_record;
BEGIN
r.foo := 17;
PIPE ROW (r);
END F2;
FUNCTION F1 RETURN t_table PIPELINED AS
BEGIN
FOR x IN (SELECT * FROM F2())
LOOP
PIPE ROW (x);
END LOOP;
END F1;
END PBL1;
如果我尝试按原样编译包体,我会收到错误消息
PL/SQL: SQL Statement ignored
PL/SQL: ORA-00904: invalid ID
PL/SQL: PLS-000231: Function 'F2' may not be be used in SQL
如果我将F2 添加到包规范中,错误就会消失,我想避免这种情况。
我在answer to this question 中读到,这可能是由于上下文切换到了只知道公共包函数的 SQL 上下文,而不是知道私有包内容的 PL/SQL 上下文。但是,该问题的提问者没有提供示例代码,并且回答者似乎收回了他们的答案,所以我还是想提出这个问题。
有没有一种方法可以从其他函数调用包私有函数而无需在包的公共规范中公开它们?
【问题讨论】: