[英]Oracle Package or function in invalid state
尝试创建基于pl / sql游标的函数以从oracle数据库返回详细信息。
相关表MEETING
的MEETING_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.