-1

我创建了两个表 A 和 B,表 A 作为父表,表 B 作为子表,表 A 具有外键约束。

以下是表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。

场景一:如果父表A表中有数据,则只在B表中插入数据。

场景2:如果Parent Table A中没有数据,则将NAME插入到表A中,然后将ORDER数据插入到表B中。

对于场景 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

您需要将 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 回答
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 回答