【问题标题】:How to FETCH perticular records from table1 and INSERT into table2?如何从 table1 和 INSERT 获取特定记录到 table2?
【发布时间】:2020-08-14 16:44:42
【问题描述】:

Image_1 是“table_1:-Product”

图片 2 是“table_2:-User_detail”

现在, 我想使用带有“提示”的特定“p_id”从table_1(p_name,p_amount)中选择数据,并在特定选择“u_id”时插入table_2(purchased_item,amount_total,due_date)

  • p_name->购买的物品
  • p_amount->amount_total
  • due_date 是系统日期

预期输出:- 如果我从 table_1 中选择“p_id=101”,从 table_2 中选择“u_id=3676”,那么 我在 table_2 中得到了这个更新 ---

“第 1 行”

u_id:-3676
u_name:-Rv
email:-rv@gmail.com
purchased_item:-LED
amount_total:-5000
due_date:-sysdate

请帮帮我,这怎么可能? 使用程序还是使用触发器?

感谢高级。

我是新的 pl/sql 学习者。

【问题讨论】:

    标签: sql database oracle plsql oracle12c


    【解决方案1】:

    这怎么可能?用过程还是用触发器?

    我猜也不是。 UPDATE 可以。

    update user_detail d set
      (d.purchased_item, d.amount_Total, d.due_Date) =
      (select p.p_name, p.p_amount, sysdate
       from product p
       where p.p_id = :par_p_id
      )
    where d.u_id = :par_u_id;
    

    如果它必须是一个过程,那么

    create or replace procedure p_iud (par_p_id in product.p_id%type,
                                       par_u_id in user_detail.u_id%type
                                      )
    as
    begin
      update user_detail d set
        (d.purchased_item, d.amount_Total, d.due_Date) =
        (select p.p_name, p.p_amount, sysdate
         from product p
         where p.p_id = par_p_id
        )
      where d.u_id = par_u_id;
    end;
    /
    

    称之为

    begin
       p_iud(101, 3676);
    end;
    /
    

    如果您想同时传递多个产品,一种选择是将它们作为具有逗号分隔值的字符串传递。然后程序将是

    create or replace procedure p_iud (par_p_id in varchar2,
                                       par_u_id in user_detail.u_id%type
                                      )
    as
    begin
      update user_detail d set
        (d.purchased_item, d.amount_total, d.due_Date) =
        (select listagg(p.p_name, ',') within group (order by p.p_name), 
                sum(p.p_amount), 
                sysdate
         from product p
         where p.p_id in (select to_number(regexp_substr(par_p_id, '[^,]+', 1, level))
                          from dual
                          connect by level <= regexp_count(par_p_id, ',') + 1
                         )
        )
      where d.u_id = par_u_id;
    end;
    /
    

    你会称它为

    begin
       p_iud('101,301', 3676);
    end;
    /
    

    可能的问题:由于LISTAGG 连接所有这些产品名称,如果这样的“长”字符串对于PURCHASED_ITEM 列来说太长,它将失败(如果这是一个选项,你可以SUBSTR 它)

    【讨论】:

    • 是的,它正在工作......太棒了......如果你不介意我在这个查询中又问了一个问题?
    • 我可以为一个用户选择多个产品吗?例如,我可以调用从 table_1 添加一个或多个产品并将产品添加到 user_detail 表中。并且还有金额总和。
    • 是的,你可以。我添加了更多代码;请看一下。
    • 我非常感谢您先生。真的增加了我的知识和不同的思维方式。现在我将尝试从 table_2 中删除特定产品..我想尝试自己的..如果我不是那么我会接受你的指导,先生。
    猜你喜欢
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多