创建一个存储过程以根据输入参数 (id, arrayOfNo []) 从员工 (first table) 和订单 (second table) 中删除记录

Create a Stored Procedure to Delete Records from employee(first table) and orders(second table) based on input params (id, arrayOfNo [])

我有两个 table,employees(company_id,employee_num)和 orders(employee_num,order_description).

如果用户发送过程参数 company_id, employe_num (1, [911,912]) 那么如果 employees table 有更多员工编号为 1 那么我们应该删除其他员工编号行,例如如果它有 [911,912,913] 员工编号和 1 那么它应该从 913 中删除该行作为 emp_num 并删除订单中的所有记录(table 两个)其中 emp_num 是 913

ex(程序):

    CREATE OR REPLACE FUNCTION deleteEmployeeOrders(P_company_id bigint, orders_array  arrayType[] ) RETURNS INT AS $$
 DECLARE
         orders_array  arrayType;
 DECLARE
         order  arrayType;
 DECLARE
         status_code integer;
 BEGIN
   status_code:= -1;

   FOR line IN (SELECT * FROM employees where company_id = p_company_id)
         LOOP
             if exists(select * from  employees where emp_num = order.emp_num not in orders_array)
THEN
                delete from employees where employee_num = order.employee_num;
                DELETE FROM orders WHERE employee_num = order.employee_num;
         END LOOP;
   status_code = 1;
   return status_code;
 END;
 $$ LANGUAGE plpgsql;

例如

 :select deleteEmployeeOrders(1,[911,912])

它应该在行 table1 中删除 913 作为 emp no,并删除 table2 中的所有行,其中 emp_num 913

在您的示例中,您似乎想要删除给定 company_id 的所有员工(和相关订单)记录。那是对的吗?如果是这样,您可以使用两个简单的 DELETE:

-- Delete all orders related to employees for given "company_id"
DELETE FROM orders 
WHERE employee_num IN (
  SELECT employee_num 
  FROM employees 
  WHERE company_id = p_company_id
);

-- Delete employees for given "company_id"
DELETE FROM employees
WHERE company_id = p_company_id;

它们应该在同一个事务中完成,所以它们要么全部工作要么全部失败。此外,您应该先执行 "orders" DELETE,以便您可以在员工 table.

中引用员工

如果这不是您需要的,请更准确地解释一下您要找的是什么。如果您只指定员工 (911,912),我不太遵循您删除员工 913 示例中的逻辑。

已更新

将 DELETE 语句修改为 运行 针对 employee_num 值不存在于 arrayOfNo 数组中:

-- Delete all orders related to employees for given "company_id"
DELETE FROM orders 
WHERE employee_num IN (
  SELECT employee_num 
  FROM employees 
  WHERE company_id = p_company_id
  AND employee_num <> ALL(arrayOfNo) -- Get employees NOT IN arrayOfNo list
);

-- Delete employees for given "company_id"
DELETE FROM employees
WHERE company_id = p_company_id
AND employee_num <> ALL(arrayOfNo) -- Get employees NOT IN arrayOfNo list
;

同样,这两个语句应该 运行 作为单个事务。让我知道是否有效。