制作插入/更新数量的步骤。我究竟做错了什么?

时间:2019-01-16 20:05:18

标签: sql oracle plsql oracle11g

我正在尝试执行从prod_result表中计算每个托盘的总板坯编号的过程,并将该计数插入或更新到具有相同托盘#(plt_no)的plt_result表中的qty列

我尝试插入,同时更新两者,但不起作用。

    create or replace PROCEDURE update_qty 
    is
        v_plt_no nvarchar2(20);
        v_qty number;

        cursor q1 is
        select count(slab_no) 
        into v_qty
        from prod_result 
        where plt_no = v_plt_no;

     begin

        if v_qty > 0 then
        update plt_result
        set qty = 'v_qty'
        where plt_no = v_plt_no;
        end if;
     end;

我在这里做错了什么?请帮助。

2 个答案:

答案 0 :(得分:1)

我不确定要查找的是哪个版本-是循环遍历表中所有PLT_NO的那个,还是应该接受PLT_NO作为参数的那个。这是两个选项,请查看它们是否有帮助。

第一个使用游标的FOR循环;由于Oracle为您完成了大部分 dirty 任务(打开游标,获取,退出循环,关闭游标),因此维护起来更加容易。

create or replace procedure update_qty
is
begin
  for cur_r in (select plt_no, count(slab_no) v_qty
                from prod_result
                group by plt_no
               )
  loop
    if cur_r.v_qty > 0 then
       update plt_result r set
         r.qty = cur_r.v_qty
         where r.plt_no = cur_r.plt_no;
    end if;
  end loop;
end;

第二个参数接受PLT_NO作为参数:

create or replace procedure update_qty 
  (par_plt_no in prod_result.plt_no%type)
is
  v_qty number;
begin
  select count(p.slab_no)
    into v_qty
    from prod_result p
    where p.plt_no = par_plt_no;

  if v_qty > 0 then
     update plt_result r set
       r.qty = v_qty
       where r.plt_no = par_plt_no;
  end if;
end;

答案 1 :(得分:0)

类似于以下内容,您实际上在其中打开并从游标获取。您必须为v_plt_no分配一个值,光标才能获取任何内容。

<connectionType value="System.Data.SqlClient.SqlConnection, System.Data" />