必须使用oracle Types声明如何解析组件

时间:2014-01-23 07:18:57

标签: sql oracle

我有两个oracle类型,如

create or replace 
TYPE T_EMPLOYEE 
AS TABLE OF O_EMPLOYEE;

我的O_EMPLOYEE TYPE是

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

    );

我在商店程序中使用它作为输入,我需要检查名称,ID和名称的验证。使用以下我可以在select语句中转换表。

TABLE(CAST( I_T_EMPLOYEE AS T_EMPLOYEE)) emp,

但是我尝试读取类似T_EMPLOYEE.EMP_NAME的值,它说组件EMP_NAME必须是十字形的。

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分: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);

第二种方法处理多个输入。这是使用cursor完成的。你需要声明

的变量
  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;  

我希望如果有人想要将对象类型作为表格读取,这将非常有用。