Как проверить или получить значение из параметра Input (таблицы типов) в хранимой процедуре в Oracle PL SQL? - PullRequest
0 голосов
/ 19 сентября 2019

Мне нужно проверить значение во входном параметре, равно ли оно NULL или НЕ в хранимой процедуре.Входной параметр имеет тип таблицы и содержит вложенный объект.Он содержит 3 атрибута - идентификатор сотрудника, идентификатор менеджера и адрес.Мне нужно проверить, равны ли значения manager_id и employee_id NULL или нет. Исходя из значений NULL, мне нужно вставить их в две разные таблицы.

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;
create or replace TYPE   tree_obj_type AS OBJECT 
   (
    employee_id VARCHAR2(10), 
    manager_id  VARCHAR2(10), 
    address  VARCHAR2(100), 
  );

Пожалуйста, предложите и помогите мне.

1 Ответ

1 голос
/ 19 сентября 2019

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

Вы, вероятно, хотите что-то вроде

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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...