无法调用oracle存储过程和函数

Posted

技术标签:

【中文标题】无法调用oracle存储过程和函数【英文标题】:Cannot call oracle stored procedure and function 【发布时间】:2011-12-05 21:24:48 【问题描述】:

这个问题可能太简单了,但我确实需要帮助。

我正在 Oracle 10g 中创建一个存储过程,但我无法调用它。我正在使用 SQL Developer 来管理数据库。

CREATE OR REPLACE
FUNCTION check_login 
  (username IN VARCHAR2, pwd IN VARCHAR2)
  RETURN VARCHAR2
IS
  isUserValid INTEGER;
BEGIN
  SELECT Count(*) INTO isUserValid
  FROM users
  WHERE Username = username AND PASS_WORD = pwd;
  return isUserValid;
END;

我也试过这个:

CREATE OR REPLACE
PROCEDURE check_login 
  (username IN VARCHAR2, pwd IN VARCHAR2, RESULT OUT INTEGER)
IS
  isUserValid INTEGER;
BEGIN
  SELECT Count(*) INTO isUserValid
  FROM users
  WHERE Username = username AND PASS_WORD = pwd;
  RESULT := isUserValid;
END;

解析两者不会给出任何错误消息。我使用以下语法来调用它们:

BEGIN 
  check_login('admin', 'admin'); 
END;

EXECUTE check_login('admin', 'admin');

我收到此错误消息....

PLS-00221:“CHECK_LOGIN”不是过程或未定义 PL/SQL:语句被忽略

如果直接运行,两者中的 SELECT 语句都可以正常工作。

我是不是做错了什么?

【问题讨论】:

【参考方案1】:

如果你想执行一个函数,你必须将返回值收集到一个变量中。

所以你需要定义一个变量并执行函数返回到变量中,如下所示

并使用 run Script 选项而不是 Run Statement 选项运行它。

variable ret varchar2(20);

execute :ret:=check_login(dd,dd);

select :ret from dual

或者如果你从 plsql 中进行操作

declare  v_ret varchar2(100); 
begin

  v_ret:=check_login(a,b); 
end;

【讨论】:

谢谢约瑟夫!那行得通。现在,如何将三行压缩为一行,以便可以在一行中使用 oci_execute()php 代码中调用它? 你提到的第二个区块可以工作,但只显示匿名区块已完成。不返回值。【参考方案2】:

我发现调用函数最简单的方法就是从双重示例中选择函数-

select check_login('admin', 'admin') from dual;

请注意错误消息“没有程序”:)。

【讨论】:

以上是关于无法调用oracle存储过程和函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在ORACLE存储过程中调用WEBSERVICE函数

oracle 函数中能调用存储过程吗

ORACLE中如何为存储过程传递参数?

Instr函数在oracle存储过程里怎么用

JDBC 调用函数或存储过程

oracle函数和存储过程有什么区别