【问题标题】:SQL no data found exception not getting executedSQL未找到数据异常未执行
【发布时间】:2020-04-01 21:50:22
【问题描述】:

以下是在主块中找不到数据时必须执行异常块的代码。但是,即使查询没有返回任何记录,异常块也不会被执行。查询与另一个表连接,当结果与查询匹配时,它将选择第一条记录,否则它必须为字段分配空值并将光标返回给 UI。光标下面的计数始终为 0,并且异常块没有被执行。

BEGIN
    wf_common.write_debug(vprocname, ' 111=', ts);
    OPEN cinfo FOR SELECT
                       name,
                       phone,
                       alt_phone,
                       email
                   FROM
                       abc
                   WHERE
                       id IN (
                           SELECT
                               id
                           FROM
                               xyz
                           WHERE
                               emp_no = vempno
                       )
                       AND name IS NOT NULL
                       AND ROWNUM = 1;

    wf_common.write_debug(vprocname, 'COUNT' || cinfo%rowcount, ts);
EXCEPTION
    WHEN no_data_found THEN
        wf_common.write_debug(vprocname, '222=', ts);
        OPEN cinfo FOR SELECT
                           '' name,
                           '' phone,
                           '' alt_phone,
                           '' email
                       FROM
                           dual;

        wf_common.write_debug(vprocname, 'COUNT' || cinfo%rowcount, ts);
END;

【问题讨论】:

  • 您是否尝试无异常块运行这个?
  • @HimanshuAhuja 是的,我做到了。结果是一样的。找到数据时游标返回1条记录,当表中没有满足条件的记录时,游标为空。我的要求是为字段返回空值,如果找不到记录,游标仍应保留 1 条带有空字段的记录。
  • 如果你不打算循环你的结果,为什么要打开光标呢?只需将 sSELECT COUNT(*) 转换为 INTEGER 变量即可。然后有一个 if-else 来打印你的消息。

标签: sql oracle


【解决方案1】:

WHEN NO_DATA_FOUND 替换为 WHEN OTHERS

【讨论】:

  • 我做了,但没有改变。仍然没有执行异常块
  • 我认为默认情况下不会引发任何异常,因此您必须明确提出
【解决方案2】:

这是一个光标。它不会引发no_data_found。你怎么知道它是否会返回一些东西?你不会,直到你

  • 打开它
  • 从中获取

那你就知道了。

所以 - 不幸的是 - 您必须先检查一下,然后再决定要做什么。例如(基于 Scott 的示例模式):

SQL> create or replace function f_test (par_deptno in emp.deptno%type)
  2    return sys_refcursor
  3  is
  4    type cinfot is record (empno emp.empno%type,
  5                           ename emp.ename%type,
  6                           job   emp.job%type);
  7    cinfor    cinfot;
  8    cinfo     sys_refcursor;
  9  begin
 10    -- in order to test whether it returns something, open & fetch
 11    open cinfo for 'select empno, ename, job
 12                    from emp
 13                    where deptno = :a' using par_deptno;
 14    fetch cinfo into cinfor;
 15
 16    -- has anything been found?
 17    if cinfo%found then
 18       -- something has been found - process it
 19       close cinfo;
 20       open cinfo for 'select empno, ename, job
 21                       from emp
 22                       where deptno = :a' using par_deptno;
 23
 24    else
 25       -- nothing has been found; open another cursor
 26       close cinfo;
 27       open cinfo for select deptno, dname, loc
 28                      from dept;
 29    end if;
 30
 31    return cinfo;
 32  end;
 33  /

Function created.

测试:EMP 表中存在部门10 所以 - 返回其内容:

SQL> select f_test(10) From dual;

F_TEST(10)
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

     EMPNO ENAME      JOB
---------- ---------- ---------
      7782 CLARK      MANAGER
      7839 KING       PRESIDENT
      7934 MILLER     CLERK

部门50 不存在所以 - 返回DEPT 表的内容:

SQL> select f_test(50) From dual;

F_TEST(50)
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON


SQL>

【讨论】:

    猜你喜欢
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 2014-06-13
    相关资源
    最近更新 更多