重新审视ORA-06576:不是通过各种数据库工具进行简单函数调用的有效函数或过程名称

16 浏览
0 Comments

重新审视ORA-06576:不是通过各种数据库工具进行简单函数调用的有效函数或过程名称

重新审视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 Standard Edition 2 Release 19.0.0.0.0 - Production

值得一提的是,我使用的是Oracle SQL Developer Version 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

这似乎表明问题并不是由工具引起的,而是底层数据库引起的。

如果语法被认为是正确的,那么可能只是一个权限问题吗?

0
0 Comments

在使用不同的数据库工具对简单函数调用时,可能会出现ORA-06576错误,提示函数或过程名称无效。这个问题的出现原因是函数和过程之间存在重要区别,函数可以返回一个值,而过程不能。因此,在使用函数时,可以在select语句或PL/SQL块中调用函数并返回值,而过程只能直接调用。

以下是有关函数和过程以及它们之间区别的一些基本信息:

- 函数和过程的区别:[链接](https://stackoverflow.com/questions/771949)

- Oracle中的函数和过程比较:[链接](https://stackoverflow.com/questions/25419629)

下面是一个示例:

创建一个名为hello的函数,接受一个varchar2类型的参数并返回一个varchar2类型的值。

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

错误的函数使用方式:

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

合法的函数使用方式:

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;

尽管你的方法是有效的,并且我接受了这个答案,但在大多数网站、手册和教程中并不常见。因此,请在你的答案顶部添加一个指向此类教程的链接。

很抱歉,是的,我添加了这个信息。我不知怎么会认为这个是显而易见的,这当然是错误的。

非常好的补充。

尽管这个答案可能对具有类似系统的人有帮助,但通过互联网的研究发现,在许多Oracle系统中,只需使用"call"即可,但在我的系统中却不起作用。

0