繁体   English   中英

Oracle包或函数处于无效状态

[英]Oracle Package or function in invalid state

尝试创建基于pl / sql游标的函数以从oracle数据库返回详细信息。

相关表MEETINGMEETING_ID :number(10), TIME :timestamp(4), TITLE :varchar(20)

CREATE OR REPLACE FUNCTION GetMeeting
                    (meetingnumber MEETING.MEETING_ID%TYPE)
RETURN VARCHAR
IS
    CURSOR current_meeting(meetingnumber MEETING.MEETING_ID%TYPE)
    IS
        SELECT TITLE, TIME
        FROM MEETING
        WHERE MEETING_ID = meetingnumber;

    r_meeting current_meeting%ROWTYPE;
BEGIN
    OPEN current_meeting(meetingnumber);

    FETCH current_meeting INTO r_meeting;

    IF current_meeting%NOTFOUND THEN
        r_meeting.TITLE := 'UNKNOWN APPOINTMENT';
        END IF;

        CLOSE current_meeting;

        RETURN r_meeting.TITLE;
    END;


SELECT GetMeeting (27) name
FROM MEETING;

该函数似乎编译好 - 但是当被调用时抛出

ORA-06575:包或函数GETMEETING处于无效状态

也许这对你更好:

create or replace function
  getmeeting(
    meeting_id number)
return
  varchar
is
  meeting_title meeting.title%Type;
begin
  select title
  into   meeting_title
  from   meeting
  where  meeting_id = getmeeting.meeting_id;

  return meeting_title;
exception
  when NO_DATA_FOUND then
     return 'UNKNOWN APPOINTMENT';
end;
/

没有语法检查。

列标识符'TIME'(SQL关键字)生成错误; 执行时触发运行时错误。

当'TIME'被删除时,代码很遗憾地返回NULL

没有足够的事实要知道,但我会研究某种形式的循环依赖。

select * 
  from user_dependencies 
 where referenced_name = 'GETMEETING' 
   and referenced_type = 'FUNCTION';

避免循环依赖的最佳方法是使用只在主体中引用其他包的包。 避免使用独立的函数和过程对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM