PL/SQL 动态Sql拼接where条件

2023-11-14

  • 完整例子
DECLARE

    SQLSTR VARCHAR(200) := 'SELECT * FROM hr.employees where 1=1';

    TYPE EMPCURTYP IS REF CURSOR;
    V_EMP_CURSOR EMPCURTYP;
    EMP_RECORD   HR.EMPLOYEES%ROWTYPE;

    TYPE EMP_REC IS TABLE OF HR.EMPLOYEES%ROWTYPE;
    EMP_REC2 EMP_REC;

    PROCEDURE QUERYEMP(NAME_ VARCHAR, SALARY NUMBER) IS
    BEGIN
        -- Wrong exmaple
        --IF NAME_ IS NOT NULL THEN
        --   SQLSTR := SQLSTR || ' and first_name = :name_ ';
        --END IF;
        --IF SALARY IS NOT NULL THEN
        --    SQLSTR := SQLSTR || ' and SALARY = :SALARY ';
        --END IF;
        
        -- By using IF-END, Not recommended. Because you have to write extra if-else conditions
        --IF NAME_ IS NOT NULL THEN
        --    SQLSTR := SQLSTR || ' and first_name = :name_ ';
        --ELSE
        --    SQLSTR := SQLSTR || ' and :name_ IS NULL';
        --END IF;
        
        -- By using OR, recommended way
        SQLSTR := SQLSTR || ' and (:name_ IS NULL OR first_name = :name_) ';
        SQLSTR := SQLSTR || ' and (:salary IS NULL OR salary = :salary) ';
    
        -- print sqlstr
        DBMS_OUTPUT.PUT_LINE('sqlstr = ' || SQLSTR);
    
        -- If the dynamic SQL statement is a SELECT statement that returns multiple rows, 
        -- native dynamic SQL gives you these choices: 
    
        -- 1.Use the EXECUTE IMMEDIATE statement with the BULK COLLECT INTO clause.
        EXECUTE IMMEDIATE SQLSTR BULK COLLECT
            INTO EMP_REC2
            USING NAME_, NAME_, SALARY, SALARY;
        FOR I IN 1 .. EMP_REC2.COUNT LOOP
            DBMS_OUTPUT.PUT_LINE('EMPLOYEE_ID = ' || EMP_REC2(I)
                                 .EMPLOYEE_ID);
        END LOOP;
        -- 1.END
    
        -- 2.Use the OPEN FOR, FETCH, and CLOSE statements
        OPEN V_EMP_CURSOR FOR SQLSTR
            USING NAME_, NAME_, SALARY, SALARY;
    
        LOOP
            FETCH V_EMP_CURSOR
                INTO EMP_RECORD;
            EXIT WHEN V_EMP_CURSOR%NOTFOUND;
        
            DBMS_OUTPUT.PUT_LINE('EMPLOYEE_ID = ' ||
                                 EMP_RECORD.EMPLOYEE_ID);
        END LOOP;
    
        CLOSE V_EMP_CURSOR;
        -- 2.END
    
    END QUERYEMP;


BEGIN

    QUERYEMP('Steven', NULL);
    -- 
    --TT('');
    -- QUERYEMP2('Steven');
END;
/
  • 拼接部分
IF NAME_ IS NOT NULL THEN
	SQLSTR := SQLSTR || ' and first_name = :name_ ';
END IF;
IF SALARY IS NOT NULL THEN
	SQLSTR := SQLSTR || ' and SALARY = :SALARY ';
END IF;
如果写成这样,我们在using部分传入了name_和salary两个绑定变量,若name_为空,则剩下salary一个参数,绑定变量过多,会报ora-01006错误。
改进的方法是使用IF-ELSE方式拼接或者用OR连接,但是传入的绑定变量对应情况要根据拼接的sqlstr而定

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PL/SQL 动态Sql拼接where条件 的相关文章

随机推荐

  • 网络攻防——ARP欺骗

    arp基础攻防 1 什么是arp攻击 2 arp攻击条件 3 arp如何进行攻击 3 1靶机环境搭建 3 2攻击机环境搭建 3 3如何发起arp攻击 4 如何防止arp攻击 5 参考文献 1 什么是arp攻击 ARP攻击是指攻击者利用ARP
  • python [3.2] urllib的使用

    urllib是python的一个获取url Uniform Resource Locators 统一资源定址器 的模块 它用urlopen函数的形式提供了一个非常简洁的接口 这使得用各种各样的协议获取url成为可能 它同时 也提供了一个稍微
  • 图灵1

    简介 艾伦 麦席森 图灵 英语 Alan Mathison Turing 1912年6月23日 1954年6月7日 英国数学家 逻辑学家 被称为计算机科学之父 人工智能之父 艾伦 麦席森 图灵 生平 1912年6月23日 艾伦 麦席森 图灵
  • SpringAOP的实现原理

    一 SpringAOP的面向切面编程 是面向对象编程的一种补充 用于处理系统中分布的各个模块的横切关注点 比如说事务管理 日志 缓存等 它是使用动态代理实现的 在内存中临时为增强某个方法生成一个AOP对象 这个对象包含目标对象的所有方法 在
  • 求m到n之间的素数和(函数)python

    目录 题目描述 AC代码 题目描述 输入两个正整数m和n m
  • k8s持久化存储

    目录 一 为什么要做持久化存储 1 emptyDir类型 2 hostPath 3 nfs 4 pvc 1 pv是什么 2 PVC是什么 5 storageclass 一 为什么要做持久化存储 在k8s中部署的应用都是以pod容器的形式运行
  • Windows 安装Redis(图文详解)

    一 Redis是什么数据库 Remote Dictionary Server Redis 是一个开源的使用 ANSI C 语言编写 遵守 BSD 协议 支持网络 可基于内存 分布式 可选持久性的键值对 Key Value 存储数据库 并提供
  • eclipse怎么在包里建一个包

    实现效果如下图 废话不多说 上图 1 设置Package Presentation 为Hierarchical 最为关键一步 2 在src下新建一个名为com abc hrm的包 3 在父包下新建子包a 因为只有一个子包 建完的子包会这样显
  • 关于绿色校园建设中综合能效平台的管理效益与研究

    摘要 伴随当前环保理念的不断发展 绿色节能理念也在逐步深入校园 为响应国家建设节约型校园的号召 本文以校园智能化综合能效管理平台建设为主题 介绍了平台建设方案 比较了某高校平台建设前后学生宿舍 教学及实训楼用能情况 分析结果表明高校综合能效
  • 啊哈C的简单使用

    打开啊哈C 新建一个程序输出hello world include
  • Java如何获取平台(操作系统)的默认编码

    Java如何获取平台 操作系统 的默认编码 平台 这两个字指的就是操作系统 比如Windows平台 MacOS平台 Linux平台 这也是我们经常读API文档的时候见到的英文 platform 如 platform encoding 如何获
  • spring-MVC

    Spring MVC Hello Spring MVC web xml 在WEB INF目录下创建 web xml 配置Spring MVC的入口 DispatcherServlet 把所有的请求都提交到该Servlet
  • 数据库十一章——并发控制

    11 1 并发控制概述 1 并发操作带来的数据不一致性 1 丢失修改 Lost Update 两个事务T1和T2读入同一数据并修改 T2的提交结果破坏了T1提交的结果 导致T1的修改被丢失 2 不可重复读 Non repeatable Re
  • XGBoost学习(六):输出特征重要性以及筛选特征

    XGBoost学习 一 原理 XGBoost学习 二 安装及介绍 XGBoost学习 三 模型详解 XGBoost学习 四 实战 XGBoost学习 五 参数调优 XGBoost学习 六 输出特征重要性以及筛选特征 完整代码及其数据 XGB
  • makefile-gdb

    makefile gdb 1 makefile makefile 文件中定义了 一系列的规则来指定 哪些文件需要先编译 哪些文件需要后编译 哪些文件需要重新编译 甚至于进行更复杂的功能操作 就像是一个shell脚本 其中也可以执行操作系统的
  • 关于迅雷与优酷

    迅雷的用户许可协议上有这样一段 4 4 使用本 软件 涉及到互联网服务 可能会受到各个环节不稳定因素的影响 存在因不可抗力 计算机病毒 黑客攻击 系统不稳定 用户所在位置 用户关机以及其他任何网络 技术 通信线路等原因造成的服务中断或不能满
  • 语义分割方法总结与综述

    语义分割论文 Dilated convolution low level high level information fusion 2019 CVPR DFANet Deep Feature Aggregation for Real Ti
  • 2207 字符串中最多数目的子字符串(递推)

    1 问题描述 给你一个下标从 0 开始的字符串 text 和另一个下标从 0 开始且长度为 2 的字符串 pattern 两者都只包含小写英文字母 你可以在 text 中任意位置插入一个字符 这个插入的字符必须是 pattern 0 或者
  • Axios请求使用XML格式进行请求

    第一次接触xml格式请求 因为我们公司要对接其他公司的平台 需要用XML格式进行请求 才可以打通内网访问 在网上查了好多资料也没明白这个格式怎么使用 试了多次 发现用模板字符串将请求内容包裹进去就可以使用 废话不多说 直接上代码 此处是请求
  • PL/SQL 动态Sql拼接where条件

    完整例子 DECLARE SQLSTR VARCHAR 200 SELECT FROM hr employees where 1 1 TYPE EMPCURTYP IS REF CURSOR V EMP CURSOR EMPCURTYP E