3

尝试创建一个基于 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 处于无效状态

4

3 回答 3

1

也许这对你会更好:

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;
/

未检查语法。

于 2013-05-12T14:50:53.323 回答
0

列标识符“TIME”生成错误,这是一个 SQL 关键字;执行时触发运行时错误。

不幸的是,删除“TIME”时代码返回 NULL

于 2013-05-12T15:06:26.217 回答
0

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

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

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

于 2013-05-14T02:43:56.700 回答