2017-05-19 2 views
0

Ich habe eine temporäre Tabelle, Daten, in denen sqlldr geladen wird. Die Daten in der temporären Tabelle wird wie folgt hinzugefügt:Daten nicht korrekt durch gespeicherte Prozedur hinzugefügt (Oracle 11g R2)

PHONE  ADDRESS  ORDER_ID 
9971410000 D-166 GF 1 
9910020000 H-12D  2 
9873120000 K-19C  3 
9811120000 J-200  4 
9873120000 K-19C  5 
9810320000 N-29B  6 
9810390000 J-235 GF 7 
9873500000 M-39  8 
8447910000 J-62 GF  9 
9873120000 K-19C  10 

Nachdem die Daten in der ‚Temp‘ Tabelle eingefügt wird, ein Trigger einer Prozedur-Aufrufe in andere Tabellen einzufügen:

create or replace TRIGGER insert_customer 
AFTER INSERT ON temp 
FOR EACH ROW 
BEGIN 
    insert_address(:new.phno, :new.addr, :new.ord_id); 
END; 

Das Verfahren lautet wie folgt:

create or replace procedure INSERT_ADDRESS(
    p_cust_phone customer.cust_phone%type, 
    p_address address.address%type, 
    p_ord_id customer_order.order_id%type 
    ) 
    is 
    l_cust_id customer.cust_id%type; 
    l_address_id address.address_id%type; 
    begin 
    begin 
     select cust_id 
     into l_cust_id 
     from customer c 
     where c.cust_phone=p_cust_phone; 
    exception 
     when no_data_found then 
     insert into customer 
     values (cust_id_seq.nextval, 'No Name', p_cust_phone) 
     returning cust_id into l_cust_id; 
    end; 

     select address_id 
     into l_address_id 
     from address a 
     where a.address=p_address; 
    exception 
     when no_data_found then 
     insert into address 
     values (address_id_seq.nextval, UPPER(p_address), UPPER(p_area)) 
     returning address_id into l_address_id; 

    insert into customer_address 
    values (l_cust_id, l_address_id); 

    insert into customer_order (order_id, cust_id) 
    values (p_ord_id,l_cust_id); 

    end; 

Die in die Tabelle CUSTOMER_ORDER eingefügten Daten sind nicht korrekt. Das Ergebnis, das ich auf der folgende Abfrage erhalten ist unten aufgeführt:

select * from customer_order; 

ord_id cust_id 
1   1 
2   2 
3   3 
4   4 
6   5 
7   6 
8   7 
9   8 

Order_id (5,10) verloren, da sie aus den gleichen Kunden wie ord_id = 3 kommen. Mehrere Bestellungen desselben Kunden werden nicht in der Tabelle customer_order hinzugefügt. Ich kann nicht verstehen, wo ich einen Fehler gemacht habe.

Antwort

1

Das Problem ist, dass Ihre Einfügung in customer_order nur stattfindet, wenn die Adresse, die übergeben wird, nicht bereits in der Adresstabelle existiert - Sie haben es in der Ausnahmeklausel der Prozedur insert_address.

Was ich stattdessen tun würde, ist ein Paket zu erstellen, und dann die Schritte zu haben, um die Kunden- und Adressdetails als separate Funktionen zu erhalten/zu speichern. Auf diese Weise erhalten Sie einfacher Code zu verstehen, die usw. es leichter zu pflegen, zu debuggen macht

Etwas wie:

CREATE OR REPLACE PACKAGE BODY customer_pkg 
AS 
    FUNCTION get_customer_id (p_cust_phone customer.cust_phone%TYPE) 
    RETURN customer.cust_id%TYPE 
    IS 
    l_cust_id customer.cust_id%TYPE; 
    BEGIN 
    SELECT cust_id 
    INTO l_cust_id 
    FROM customer 
    WHERE cust_phone = p_cust_phone; 

    EXCEPTION 
    WHEN no_data_found THEN 
     INSERT INTO customer (cust_id, cust_name, cust_phone) 
     VALUES (cust_id_seq.nextval, 'No Name', p_cust_phone) 
     RETURNING cust_id INTO l_cust_id; 
    END get_customer_id; 

    FUNCTION get_address_id (p_address address.address%TYPE) 
    RETURN address.address_id%TYPE 
    IS 
    l_address_id address.address_id%TYPE; 
    BEGIN 
    SELECT address_id 
    INTO l_address_id 
    FROM address 
    WHERE address = p_address; 

    EXCEPTION 
    WHEN no_data_found THEN 
     INSERT INTO address (address_id, address) 
     VALUES (address_id_seq.nextval, p_address) 
     RETURNING address_id INTO l_address_id; 
    END get_address_id; 

    PROCEDURE insert_order(p_cust_phone customer.cust_phone%TYPE, 
         p_address address.address_i%TYPE, 
         p_ord_id  customer_order.order_id%TYPE) 
    IS 
    l_cust_id customer.cust_id%TYPE; 
    l_address_id address.address_id%TYPE; 
    BEGIN 
    l_cust_id := get_customer_id (p_cust_phone => p_cust_phone); 
    l_address_id := get_address_id (p_address => p_address); 

    INSERT INTO customer_order (order_id, cust_id) 
    VALUES (p_ord_id, l_cust_id); 
    END insert_order; 

END customer_pkg; 
/

Dann wird Ihr Trigger würde wie folgt aussehen:

create or replace TRIGGER insert_customer 
AFTER INSERT ON temp 
FOR EACH ROW 
BEGIN 
    customer_pkg.insert_order(p_cust_phone => :new.phno, 
          p_address => :new.addr, 
          p_ord_id => :new.ord_id); 
END insert_customer; 
+0

Ihr Verfahren ist richtig, aber es vermisst eine Sache. Wo fügen Sie Zeilen in die 'CUSTOMER_ADDRESS'-Tabelle ein, die die Junction-Tabelle zwischen' CUSTOMER 'und' ADDRESS 'ist. Die cust_id und die address_id sollen ebenfalls in die CUSTOMER_ADDRESS-Tabelle eingefügt werden, um sie zu verknüpfen –

+0

Ich bin sicher, Sie kann sich meine Prozedur ansehen und herausfinden, wo Sie die zusätzliche Einfügung hinzufügen müssen – Boneist

+0

Die Werte von 'l_cust_id' und 'l_address_id' werden zusammen benötigt, um die Einfügung auf der CUSTOMER_ADDRESS durchzuführen, da beide in verschiedenen Funktionen sind, wie verwende ich Das war das Problem, aufgrund dessen ich das gleiche Verfahren verwendet habe, um in alle Tabellen einzufügen.Ich bin relativ neu bei pl/sql. –

Verwandte Themen