我是plsql初学者,我发现如果将无效数据提供给游标的select语句,则不会出现任何错误。 如果给定条件的给定数据与表中的数据不匹配,我想引发异常。有人可以帮助我如何检查begin块中的条件以引发异常。
答案 0 :(得分:0)
您无法在游标中向SQL添加任何异常处理。基于阅读您的问题所获得的有限知识,我提出了以下建议。
我的示例向您展示了如何使用游标以及如何声明自己的异常。我正在使用CTE创建虚假数据。我正在检查的异常名称太长。当游标回退超过20个字符的名字时,会引发too_long
自定义异常。
我将从游标拉回的数据添加到集合中。然后,使用IF语句检查名字的字符长度。如果发现任何“名”大于20个字符,请提出too_long
异常。
DECLARE
/* Declare Exception */
too_long EXCEPTION;
/* Declare Cursor */
CURSOR cur_my_fake_data IS
WITH fake_data AS
(
SELECT 1001 AS p_key, 'Jacob Brian Anderson the First' AS f_name FROM dual UNION ALL
SELECT 1021 AS p_key, 'Bob' AS f_name FROM dual UNION ALL
SELECT 1025 AS p_key, 'Ryan' AS f_name FROM dual
)
SELECT p_key, f_name
FROM fake_data
;
TYPE t_my_fake_data IS TABLE OF cur_my_fake_data%ROWTYPE; /* Declare Type based off of Cursor */
c_my_fake_data t_my_fake_data := t_my_fake_data(); /* Declare Collection and initialize it */
BEGIN
/* Open Cursor and fill collection with data from Cursor */
OPEN cur_my_fake_data;
FETCH cur_my_fake_data BULK COLLECT INTO c_my_fake_data; /* Fill Collection with data from Cursor */
CLOSE cur_my_fake_data;
/* Loop thru collection */
FOR r IN c_my_fake_data.FIRST .. c_my_fake_data.LAST
LOOP
IF LENGTH(c_my_fake_data(r).f_name) > 20 THEN
dbms_output.put_line('LENGTH: ' || LENGTH(c_my_fake_data(r).f_name));
RAISE too_long;
END IF;
END LOOP;
EXCEPTION
WHEN too_long THEN
dbms_output.put_line('More Than 20 Characters');
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('Error '||TO_CHAR(SQLCODE)||': '||SQLERRM);
CLOSE cur_my_fake_data;
END
;