我在第二行执行此PL / SQL时出现oracle错误:SELECT .... 但是为了上帝的缘故!我已经检查过是否存在空值
IF zocRole IS NOT NULL and devices.unit_id IS NOT NULL THEN
SELECT unit_role_id INTO unitRoleId FROM T_UNIT_ROLE WHERE role_id = zocRole AND unit_id = devices.unit_id;
END IF;
答案 0 :(得分:1)
如上所述,抛出此异常是因为隐式游标不返回任何行。如果返回多行,您也会收到异常。
您可以改为使用显式游标Oracle Documents这实际上只是一个命名的SQL语句(如果您愿意,可以在其中传递参数)。
然后打开游标,获取(每次获取将尝试检索一行)并关闭。然后,您可以检查fetch是否返回任何数据。编码需要稍长的时间,但看起来更干净。
我记得几年前关于隐式游标与显式游标的相对速度存在争议,但我很久没有听到有人谈论这个问题,所以我认为它们的表现相同
答案 1 :(得分:-2)
控制过程/函数plsql中执行的最佳方法是添加块:BEGIN / EXCEPTION。
IF zocRole IS NOT NULL AND devices.unit_id IS NOT NULL
THEN
BEGIN
SELECT unit_role_id
INTO unitRoleId
FROM T_UNIT_ROLE
WHERE role_id = zocRole
AND unit_id = devices.unit_id
;
EXCEPTION
WHEN OTHERS
THEN dbms_output.put_line(SQLCODE||'-'||SUBSTR(SQLERRM, 1, 200));
END
;
END IF
;