【问题标题】:Revisting ORA-06576: not a valid function or procedure name for simple function call via various database tools重访 ORA-06576:对于通过各种数据库工具进行的简单函数调用,不是有效的函数或过程名称
【发布时间】:2022-01-09 09:03:36
【问题描述】:

修订 ORA-06576:对于通过 dbeaver 数据库工具进行简单函数调用的无效函数或过程名称

我看过很多帖子,但没有涵盖我遇到的情况。

我正在尝试通过 dbeaver 对 Oracle SQL 进行简单的函数调用:

根据dbeaver获取的右键调用函数,函数语法为:

CALL OUR_DB.GET_YEAR_FROM_DATE(:INPUT_DATE);

更具体一点:

CALL OUR_DB.GET_YEAR_FROM_DATE('01/02/2024');

但是,我收到以下错误: ORA-06576: 不是有效的函数或过程名称

函数确实似乎编译正确。

我也尝试制作自己的函数(可能有语法错误),所以这可能是一个后续问题。

但是,我们的数据库中已经存在上述功能,应该可以正常工作。 假设这是真的,如何从 dbeaver 中调用它?

我正在使用: dbeaver 21.3

还有来自 SELECT * FROM v$version 的 ORACLE 是: Oracle Database 19c 标准版 2 版本 19.0.0.0.0 - 生产

为了它的价值,我使用了 Oracle SQL Developer 版本 4.1.4.21 有一个非常相似的错误,可能是更详细的错误信息:

CALL OUR_DB.GET_YEAR_FROM_DATE('01/02/2024');

Error report -
SQL Error: ORA-06576: not a valid function or procedure name
06576. 00000 -  "not a valid function or procedure name"
*Cause:    Could not find a function (if an INTO clause was present) or
           a procedure (if the statement did not have an INTO clause) to
           call.
*Action:   Change the statement to invoke a function or procedure

这似乎表明问题实际上不是由于工具,而是底层数据库。

如果认为该语法有效,是否只是权限问题?

【问题讨论】:

  • 错误信息很明确:“找不到函数(如果存在INTO子句)或过程 b>(如果语句没有INTO子句)调用。”
  • 函数返回一个值。它应该有一个返回该值的地方。

标签: sql oracle function oracle-sqldeveloper dbeaver


【解决方案1】:

函数过程有很大区别。

两者都获得参数,但只有函数returns一个值。

所以基本上函数 可以在select 语句中或在分配语句中的PL/SQL 块中调用。请参见下面的示例。

只有一个过程可以在你做的时候简单调用。

关于函数过程及其区别的一些基本信息:

what-is-the-difference-between-function-and-procedure-in-pl-sql

functions-vs-procedures-in-oracle

示例

create function hello(par varchar2) return varchar2  as
begin
   return ('world ' || par);
end;
/

-- wrong usage of function
CALL  hello('hello')
SQL Error [6576] [65000]: ORA-06576: not a valid function or procedure name

-- legal use of function in SELECT
select  hello('hello') from dual;
world hello

-- or in PL/SQL block

-- use Ctrl+Shift+O  for SET serveroutput ON;
DECLARE
  v_result varchar(100);
BEGIN
     v_result := hello('helo');
     dbms_output.put_line(v_result);
END;

【讨论】:

  • 虽然你的作品,而且我接受了答案,但这通常不是人们在大多数网站、手册和教程中看到的。因此,请将此类教程的链接添加到您的答案顶部
  • 哦,抱歉,是的,我添加了此信息@JosephDoggie。我不知何故认为这一定很明显,这当然不是真的
  • 非常不错的插件。
  • 虽然这个答案可能对使用类似于我的系统的人有所帮助,但从互联网研究看来,在许多 Oracle 系统上,一个只是做一个“调用”,但这在我自己的系统上不起作用.
猜你喜欢
  • 2021-03-25
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多