制作插入/更新数量的程序。我究竟做错了啥?

Posted

技术标签:

【中文标题】制作插入/更新数量的程序。我究竟做错了啥?【英文标题】:Making procedure to insert/update qty. What am I doing wrong?制作插入/更新数量的程序。我究竟做错了什么? 【发布时间】:2019-01-16 20:05:18 【问题描述】:

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

我尝试过插入、更新两者,但都不起作用。

    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;

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

【问题讨论】:

您定义了一个游标,但是您在哪里打开它并将其提取到 v_qty 中?照原样 v_qty 为 NULL,任何与 NULL 的比较都会导致错误。 【参考方案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;

【讨论】:

【参考方案2】:

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

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

   OPEN q1;
   FETCH q1 INTO v_qty;
   CLOSE q1;

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

【讨论】:

以上是关于制作插入/更新数量的程序。我究竟做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章

SpriteKit 动画没有在它应该加载的时候加载。我究竟做错了啥?

我究竟做错了啥? NSFileManager 问题

“找不到适合 jdbc:sqlite 的驱动程序”问题。我究竟做错了啥?

我究竟做错了啥?角垫形式场

MySQL 使用 select 和 join 插入 post_meta - 我做错了啥?

“多重定义”错误。我究竟做错了啥?