无法调用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存储过程和函数的主要内容,如果未能解决你的问题,请参考以下文章