我在Oracle Application Express中执行查询,很好。在我运行我的应用程序之前,它给了我错误
插件处理期间引发的PLSQL代码出错。
ORA-06550:第4行,第1列:PLS-00905:对象 PURCHASEORDER.ACLSTUDENT_CUSTOM_AUTH无效ORA-06550:第4行, 第1列:PL / SQL:忽略语句
这是我的sql
create or replace FUNCTION aclstudent_custom_auth (
p_username IN VARCHAR2(50),
p_password IN VARCHAR2(20))
RETURN boolean IS
valid boolean;
BEGIN
FOR c1 IN (SELECT 1 FROM students
WHERE upper(student_userid) = upper(p_username)
AND upper(student_last_name) = upper(p_password))
LOOP
valid := TRUE;
RETURN valid;
END LOOP;
valid := FALSE;
RETURN valid;
END;
答案 0 :(得分:1)
声明函数的输入参数没有长度。
CREATE OR REPLACE FUNCTION aclstudent_custom_auth (
p_username IN VARCHAR2,
p_password IN VARCHAR2)
RETURN boolean IS
valid boolean;
BEGIN
FOR c1 IN (SELECT 1 FROM students
WHERE upper(student_userid) = upper(p_username)
AND upper(student_last_name) = upper(p_password))
LOOP
valid := TRUE;
RETURN valid;
END LOOP;
valid := FALSE;
RETURN valid;
END;
这必须更好。
答案 1 :(得分:0)
正如马西所说,不要在论证中指定长度。此外,正如Lalit所暗示的那样,使用返回变量以及两个RETURN语句是多余的。您应该只在两个位置之一中返回所需的BOOLEAN值或设置变量并在函数末尾有一个RETURN。我会选择第一种方法,因为您的代码会更简洁。
顺便说一句,我不喜欢使用循环来检查是否存在一条记录,但那是由by。
CREATE OR REPLACE FUNCTION aclstudent_custom_auth(p_username IN VARCHAR2,
p_password IN VARCHAR2)
RETURN BOOLEAN IS
BEGIN
FOR c1 IN (SELECT 1
FROM students
WHERE upper(student_userid) = upper(p_username)
AND upper(student_last_name) = upper(p_password)) LOOP
RETURN TRUE;
END LOOP;
RETURN FALSE;
END;
OR
CREATE OR REPLACE FUNCTION aclstudent_custom_auth(p_username IN VARCHAR2,
p_password IN VARCHAR2)
RETURN BOOLEAN IS
valid BOOLEAN;
BEGIN
FOR c1 IN (SELECT 1
FROM students
WHERE upper(student_userid) = upper(p_username)
AND upper(student_last_name) = upper(p_password)) LOOP
valid := TRUE;
END LOOP;
valid := FALSE;
RETURN valid;
END;