如何为游标的select语句中使用的失败条件引发异常

时间:2019-05-21 12:01:46

标签: plsql

我是plsql初学者,我发现如果将无效数据提供给游标的select语句,则不会出现任何错误。 如果给定条件的给定数据与表中的数据不匹配,我想引发异常。有人可以帮助我如何检查begin块中的条件以引发异常。

1 个答案:

答案 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
;