【问题标题】:No data found error in PLSQL while calling a procedure inside another plsql block在另一个 plsql 块中调用过程时,在 PLSQL 中找不到数据错误
【发布时间】:2018-03-22 13:41:15
【问题描述】:

我正在尝试执行下面的代码块,但即使表中有数据可供处理,也会出现“未找到数据”的错误:

此块正在尝试调用另一个用户定义的过程并从变量传递参数:

DECLARE
   v_file_name   regression_status.file_name%TYPE;
   v_run_no      regression_status.run_no%TYPE;
   v_stream_id   regression_status.stream_id%TYPE;
   v_job_id      regression_status.job_id%TYPE;
   str           VARCHAR2 (100) := 'A ,B ,C ,D';
   v_count       VARCHAR2 (100);
BEGIN
   SELECT COUNT (status)
     INTO v_count
     FROM regression_status
    WHERE status = 'R';

   LOOP
      BEGIN
         FOR i IN (    SELECT TRIM (REGEXP_SUBSTR (str,
                                                   '[^,]+',
                                                   1,
                                                   LEVEL))
                                 l
                         FROM DUAL
                   CONNECT BY LEVEL <= REGEXP_COUNT (str, ',') + 1)
         LOOP
            DBMS_OUTPUT.put_line (i.l);

            SELECT tbl.run_no,
                   TBL.JOB_ID,
                   TBL.STREAM_ID,
                   TBL.FILE_NAME
              INTO v_run_no,
                   v_job_id,
                   v_stream_id,
                   v_file_name
              FROM REGRESSION_STATUS tbl
                   INNER JOIN (  SELECT job_id, MIN (run_no) min_run_no
                                   FROM REGRESSION_STATUS
                                  WHERE status = 'R'
                               GROUP BY job_id) tbl1
                      ON tbl1.job_id = tbl.job_id
             WHERE     tbl1.min_run_no = tbl.run_no
                   AND tbl.file_name LIKE '%' || i.l || '%';

            DBMS_OUTPUT.put_line (
                  'script executing for file : '
               || v_file_name
               || ' '
               || v_stream_id
               || ' '
               || v_run_no
               || ' '
               || v_job_id
               || ' ');

            MAIN_PKG.PROC (v_run_no,
                           'v_job_id',
                           SUBSTR (v_stream_id, 0, 2),
                           'v_file_name');

            UPDATE regression_status
               SET status = 'S', end_time = SYSDATE
             WHERE file_name = v_file_name;

            COMMIT;
         END LOOP;
      END;

      EXIT WHEN v_count <= 0;
   END LOOP;
END;

【问题讨论】:

  • 你有许多隐式游标 - 其中任何一个都可能抛出 NO_DATA_FOUND。对过程进行一些调试,并找出引发异常的确切位置。一旦你知道哪个语句没有返回任何行,你就可以开始调查原因
  • MAIN_PKG.PROC (v_run_no, 'v_job_id', SUBSTR (v_stream_id, 0, 2), 'v_file_name');此行抛出错误
  • 在这种情况下,从另一个包中抛出 NO_DATA_FOUND 异常。那是你可以访问的东西吗?如果是这样,那么您需要在那里执行相同的调试。
  • 当我删除 MAIN_PKG.PROC (v_run_no, 'v_job_id', SUBSTR (v_stream_id, 0, 2), 'v_file_name');但它根本没有触及程序,否则我会得到另一个在该程序内部处理的错误。
  • 您发布的代码是真实的吗?为什么将“v_job_id”和“v_file_name”括在单引号中?它们应该是变量,不是吗?

标签: oracle plsql


【解决方案1】:

唯一可以返回NO-DATA-FOUNDSELECT是这样的:

SELECT tbl.run_no,
       TBL.JOB_ID,
       TBL.STREAM_ID,
       TBL.FILE_NAME
  --INTO v_run_no,        -- intentionally commented
  --     v_job_id,
  --     v_stream_id,
  --     v_file_name
  FROM REGRESSION_STATUS tbl
       INNER JOIN (  SELECT job_id, MIN (run_no) min_run_no
                       FROM REGRESSION_STATUS
                      WHERE status = 'R'
                   GROUP BY job_id) tbl1
          ON tbl1.job_id = tbl.job_id
 WHERE     tbl1.min_run_no = tbl.run_no
       AND tbl.file_name LIKE '%A%';      --> or B / C / D

当您按原样运行它时会发生什么(即复制/粘贴上面的代码),可能是通过更改最后一行(A、B、C、D)?你能验证它是否真的返回了something(是的,我知道 - 你说过它会返回,但 Oracle 不同意)。

【讨论】:

  • 当我删除 MAIN_PKG.PROC (v_run_no, 'v_job_id', SUBSTR (v_stream_id, 0, 2), 'v_file_name') 时,完整的代码工作得非常好;
  • 啊哈,所以在包 (MAIN_PKG) 中的该过程 (PROC) 中引发了错误。您应该调查它在做什么以及哪个 SELECT 引发了错误。
  • 不,它也不会进入该包中...否则我会从日志中收到错误...它仅在传递参数时失败。
  • 都一样,这是最可能的解释。也许main_pkg.proc 在其声明部分中使用了一个数组或其他东西。
猜你喜欢
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多