2013-07-27 28 views
-1

我已具有表A.需要父表PL/SQL

外鍵約束繼創建兩個表A和B表A作爲父表,表B中的子表來驗證數據的內容表A

CUS_ID NAME 
1  MICHAEL 
2  SANDRO 
3  ROBERT 

以下是表B

CUS_ID  ORDER 
    2  PIZZA 
    3  BURGER 

的內容,我將在下面的格式在插入於上述表得到的輸入數據。

NAME  ORDERS 
SANDRO BURGER 
ROBERT PIZZA 

我想創建一個PL/SQL過程中父表的表A.確認數據後,將數據插入到表B

場景1:如果數據是在父表A,然後可用只在表B中插入數據

情形2:如果數據不是父表A可用,然後插入在NAME表A,然後ORDER數據插入到表B.

對於方案2,I我能夠使用以下pl/sql代碼實現它

INSERT INTO TABLE_A (cus_id, name) 
    VALUES (cus_seq.NEXTVAL, NAME) 
    RETURNING cus_id INTO l_cus_id; 

INSERT INTO TABLE_B (cus_id, order) 
    VALUES (order_seq.NEXTVAL, l_cus_id, ORDER); 

我需要幫助實現場景1.即使我期待其他建議,以最佳方式實現兩種場景。

回答

0

您需要將table_a的查找封裝在子例程中。

create or replace procedure place_order 
     (p_name table_a.name%type 
      , p_order table_b.order&type) 
is 
    l_cus_id table_a.cus_id%type; 
    function get_cus_id 
     (p_name table_a.name%type) 
     return table_a.cus_id%type 
    is 
     return_value table_a.cus_id%type; 
    begin 
     begin 
      select cus_id into return_value 
      from table_a 
      where name = p_name; 
     exception 
      when no_data_found then 
       insert into table_a (cus_id, name) 
       values (cus_seq.nextval, p+name) 
       returning cus_id into return_value; 
     end; 
     return return_value; 
    end get_cus_id; 
begin 
    l_cus_id := get_cus_id(p_name); 
    insert into table_b (cus_id, order) 
    values (l_cus_id, order); 
end place_order;       
+0

謝謝!你的解決方案最適合我 – Mohan

0

試試這個辦法

BEGIN 
     SELECT cus_id INTO l_cus_id 
     FROM table_a 
     WHERE table_a.name = l_cust_name; 
    EXCEPTION 
     WHEN NO_DATA_FOUND THEN 
      INSERT INTO TABLE_A (cus_id, name) 
      VALUES (cus_seq.NEXTVAL, l_cust_name) 
      RETURNING cus_id INTO l_cus_id; 
    END; 
    INSERT INTO table_b (ord_id, cus_id, "ORDER") 
    VALUES (order_seq.NEXTVAL, l_cus_id, l_order); 
+0

謝謝Kordirko! – Mohan

0

可以試試這個

CREATE or REPLACE procedure place_order 
    (p_name table_a.name%type 
     , p_order table_b.order&type) 
     is 
     v_cnt number; 
     BEGIN 
     SELECT count(name) into v_cnt from a where name=p_name; 
     INSERT into table_b values(p_name,p_order); 
     EXCEPTION 
     when NO_DATA_FOUND 
      insert into table_a values (cus_seq.nextval,p_name); 
     insert into table_b values(p_name,p_order); 
     END; 
+0

謝謝Harshit!你的回答幫了我很多 – Mohan