好象不太可能,帮你UP吧。楼主这个问题和ATGC的那个存储过程是连起来的吧。我觉得还是通过临时表的方法比较好

解决方案 »

  1.   

    CREATE PACKAGE cv_types AS
      TYPE LibCurTyp IS REF CURSOR;
      ...
    END cv_types;CREATE PROCEDURE find_item (title VARCHAR2(100),lib_cv IN OUT cv_types.LibCurTyp) AS
      code BINARY_INTEGER;
    BEGIN
      SELECT item_code FROM titles INTO code WHERE item_title = title; 
      IF code = 1 THEN
        OPEN lib_cv FOR SELECT * FROM books WHERE book_title = title;
      ELSIF code = 2 THEN
        OPEN lib_cv FOR SELECT * FROM periodicals WHERE periodical_title = title;
      ELSIF code = 3 THEN
        OPEN lib_cv FOR SELECT * FROM tapes WHERE tape_title = title;
      END IF;
    END find_item;DECLARE
      lib_cv cv_types.LibCurTyp;
      book_rec books%ROWTYPE;
      periodical_rec periodicals%ROWTYPE;
      tape_rec tapes%ROWTYPE;
    BEGIN
      get_title(:title); -- title is a host variable
      find_item(:title, lib_cv);
      FETCH lib_cv INTO book_rec;
      display_book(book_rec);
      EXCEPTION
        WHEN ROWTYPE_MISMATCH THEN
          BEGIN
            FETCH lib_cv INTO periodical_rec;
            display_periodical(periodical_rec);
          EXCEPTION
            WHEN ROWTYPE_MISMATCH THEN
              FETCH lib_cv INTO tape_rec;
              display_tape(tape_rec);
          END;
    END;