在Oracle PL SQL中,如何在存储过程中验证或从(Type Table)的输入参数中获取值?

在Oracle PL SQL中,如何在存储过程中验证或从(Type Table)的输入参数中获取值?,oracle,object,stored-procedures,input,types,Oracle,Object,Stored Procedures,Input,Types,我需要检查输入参数中的值在存储过程中是否为NULL。输入参数为表类型,其中包含嵌套对象。它包含3个属性-员工id、经理id和地址。我需要检查经理id和员工id是否为空。根据值,如果为空,我需要插入到两个不同的表中 CREATE OR REPLACE PACKAGE BODY order_mgr IS PROCEDURE ins_trees ( p_emp_details_in IN trees_type_t, p_nrmployee

我需要检查输入参数中的值在存储过程中是否为NULL。输入参数为表类型,其中包含嵌套对象。它包含3个属性-员工id、经理id和地址。我需要检查经理id和员工id是否为空。根据值,如果为空,我需要插入到两个不同的表中

CREATE OR REPLACE PACKAGE BODY order_mgr 
IS

PROCEDURE ins_trees (  p_emp_details_in    IN  trees_type_t,  
                       p_nrmployee_Id      IN  NUMBER                                     
                     )
BEGIN

      -- Condition goes here.. please let me know how to check this in the table type object as it contains nested object.
    -- IF the manager_id is NULL in the trees_type_t type object 
           THEN

          INSERT into emp (employee_id, address)
          values(p_emp_details_in.employee_id, p_emp_details_in.address_id);
           END IF;

       -- Condition goes here.. please let me know how to check this in the table type object as it contains nested object.
    -- IF the (employee_id  is NULL in the trees_type_t type object then

          INSERT into manager (manager_id, address)
          values(p_emp_details_in.manager_id,p_emp_details_in.address_id);
    END IF;

END;

END;
/
对象类型:

create or replace TYPE trees_type_t  AS TABLE OF tree_obj_type;

请建议并帮助我。

首先,我假设既然您接受了一个集合,那么您的目的就是迭代集合中的每个元素。您的代码没有循环,我想您应该没有循环。其次,我假设集合是密集的(即没有未填充的索引)

你可能想要像这样的东西

FOR i IN 1 .. p_emp_details_in.count 
LOOP
  IF p_emp_details_in(i).employee_id IS NOT NULL
  THEN 
    INSERT into emp (employee_id, address)
      values(p_emp_details_in(i).employee_id, p_emp_details_in(i).address_id);
  END IF;

  IF p_emp_details_in(i).manager_id IS NOT NULL
  THEN
    INSERT into manager (manager_id, address)
      values(p_emp_details_in(i).manager_id,p_emp_details_in(i).address_id);
  END IF;
END LOOP;
当然,如果您不需要使用PL/SQL,您可以使用一个
INSERT ALL

INSERT ALL
  WHEN employee_id IS NOT NULL
    INTO emp(employee_id, address) VALUES( employee_id, address )
  WHEN manager_id IS NOT NULL
    INTO manager( manager_id, address ) VALUES( manager_id, address )
SELECT employee_id, manager_id, address
  FROM TABLE( p_emp_details_in );

你的代码将无法工作。p_emp_details_in是一个集合。您必须对其进行迭代才能获得每个对象的值。
INSERT ALL
  WHEN employee_id IS NOT NULL
    INTO emp(employee_id, address) VALUES( employee_id, address )
  WHEN manager_id IS NOT NULL
    INTO manager( manager_id, address ) VALUES( manager_id, address )
SELECT employee_id, manager_id, address
  FROM TABLE( p_emp_details_in );