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

kus*_*tus 16 oracle stored-procedures function oracle10g

问题可能过于简单,但我确实需要帮助.

我在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;
Run Code Online (Sandbox Code Playgroud)

我也尝试了这个:

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;
Run Code Online (Sandbox Code Playgroud)

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

BEGIN 
  check_login('admin', 'admin'); 
END;
Run Code Online (Sandbox Code Playgroud)

EXECUTE check_login('admin', 'admin');
Run Code Online (Sandbox Code Playgroud)

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

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

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

难道我做错了什么?

jos*_*989 24

如果要执行函数,则必须将返回值收集到变量中.

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

并使用运行脚本选项而不是运行语句选项运行它.

variable ret varchar2(20);

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

select :ret from dual
Run Code Online (Sandbox Code Playgroud)

或者如果你是从plsql那里做的

declare  v_ret varchar2(100); 
begin

  v_ret:=check_login(a,b); 
end;
Run Code Online (Sandbox Code Playgroud)

  • 您提到的第二个块可以正常工作,但只显示完成的**匿名块**.不返回值. (2认同)

小智 7

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

select check_login('admin', 'admin') from dual;
Run Code Online (Sandbox Code Playgroud)

注意错误消息说"没有程序 ":).