功能对象无效

时间:2016-03-31 04:56:43

标签: oracle plsql

我在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;

2 个答案:

答案 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;