在脚本中的Where子句中的变量使用

时间:2018-06-08 20:51:44

标签: oracle plsql

我不确定是否在行变量中使用了一个字段,该变量已经加载到'for'循环中。

declare
    r_pers_rec   &appOwner..personsTbl%ROWTYPE;

    cursor getItems is
            SELECT Fld1, Fld2
            FROM srcTbl;
begin
    for Rec in getItems 
    loop
        BEGIN
            SELECT * INTO r_pers_rec
            FROM   &appOwner..personsTbl
            WHERE  personnel_id = Rec.Fld1;
        END;
    end loop;
end;

可以Rec.Fld1这样使用吗?

1 个答案:

答案 0 :(得分:1)

您问题的简单答案是"是的,您可以在rec.Fld1子句中使用WHERE,如图所示"。

很长的答案是"是的,但总的来说,如果从SQL * Plus或其他一些解释替换变量的客户端(此处为&appOwner)运行,您的脚本将只能正常运行,其方式与SQL * Plus。您还应该为NO_DATA_FOUND设置一个异常处理程序,因为如果对于给定值的SRCTBL.FLD1" PERSONSTBL没有值,则第二个SELECT可能抛出该异常。

也许最好的答案是"只是摆脱问题"。通过将其构建到游标中来重写脚本以消除第二个SELECT,如下所示:

BEGIN
  FOR aRec IN (SELECT s.FLD1, s.FLD2, p.*
                 FROM srcTbl s
                 INNER JOIN &appOwner..personsTbl p
                   ON p.PERSONNEL_ID = s.FLD1)
  LOOP
    NULL;  -- Do whatever you need to do with your data here.
  END LOOP;
END;

作为一个比我更聪明的人,曾经观察过,"我知道我在编写代码的时候并没有什么可以补充的,但是当没有什么东西可以带走时,#34;

以上内容与原始代码相同,只是第二个选择不能抛出NO_DATA_FOUND异常 - 相反,如果SRCTBL.FLD1的值为,则不会返回任何行在PERSONSTBL表上找不到。

如果您确实希望返回SRCTBL到始终的数据,无论是否在PERSONSTBL上找到匹配的数据,请将脚本更改为

BEGIN
  FOR aRec IN (SELECT s.FLD1, s.FLD2, p.*
                 FROM srcTbl s
                 LEFT OUTER JOIN &appOwner..personsTbl p
                   ON p.PERSONNEL_ID = s.FLD1)
  LOOP
    NULL;  -- Do whatever you need to do with your data here. Note that in
           -- this case the PERSONSTBL values in aRec will not be populated
           -- (all will be NULL) if there is no matching row on PERSONSTBL
           -- for a given value of SRCTBL.FLD1
  END LOOP;
END;

祝你好运。