【问题标题】:How to validate or get the value from the Input parameter of (Type Table) in Stored procedure in Oracle PL SQL?如何验证或获取 Oracle PL SQL 存储过程中(类型表)的输入参数的值?
【发布时间】:2020-01-20 14:22:32
【问题描述】:

我需要在存储过程中检查输入参数中的值是否为 NULL 或 NOT。输入参数是表格类型,其中包含嵌套对象。它包含 3 个属性 - 员工 ID、经理 ID 和地址。我需要检查 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), 
  );

请建议并帮助我。

【问题讨论】:

  • 您的代码将不起作用。 p_emp_details_in 是一个集合。您必须对其进行迭代以获取每个对象值。

标签: oracle object stored-procedures input types


【解决方案1】:

首先,我假设由于您接受一个集合,您的意图是遍历集合中的每个元素。您的代码没有我认为您打算拥有的循环。其次,我假设集合是密集的(即没有未填充的索引)

你可能想要类似的东西

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 );

【讨论】:

    猜你喜欢
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    相关资源
    最近更新 更多