【问题标题】:Function object is invalid函数对象无效
【发布时间】:2016-07-19 09:07:51
【问题描述】:

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

【问题讨论】:

  • 您的函数处于无效状态。你要回来两次。修复错误并再次编译。另外,循环的目的是什么?
  • 如果您显示 PURCHASEORDER.ACLSTUDENT_CUSTOM_AUTH 的编译错误会有所帮助。您可以在 SQLPlus 或 SQL Developer show errors package body PURCHASEORDER.ACLSTUDENT_CUSTOM_AUTH 中使用以下命令执行此操作

标签: oracle plsql


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

这必须更好。

【讨论】:

    【解决方案2】:

    正如 Massie 所说,不要在参数中指定长度。此外,正如 Lalit 所暗示的,您使用返回变量以及两个 RETURN 语句是多余的。您应该只在两个位置之一中返回所需的 BOOLEAN 值设置变量并在函数末尾有一个 RETURN。我会采用第一种方法,因为您的代码会更简洁。

    顺便说一句,我不喜欢使用循环来检查一条记录是否存在,但那是靠。

    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;
    

    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;
    

    【讨论】:

    • 好的,谢谢您的回答。现在,它工作正常!您认为可以使用 FUNCTION 但没有参数吗?我需要返回值。
    • 是的,您可以使用不带任何参数的函数。只要你的函数总是返回一个值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    相关资源
    最近更新 更多