Oracle-未发现数据错误,但有数据

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

我有一个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.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中的键值。