2014-01-23 2 views
0

у меня есть два типа оракула какКак решить компонент должен быть объявлен с использованием типов оракула

create or replace 
TYPE T_EMPLOYEE 
AS TABLE OF O_EMPLOYEE; 

И мой O_EMPLOYEE ТИП

create or replace 
TYPE O_EMPLOYEE 
AS OBJECT 
    (
     EMP_NAME      VARCHAR2(50), 
     EMP_ID       VARCHAR2(50), 
     EMP_DES    VARCHAR2(50) 

    ); 

Я использую это в качестве входных данных в процедуре хранения где мне нужно проверить правильность имени, идентификатора и обозначения. Используя следующий, я могу преобразовать таблицу в оператор select.

TABLE(CAST(I_T_EMPLOYEE AS T_EMPLOYEE)) emp, 

, но я попытался прочитать значение, как, как T_EMPLOYEE.EMP_NAME, он говорит componenet EMP_NAME должен быть decalred.

Может ли кто-нибудь помочь?

+0

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

+0

Что вы получите, если вы выполните запрос типа SELECT * FROM NATURAL JOIN TABLE (I_T_EMPLOYEE) '? –

ответ

0

спасибо shabilan. Есть два способа получить значение. первый

Написав следующую процедуру на складе. вам необходимо объявить переменные для

IS 

    V_EMP_NAME      VARCHAR2(50), 
    V_EMP_ID       VARCHAR2(50), 
    V_EMP_DES       VARCHAR2(50), 

    BEGIN 

    SELECT PROCESS_TYPE,REQUEST_TYPE,STATUS,EFFECTIVE_DATE_RANGE 
    INTO V_EMP_NAME, V_EMP_ID, V_EMP_DES 
    FROM TABLE(CAST(I_T_EMPLOYEE AS T_EMPLOYEE)) ITE; 
    --validation part 
    if(V_EMP_NAME is null or V_EMP_ID or V_EMP_DES) then RAISE NULL_DATA; 
    END IF; 

Это один потерпит неудачу, если вы передаете несколько типов объектов в процедуре хранения как

T_E_I :=T_EMPLOYEE(O_EMPLOYEE('Test','1234','manager'), 
       O_EMPLOYEE('Test','1234','manager')); 
GET_DATA_PKG.EMPLOYEE_ORDER_BY_ROLE(T_E_I,                      :o_error_code, 
            :o_error_message); 

2 подхода обрабатывает несколько входов. это делается с помощью cursor.you необходимо объявить переменные для

IS 

    OEM        O_EMPLOYEE := O_EMPLOYEE(null,null,null); 
    c_EMP_NAME      OEM.EMP_NAME%type, 
    c_EMP_ID       OEM.EMP_ID%type, 
    c_EMP_DES       OEM.EMP_DES%type, 

    Cursor emp_role_curs is 
    SELECT PROCESS_TYPE,REQUEST_TYPE,STATUS,EFFECTIVE_DATE_RANGE 
    FROM TABLE(CAST(I_T_EMPLOYEE AS T_EMPLOYEE)) ITE; 

    BEGIN 
    OPEN emp_role_curs; 
    loop 
    fetch emp_role_curs into C_EMP_NAME, C_EMP_ID, C_EMP_DES 
    FROM TABLE(CAST(I_T_EMPLOYEE AS T_EMPLOYEE)) ITE; 
    --validation part 
    if(V_EMP_NAME is null or V_EMP_ID or V_EMP_DES) then RAISE NULL_DATA; 
    END IF; 
    EXIT WHEN emp_role_curs%notfound; 
    END LOOP; 
    CLOSE emp_role_curs; 

Я надеюсь, что это полезно, если кто-то хочет, чтобы прочитать тип объекта в виде таблицы.

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