2013-05-13 2 views
0
CREATE OR REPLACE 
PACKAGE PKG 
AS 
TYPE RESULT_T 
IS 
    TABLE OF VARCHAR2(3000); 
FUNCTION GENERATEF 
    RETURN RESULT_T ; 
END PKG; 
/
CREATE OR REPLACE 
PACKAGE BODY PKG 
AS 
FUNCTION GENERATEF 
    RETURN RESULT_T 
IS 
    i_t RESULT_T := RESULT_T(); 
BEGIN 

    FOR TLC IN 1..3 
    LOOP 
    i_t.extend; 
    i_t(i_t.last) := tlc; 
    END LOOP; 
    RETURN i_t; 
END; 
END PKG; 
/

Когда я хочу, чтобы выполнить «select * from table(pkg.GENERATEF);», система говорит мне, что это «неверная тип данных». Я не уверен, что вызвало проблему.Почему таблица моей функции неприемлема?

ответ

2

Этот тип RESULT_T не определяется глобально, поэтому Oracle (или любая СУБД) не может идентифицировать этот тип и поэтому не может выдавать результат в виде таблицы.

Вы можете указать этот тип вне пакета, как -

Create or Replace TYPE RESULT_T IS 
    TABLE OF VARCHAR2(3000); 

, а затем удалить определение для этого типа из пакета, как -

CREATE OR REPLACE PACKAGE Pkg AS 
    /*TYPE RESULT_T 
    IS 
    TABLE OF VARCHAR2(3000);*/ 
    FUNCTION Generatef RETURN Result_t; 
END Pkg; 
/
CREATE OR REPLACE PACKAGE BODY Pkg AS 
    FUNCTION Generatef RETURN Result_t IS 
    i_t Result_t := Result_t(); 
    BEGIN 

    FOR Tlc IN 1 .. 3 LOOP 
     i_t.EXTEND; 
     i_t(i_t.LAST) := Tlc; 
    END LOOP; 
    RETURN i_t; 
    END; 
END Pkg; 
/

, а затем, когда вы будете запрашивать -

select * from table(pkg.GENERATEF); вы получите результат по вашему желанию.

+0

Спасибо @Frank Schmitt .. –

+0

Добро пожаловать :-) –

Смежные вопросы