• PL/SQL中使用EXISTS:使用LOOP循环替代或者SELECT实现类似的功能:


    EXISTS 指定一个子查询,用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False,检测行的存在。

    语法:EXISTS subquery。参数 subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。结果类型为 Boolean,如果子查询包含行,则返回 TRUE。

    上述的功能在T-SQL中可以直接使用,但是在PL/SQL中,会出现如下的问题:

    1 BEGIN
    2 IF EXISTS(SELECT * FROM EMP) THEN
    3 DBMS_OUTPUT.PUT_LINE();
    4 ELSE
    5 DBMS_OUTPUT.PUT_LINE();
    6 END IF;
    7 END;

    类似的业务逻辑如下:

    1 IF EXISTS (SELECT * FROM tbl_some_table WHERE some_condition) THEN
    2 -- Do something here;
    3 ELSE
    4 -- DO something else
    5 END IF;

    但是直接使用会存在问题:

    方法1:使用LOOP,LOOP中使用EXIT直接退出,保证只执行一次:

    1 declare found boolean := false;
    2 for x in (SELECT * FROM tbl_some_table WHERE some_condition) loop
    3 found := true;
    4 -- Do something here;
    5 end loop;
    6 IF not found THEN
    7 -- DO something else
    8 END IF;

    为了保证执行一次:可以如下

    1 for x in (SELECT * FROM tbl_some_table WHERE some_condition AND ROWNUM = 1) loop

    或者:直接EXIT保证执行一次就退出FOR循环

    declare 
    found boolean := false;
    for x in (SELECT * FROM tbl_some_table WHERE some_condition) loop
    found := true;
    -- Do something here;
    exit;
    end loop;
    IF not found THEN
    -- DO something else
    END IF;

    方法二:使用count总数,使用AND ROWNUM = 1限制结果数量

     1 DECLARE
    2 l_exists INTEGER;
    3 BEGIN
    4 SELECT COUNT(*) INTO l_exists
    5 FROM some_table
    6 WHERE some_condition
    7 AND ROWNUM = 1;
    8 IF l_exists = 1 THEN
    9 -- Do something
    10 ELSE
    11 -- Do something else
    12 END IF;
    13 END;

    参考网站:http://www.dbforums.com/oracle/1001443-if-exists-select-then.html

    I believe that we are who we choose to be. Nobody‘s going to come and save you, you‘ve got to save yourself. 我相信我们成为怎样的人是我们自己的选择。没有人会来拯救你,你必须要自己拯救自己。
  • 相关阅读:
    记录下平台多种语言加密算法实施的历程
    Php AES加密、解密与Java互操作的问题
    Tomcat服务器常用配置和HTTP简介
    淘宝IP地址查询
    linux下hexdump和od命令:显示文件十六进制格式
    技术讨论 | 简谈渗透测试各阶段我常用的那些“神器”
    串口发送数据速度
    在Qt示例项目的C ++ / QML源中的//! [0]的含义是什么?
    C++ 函数参数中“ *&代表什么? ”
    c++中三种参数引用方式
  • 原文地址:https://www.cnblogs.com/caroline/p/2319687.html
Copyright © 2020-2023  润新知