我不确定是否在行变量中使用了一个字段,该变量已经加载到'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
这样使用吗?
答案 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;
祝你好运。