2016-11-26 3 views
0

customerテーブル、customer_orderテーブル、およびline_itemテーブルから顧客を削除するストアドプロシージャを作成する方法を理解しようとしています。ここに表があります。私はそれを実行しようとすると、私はSPOracle DBMSでレコードを削除するためのストアドプロシージャ

CREATE OR REPLACE PROCEDURE DELETE_CUSTOMER(
              customer_id_arg IN DECIMAL, 
              first_name_arg  IN VARCHAR, 
              last_name_arg  IN VARCHAR 
              ) IS 
BEGIN 
    DELETE FROM CUSTOMER 
      WHERE customer_id IN (SELECT customer_last 
            FROM Customer 
           WHERE customer_id = customer_id_arg); 
END; 

のためにこれまで持っているもの。ここ

CREATE TABLE customer(
    customer_ID DECIMAL(10) NOT NULL, 
    customer_first VARCHAR(30), 
    customer_last VARCHAR(40), 
    customer_total DECIMAL(12, 2), 
    PRIMARY KEY (customer_ID)); 

CREATE TABLE customer_order (
order_id DECIMAL(10) NOT NULL, 
customer_id DECIMAL(10) NOT NULL, 
order_total DECIMAL(12,2), 
order_date DATE, 
PRIMARY KEY (ORDER_ID), 
FOREIGN KEY (CUSTOMER_ID) REFERENCES customer); 

CREATE TABLE line_item(
order_id DECIMAL(10) NOT NULL, 
item_id DECIMAL(10) NOT NULL, 
item_quantity DECIMAL(10) NOT NULL, 
line_price DECIMAL(12,2), 
PRIMARY KEY (ORDER_ID, ITEM_ID), 
FOREIGN KEY (ORDER_ID) REFERENCES customer_order, 
FOREIGN KEY (ITEM_ID) REFERENCES item); 

は、それがレコードを削除しないと、私は何をすべきかについては混乱しています。

+1

'delete'の後に' commit'を実行してみてください。 –

+0

FKの参照を「ON DELETE CASCADE」(https://www.techonthenet.com/oracle/foreign_keys/foreign_delete.php)として作成すると、子レコードの削除が自動的に処理されます。 – OldProgrammer

+0

ポイントでは直接ではありませんが、あなたは 'customer_id IN(SELECT customer_last ...')に何を期待しましたか? –

答えて

0

ここでは、database_dictionaryを使用してすべての子テーブルにカスケードする親テーブルからデータを削除するためのサンプルコードを書いてあります;-) pk = '38B567E2909447868ABDDF500B78F2A3'の最後の行を削除してください。容易に一般化することができる。追加するもう1つの問題は、2つ以上の列の主要な制約がある場合、このスクリプトは機能しません。

declare 
    TYPE cur_typ IS REF CURSOR; 
    procedure delete_from_sub_table_first(p_current_table_name varchar2, l_parent_key_value varchar2) is 
    c cur_typ; 
    child_table_pm_key_value varchar2(255); 
    begin 
    for childConsRecord in (select ac.table_name child_table, acc.column_name Child_column, rac.table_name, racc.COLUMN_NAME, (select column_name from ALL_CONS_COLUMNS accpm, all_constraints acpm where accpm.constraint_name = acpm.constraint_name and acpm.CONSTRAINT_TYPE = 'P' and ac.TABLE_NAME = acpm.TABLE_NAME) child_table_pm_key 
        from ALL_CONS_COLUMNS acc, all_constraints ac, ALL_CONS_COLUMNS racc, all_constraints rac 
        where acc.CONSTRAINT_NAME = ac.CONSTRAINT_NAME 
        and ac.CONSTRAINT_TYPE = 'R' 
        and racc.CONSTRAINT_NAME = rac.CONSTRAINT_NAME 
        and rac.constraint_name = ac.R_CONSTRAINT_NAME 
        and rac.table_name = p_current_table_name) loop 
     OPEN c FOR 'select ' || childConsRecord.child_table_pm_key || ' child_value FROM ' || childConsRecord.child_table || ' where ' || childConsRecord.Child_column || ' = :1' using l_parent_key_value; 
     LOOP 
      FETCH c INTO child_table_pm_key_value; 
      EXIT WHEN c%NOTFOUND; 
      -- process row here 
      delete_from_sub_table_first(childConsRecord.child_table, child_table_pm_key_value); 
     END LOOP; 
     close c; 
     EXECUTE IMMEDIATE 'DELETE FROM ' || childConsRecord.child_table || ' where ' || childConsRecord.Child_column || ' = :1' using l_parent_key_value;   
    end loop; 
    end; 
begin 
    delete_from_sub_table_first('PERSON', '38B567E2909447868ABDDF500B78F2A3'); 
    delete from person where pk = '38B567E2909447868ABDDF500B78F2A3'; 
end; 
/
関連する問題