Oracle-未发现数据错误,但有数据
我有一个PL/SQL块,我把它放入存储过程中,以便调试它。下面是一段伪代码来描述PL/SQL块:Oracle-未发现数据错误,但有数据,oracle,stored-procedures,plsql,cursor,Oracle,Stored Procedures,Plsql,Cursor,我有一个PL/SQL块,我把它放入存储过程中,以便调试它。下面是一段伪代码来描述PL/SQL块: CREATE OR REPLACE PROCEDURE SPROC_A AS CURSOR CURSOR_A IS SELECT ID, YEAR FROM TABLE_A; vNAME VARCHAR2(200) := NULL; BEGIN FOR REC IN CURSOR_A LOOP BEGIN SELECT NVL(B.FIEL
CREATE OR REPLACE PROCEDURE SPROC_A AS
CURSOR CURSOR_A IS
SELECT ID, YEAR
FROM TABLE_A;
vNAME VARCHAR2(200) := NULL;
BEGIN
FOR REC IN CURSOR_A LOOP
BEGIN
SELECT NVL(B.FIELD_1, B.FIELD_2) INTO vNAME --the sproc breaks here--
FROM TABLE_B B
WHERE B.ID = REC.ID
AND B.YEAR = REC.YEAR
EXCEPTION
WHEN NO_DATA_FOUND THEN
vNAME := NULL;
END;
UPDATE TABLE_C C
SET C.NAME = vNAME
WHERE C.ID = REC.ID
AND C.YEAR = REC.YEAR;
END LOOP;
END;
如果我独立运行此部分并为REC.ID和REC.YEAR提供自己的值,则返回数据:
SELECT NVL(B.FIELD_1, B.FIELD_2) --INTO vNAME
FROM TABLE_B B
WHERE B.ID = REC.ID
AND B.YEAR = REC.YEAR
此外,我试图选择数据的变量是数据类型VARCHAR2(200)-表_B.FIELD_1和表_B.FIELD_2都是数据类型VARCHAR2(40),因此数据类型不应该不匹配
这里还缺少什么?假设您不只是有未提交的数据,那么当您为表A中的每一对值手动运行该查询时,是否返回了数据,或者您只是尝试了一组数据?您是否调试过REC值,以便在它失败之前立即查看它?(您正在挤压异常,因此不太确定如何知道发生了什么…)。假设您的实际代码更复杂-否则,为什么不加入游标查询,或者只执行一次相关更新而不执行循环?处理异常的更好方法是什么?如果B中没有匹配的数据,则可以将默认值设置为null,但是,唯一可以判断发生了什么的方法是,如果您看到您将表_c中的一行更新为null,即使如此,也假定表_b.field_2不能为null。你说程序在该选择处“中断”,但当你捕获到没有发现的数据时,它不会以明显的方式“中断”它?表b.field_2可以为空,在这种情况下,我意识到表c中的字段实际上没有被更新为空。在所指示的行中,如果
没有找到数据
,它不会失败,因为您显式地处理该异常。但是select id,表a中的年份减去select id,表b中的年份
将列出存在于a中但不存在于b中的键值。