oracle - 在执行查询之前验证结果

标签 oracle stored-procedures plsql

当运行存储过程来获取一些行时,首先我想在发送结果之前验证查询是否会返回一行,其次是否可以在不运行相同查询两次的情况下进行验证。

我正在使用游标来存储产生的结果,所以我尝试了游标属性 %ROWCOUNT & %NOTFOUND。但是不太管用。另外,我想在不在光标上运行循环的情况下执行此操作。

procedure MODULE_LIST_GK(p_module_Id IN MODULE_LIST.MODULE_ID% TYPE,
                                     p_Error_Code     out nvarchar2,
                                     p_Error_Msg      out nvarchar2,
                                     p_Cursor         out sys_refcursor)   IS
 BEGIN
    OPEN p_Cursor FOR
       SELECT A.MODULE_ID,
         A.MODULE_NM,
         A.AUTH_STATUS_ID
         FROM MODULE_LIST A
         WHERE A.MODULE_ID=p_module_Id;

       SELECT COUNT(MODULE_ID)
       INTO v_row_num
        FROM MODULE_LIST A
        WHERE A.MODULE_ID=p_module_Id;

       IF v_row_num=0 THEN
         p_Error_Code := SQLCODE;
         p_Error_Msg := 'Does not Exists';
         Return;
       end IF;
    EXCEPTION
      WHEN OTHERS THEN
        p_error_code:= SQLCODE;
        p_error_msg := SQLERRM;
  END MODULE_LIST_GK;

最佳答案

您的实现有几点可以改进。

首先 如果您预计对于很多参数,返回的游标将为空, 而不是首先检查空游标,只有在检查之后才打开游标。反之亦然。

如何判断光标是否为空?不幸的是,您必须获取第一行才能对其进行验证。

 open l_cur for
   select id, status from tab where id = p_id; 
 fetch l_cur into l_id, l_status;
 if l_cur%NOTFOUND then
    p_Error_Msg := 'Does not Exists';
    Return;
 end if;

此检查比经常使用的 count(*) 更有效,因为它只考虑前(几)行而不计算游标中的所有行 .

如果检查失败你就准备好了,否则简单地打开游标并返回它。

 open  l_cur for
   select id, status from tab where id = p_id; 
   p_Cursor := l_cur;

我想到了另外两个想法。

如果数据库非常动态,您应该重新考虑通用方法。 当其他 session 在检查和第二次打开游标之间删除某些行时,您将如何处理这种情况?

最后考虑返回异常而不是返回码。

关于oracle - 在执行查询之前验证结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56319425/

相关文章:

oracle - 创建以字母数字开头的 Oracle 序列

mysql - 插入带有参数的存储过程MYSQL不起作用

sql - REGEXP_REPLACE - 仅当包含在 () 中时才从字符串中删除新行\n

mysql - 具有多个相似条件的查询,按 LIKE 排序

python - Oracle 和 Python - cx_Oracle DLL 加载失败

sql - 如何查找一年中所有月份的第一个日期

sql - MySQL foreach 替代过程

django - 使用 callproc 从 django 调用 PL/SQL 过程

oracle - 我想学习PL/SQL

sql - ORACLE-SQL : Function, 如何检测空选择并返回 0