2013-10-09 1 views
0

Я хотел бы знать, если есть способ сделать это:Как ввести статическую функцию в качестве В параметре таблицы объектов

У меня есть объект типа A. Я хотел бы добавить статическую функцию в объект декларации, которая имеет параметр, тип которого является таблица объекта А.

Как сделать knwo, что:

  1. Я не могу это сделать:

    Статическая функция BlaBla (MyList В ТАБЛИЦЕ А): компилятор не понимает таблицы здесь

  2. Я не могу создать тип хой ТАБЛИЦЫ А поскольку А неизвестно в момент создания этого нового типа

Так подводить до:

create or replace 
TYPE myObject AS OBJECT (
    STATIC FUNCTION blabla (myList IN TABLE OF myObject) 
); 
+0

Возможно, вы можете использовать тип данных ANYDATA? Ваша статическая функция будет принимать параметр ANYDATA, а затем извлекать фактические объекты. Подробнее об этом вы можете узнать здесь: [ANYDATA Datatype] (http://www.oracle-developer.net/display.php?id=218) –

+0

Проблема заключается в том, как отбрасывать после этого в ТАБЛИЦУ myObject – mlwacosmos

+0

Проверить мой ответ - Я протестировал решение, и, похоже, он работает, как я думаю, вы ожидали. –

ответ

0

Вот возможное решение с использованием AnyDATA типа данных:

CREATE OR REPLACE 
TYPE my_object AS OBJECT (
    some_number NUMBER, 
    STATIC FUNCTION static_test_function(p_my_objects_tab IN OUT ANYDATA) RETURN NUMBER 
); 
/

CREATE TYPE my_object_tab_t AS TABLE OF my_object; 
/

CREATE OR REPLACE 
TYPE BODY my_object AS 
    STATIC FUNCTION static_test_function(p_my_objects_tab IN OUT ANYDATA) RETURN NUMBER 
    AS 
    v_my_objects_tab my_object_tab_t; 
    v_dummy NUMBER; 
    v_result NUMBER := 0; 
    BEGIN 
    -- get the collection from ANYDATA object - v_dummy holds status (succes or not) 
    v_dummy := p_my_objects_tab.GetCollection(v_my_objects_tab); 

    -- as an example, loop through the list and sum up the some_number field 
    FOR v_i IN v_my_objects_tab.FIRST..v_my_objects_tab.LAST 
    LOOP 
     v_result := v_result + v_my_objects_tab(v_i).some_number; 
    END LOOP; 

    RETURN v_result; 
    END; 
END; 
/

DECLARE 
    v_my_objects_tab my_object_tab_t; 
    v_anydata_my_objects_tab ANYDATA; 

    v_result NUMBER; 
BEGIN 
    -- create the collection and populate it with some sample data 
    v_my_objects_tab := my_object_tab_t(); 

    v_my_objects_tab.EXTEND(); 
    v_my_objects_tab(v_my_objects_tab.LAST()) := my_object(5); 

    v_my_objects_tab.EXTEND(); 
    v_my_objects_tab(v_my_objects_tab.LAST()) := my_object(10); 

    -- create ANYDATA object from the collection 
    v_anydata_my_objects_tab := ANYDATA.ConvertCollection(v_my_objects_tab); 

    -- call the static function expecting ANYDATA parameter 
    v_result := my_object.static_test_function(v_anydata_my_objects_tab); 

    dbms_output.put_line(v_result); 
END; 
/

Выход: 15

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