-1

テーブルAを親テーブルとし、テーブルBをテーブルAとの外部キー制約を持つ子テーブルとして、2つのテーブル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

親テーブルのテーブル A のデータを検証した後、テーブル B にデータを挿入する pl/sql プロシージャを作成しようとしています。

シナリオ 1: 親テーブルのテーブル A でデータが利用可能で、テーブル B にのみデータを挿入する場合。

シナリオ 2: 親テーブルのテーブル A にデータがない場合は、テーブル A に NAME を挿入し、テーブル B に ORDER データを挿入します。

シナリオ 2 では、次の 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 を達成するために助けが必要です。両方のシナリオを最適な方法で達成するための他の提案を楽しみにしています。

4

3 に答える 3

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);
于 2013-07-27T19:50:11.697 に答える
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;
于 2013-07-27T22:05:16.107 に答える
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;                        
于 2013-07-27T19:28:38.263 に答える