2017-12-28 6 views
0

employees(company_id、employee_num)とordersの2つのテーブルがあります(employee_num、order_description )。入力パラメータ(ID、arrayOfNo [])に基づいて、従業員(最初のテーブル)と受注(2番目のテーブル)からレコードを削除するストアドプロシージャを作成

ユーザーがcompany_idemploye_num(1、[911912])のparams手順を送信した場合employeesテーブルにはIDが1のより多くの従業員番号を持っている場合、それは[911912913]従業員番号を持っているかのように、我々は、その後1で追加の従業員番号の行を削除する必要がありますemp_num 913

EX(手順)であり、それはemp_numとして913から行を削除し、注文内のすべてのレコードを削除すべきである(表2):例えば

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; 

あなたはすべての従業員(および関連順)を削除するよう

それが行TABLE1に無EMPとして913を削除し、あなたの例ではemp_num 913

答えて

0

table2の中のすべての行を削除する必要があり、それが聞こえるのレコード指定されたcompany_id。あれは正しいですか?もしそうなら、あなたは2つの単純な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を先に実行して、employees表の従業員を参照できるようにする必要があります。

これが必要なものでない場合は、探しているものを少し正確に説明してください。あなたの従業員(911,912)のみを指定した場合、私は従業員913を削除するというあなたの例のロジックにはほとんど従っていません。

はarrayOfNo配列に存在しないemployee_num値に対して実行する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 
    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 
; 

は再び、2つのステートメントは、単一のトランザクションとして実行する必要があります。そのことが分かれば教えてください。

+0

例:現在IDが1の従業員には3人の従業員がいます。しかし、2つの従業員numを渡すとき。これらの2つのレコードは、私が渡したものではなく、テーブルに存在するレコードを削除する必要があります。 – Sunanda

+0

そして私は従業員番号の配列リストを手続きに渡すつもりです。配列をチェックする必要があります – Sunanda

+0

したがって、orders_arrayにないemp_num値のレコードを削除したいだけですか?もしそうであれば、私は上記のロジックでこのDELETE文を修正することができます。そのように(2つのバッチDELETEステートメントを使用して)行うことができれば、それはLOOPで行うよりも優れているため、複数の個別のDELETEステートメントが実行されます。 – ravioli

関連する問題