如何在 Package Body oracle pl/sql 中添加第二个私有函数?

Posted

技术标签:

【中文标题】如何在 Package Body oracle pl/sql 中添加第二个私有函数?【英文标题】:How can I add a second private function in Package Body oracle pl/sql? 【发布时间】:2016-12-05 01:25:55 【问题描述】:

大家好,我遇到了一个问题,当我尝试在我的第一个私有标头下方添加第二个私有标头时出现错误。

CREATE OR REPLACE PACKAGE TEST IS
PROCEDURE TEST2(VARIABLE1 IN NUMBER, VARIABLE2 OUT NUMBER);
END;

CREATE OR REPLACE PACK BODY TEST IS
FUNCTION PRIVATE1 (VARIABLE1 IN NUMBER)
RETURN NUMBER;
FUNCTION PRIVATE2 (VARIABLE2 IN NUMBER)
RETURN NUMBER;
PROCEDURE TEST2(VARIABLE IN NUMBER, VARIABLE OUT NUMBER)
BEGIN
......
END;
FUNCTION PRIVATE1 (VARIABLE1 IN NUMBER)
RETURN NUMBER
IS
BEGIN
........
END;
FUNCTION PRIVATE2 (VARIABLE2 IN NUMBER)
RETURN NUMBER
IS 
BEGIN
.......
END;
END;

关于如何修复它的任何建议?

【问题讨论】:

而错误是...? 请发布一个不工作的具体结构的例子,连同完整的错误信息和行号。发布几行伪代码并说您“遇到错误”只会让您投反对票。 【参考方案1】:
FUNCTION PRIVATE2 (VARIABLE2 IN NUMBER)
RETURN NUMBER; // REMOVE semi colon from here 
IS 
BEGIN
.......
END;

【讨论】:

函数不能在sql中使用。 在你的代码中你还没有调用任何函数,这个错误只有在 sql 或者可能在代码中使用函数时才会出现,这两个东西在你的代码中都不可见。在编译期间不太可能出现此错误。为了获得帮助,您需要分享相关代码,以及编译时返回的详细错误。【参考方案2】:

您可能在 SQL 中使用私有函数 - 这不受支持。为了在 SQL 中使用函数,您必须在包规范中定义它。

我们需要 private1 和 private2 函数的源代码,以便能够提供更多帮助。

[编辑] 以下是由于在 SQL 中使用私有函数而导致编译失败的包示例:

create or replace package test_pkg is
end;
/
create or replace package body test_pkg is

  function F1 return number is
  begin
    return 2;
  end;

  function F2 return number is
    lnNumber number;
  begin
    select F1 -- function declared only in the package body
      into lnNumber
      from dual;
    return lnNumber + 1;
  end;

end;
/
PLS-00231: function 'F1' may not be used in SQL
PL/SQL: ORA-00904: "F1": invalid identifier
PL/SQL: SQL Statement ignored

【讨论】:

如果我从包中删除第二个私有函数,则包创建成功。 但是你显然需要这个函数,否则你不会在包中拥有它?解决方法是从SQL中删除函数调用,在包的规范中声明函数,或者改变你的以不需要从 SQL 调用函数的方式编写代码 我想我将不得不选择第二个选项。

以上是关于如何在 Package Body oracle pl/sql 中添加第二个私有函数?的主要内容,如果未能解决你的问题,请参考以下文章

oracle - sqldeveloper 手动执行包 package的方法

oracle owner type in package: 如何在 SQL 中使用它?

Plsql developer 工具创建存储过程,必须要在package 文件下创建存储声明 pa

oracle 存储过程调用

在 oracle 包中定义默认值的位置

Oracle中的package 怎么用