【发布时间】: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”括在单引号中?它们应该是变量,不是吗?