【问题标题】:Cannot call oracle stored procedure and function无法调用oracle存储过程和函数
【发布时间】: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 语句都可以正常工作。

我是不是做错了什么?

【问题讨论】:

    标签: oracle function stored-procedures oracle10g


    【解决方案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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-05
      • 2013-06-06
      • 2015-12-23
      • 1970-01-01
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多