用于删除Oracle DBMS中的记录的存储过程

时间:2016-11-26 14:50:44

标签: sql oracle plsql

尝试弄清楚如何创建将从customer表,customer_order表和line_item表中删除客户的存储过程。这是表格。

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

这是我到目前为止的SP

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;

当我尝试运行它时,它不会删除记录,我很困惑该怎么做。

1 个答案:

答案 0 :(得分:0)

这里有一个示例代码,用于从使用database_dictionary级联到所有子表的父表中删除数据,我写了很多乐趣;-) 请注意最后一行从人员中删除pk =' 38B567E2909447868ABDDF500B78F2A3&#39 ;;很容易被概括。另外要补充一点,如果你有两列或更多列的主要约束,这个脚本不起作用......

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