【问题标题】:How to call sql function ABC defined in package DEF using TOAD ORACLE如何使用 TOAD ORACLE 调用 DEF 包中定义的 sql 函数 ABC
【发布时间】:2011-12-27 20:31:05
【问题描述】:

我有一个名为 DEF 的 Oracle 包,其中有一个名为 ABC 的函数,它接受 1 个字符串参数。 请问如何在TOAD Editor中直接调用这个函数ABC?

提前致谢。

CREATE OR REPLACE PACKAGE HPQ_IF.def AS
  FUNCTION def(p_sql IN VARCHAR2)
  RETURN VARCHAR2;
END def;
/


  FUNCTION abc(p_sql IN VARCHAR2)
  RETURN VARCHAR2
  IS
  j NUMBER;

  BEGIN
    dbms_output.put_line(p_sql);
    RETURN 'Done';
  END abc;

最后一个错误(使用下面的第一个答案):

[Error] Execution (6: 31): ORA-06550: line 6, column 31:
PLS-00302: component 'abc' must be declared
ORA-06550: line 6, column 3:
PL/SQL: Statement ignored

【问题讨论】:

  • 您似乎更改了函数和包名称。但我怀疑你犯了一个错误。该函数应该被称为abc,不仅在主体中,而且在声明中也是如此。请张贴完整打包的标题和完整的包正文。如果您更改名称,则首先修复所有错误,以便标头和正文都成功编译。

标签: oracle function plsql package


【解决方案1】:

在 TOAD SQL 缓冲区中:

DECLARE
   v_sql VARCHAR2(255);
   v_return VARCHAR2(255);
BEGIN
   v_sql := 'the string'; -- or get it from anywhere else
   v_return := HPQ_IF.def.abc(v_sql);
   dbms_output.put_line(v_return);
   -- do anything else you want to do with the return value here...
END;

如果你不想对返回值做任何事情而不是显示信息:

SELECT HPQ_IF.def.abc('the string') FROM DUAL;

然而,要在 SQL 中调用 PL/SQL 函数(SELECT、INSERT 等),它必须没有某些副作用(即它不能修改数据库中的某些类型的状态)。要作为 SELECT 中的列调用,它不能修改数据库(例如插入或更新)、执行 DDL 或提交事务。


您还可以在模式浏览器中使用执行过程。

【讨论】:

  • 嗨,谢谢你的回答,奇怪的是它给了我[错误]执行(6:31):ORA-06550:第 6 行,第 31 列:PLS-00302:必须声明组件'abc' ORA -06550:第 6 行,第 3 列:PL/SQL:语句被忽略
  • 请把 def.abc 的代码贴出来好吗? abc 在 def 包规范中可用吗?
  • 嗨,Scott,我在包头及其正文上方发布。请注意,我在测试中也使用了相同的架构 HPQ_IF
  • 根据你发的帖子,def包里没有公共函数abc,除非是打错了。
  • @iwan 我清理了语法并添加了更多解释;请注意,由于它是一个函数,因此您必须返回一个值。
【解决方案2】:

函数返回一个值,所以你必须在某处返回结果。

您可以从 SQL 语句中调用该函数

SELECT def.abc( 'Some string' )
  FROM dual;

或者您可以将结果返回到 PL/SQL 中的局部变量中

DECLARE
  l_result VARCHAR2(100);
BEGIN
  l_result := def.abc( 'Some string' );
END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 2016-08-15
    • 2018-10-29
    • 2014-06-09
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    相关资源
    最近更新 更多