代码之家  ›  专栏  ›  技术社区  ›  user26814368

Oracle在触发器中过滤错误数据

  •  1
  • user26814368  · 技术社区  · 10 月前

    在触发器中,我有以下SQL行:

    select p.place 
    into place
    from places p
    where p.prime_commodity = p_Comm;
    
    for x in (select * from some_table s where s.place = place) 
    

    这将返回中的每一行 some_table ,不按“位置”过滤任何内容,并遗漏了一些应该在那里的行。

    不过,这工作得很好:

    for x in (select * from some_table s where s.place = 'ABC') 
    

    例子: some_table :

    地点 原地 InsState
    * * A.
    * 基础知识 A.
    基础知识 * D
    基础知识 基础知识 A.

    代码:

    select '*' 
    into place
    from places p
    where p.prime_commodity = p_Comm   -- doesn't matter, select '*' into place will select only '*', 
    
    select listagg(s.place || ' ' || s.insplace || ' ' || s.insstate, chr(10)) within group (order by txt) 
    into dummy from some_table s
    where s.place = place; -- <-- doesn't work
    
    raise_application_error(-20001,place || chr(10) || dummy); -- only for debugging in trigger
    

    预期:

    *
    * * A
    * ABC A
    

    实际结果:

    *
    * * A
    * ABC A
    ABC * D
    ABC ABC A
    

    (无论如何,所有行,“where s.place=place”都可以注释,结果甚至不会改变)

    它能修好吗?我错过了什么?难道那个地方是“*”符号吗?是否因为某种原因,oracle将其用作触发器内的“任何”符号?

    在正常的SQL窗口中,它的任何一个都像它应该的那样工作,只有在触发器中它才会做这种恶作剧。

    在我使用之前:

    CONTINUE when x.place <> place;
    

    在for循环开始时,但现在它没有返回一些应该返回的行,结果如下

    *
    * * A    <- wheres "* ABC A" row?
    ABC * D
    ABC ABC A
    

    我也试过:

    select * 
    from some_table s 
    where s.place = place 
    

    在触发器中

    预期:s.place=place的行

    结果:所有行

    1 回复  |  直到 10 月前
        1
  •  1
  •   Littlefoot    10 月前

    这是错误的:

    select * from some_table s where s.place = place) 
                                     ---------------
                                       this
    

    切勿将变量命名为与列名相同的名称;它和你用的一样 where 1 = 1 (即根本没有过滤)。

    将变量重命名为例如。 v_place 那么

    select p.place 
    into v_place              --> this
    from places p
    where p.prime_commodity = p_Comm;
    

    最后:

    ... where s.place = v_place)