动态SQL

九、PL/SQL之本地动态SQL PL/SQL之本地动态SQL 阅读详情


动态SQL简介:
   1、静态SQL
      静态SQL是指直接嵌入在PL/SQL块中的SQL语句。在编写PL/SQL时。静态SQL用于完成特定或固定的任务:
   2、动态SQL
      动态SQL是指在运行PL/SQL块时动态输入的SQL语句。如果在PL/SQL中需要执行DDL语句,DCL语句(GRANT,REVOKE),或者在PL/SQL中需要执行更加灵活的SQL语句(例如在SELECT语句中使用不同的WHERE条件),那么就必须使用动态SQL。
      在PL/SQL块中编写动态语句时,需要将SQL语句存放在字符创变量中,而且SQL语句可以包含占位符(以冒号开始)。
       如:CREATE TABLE temp(cola INT,colb VARCHAR2(10))
           GRANT SELECT ON temp TO smith
           DELETE FROM emp WHERE sal>:a
           SELECT ename,sal FROM emp WHERE empno=:l
   3、动态SQL的处理方法
      (1)、使用EXECUTE IMMEDIATE
             不能用于处理多行查询语句。
      (2)、使用OPEN-FOR FETCH 和CLOSE语句
             为了处理动态的多行查询操作,必须使用OPEN-FOR语句打开游标,使用FETCH 语句提取循环数据,最终使用CLOSE语句关闭游标.
      (3)、使用批量动态SQL

处理非查询语句
   为了动态的处理非查询语句(DML DDL DCL)或者单行查询语句,可以在PL/SQL快中使用EXEXUTE IMMEDIATE 语句,                                
     EXECUTE IMMEDIATE dynamic_string
     [INTO |define_variable|,define_variable...|record]
     [USING [IN|OUT|INOUT] bind_argument...]
     [{RETURNING|RETURN} INTO bind_argument...];
   dynamic_string 用于指定存放SQL语句或者PL/SQL块的字符串变量;
   define_variable用于指定存放单行查询结婚的变量
   输入bind_argument(IN)用于指定存放被传递给动态SQL值的变量
   输出bind_argument(OUT)用于指定存放动态SQL返回值的变量
   1、使用EXECUTE IMMEDIATE 处理DDL操作
      EXECUTE IMMEDIATE后面只需要带有DDL语句文本即可,而不需要INTO和USING 
  字句。
      CREATE OR REPLACE PROCEDURE drop_table(table_name VARCHAR2)
      IS
        sql_statement VARCHAR2(100);
      BEGIN
        sql_statement:='DROP TABLE '||table_name;
        EXECUTE IMMEDIATE sql_statement;
      END; 
    2、使用EXECUTE IMMEDIATE 处理DCL操作
        和处理DDL语句差不多
    3、使用EXECUTE IMMEDIATE 处理DML 语句
       如果DML语句既没有占位符,也咩有RETURNING 字句,那么在EXECUTE IMMEDIATE 语句之后不需要带有USING和RETURNING INTO子句;
       如果DML语句含有占位符,那么在   EXECUTE IMMEDIATE 语句之后要带有USING子句;
       如果DML语句之后带有RETURNING子句,那么在EXECUTE IMMEDIATE 语句之后带有RETURNING INTO子句。
      (1)、处理无占位符和RETURNING子句的DML语句
         DECLARE
          sql_statement VARCHAR2(100);
         BEGIN
          sql_statement:='UPDATE emp SET sal=sal*1.1 WHERE depno=30';
          EXECUTE IMMEDIATE sql_statement;
         END;
       (2)、处理包含占位符的DML语句
          要使用USING 自己为占位符提供输入数据。
          DECLARE
             sql_state VARCHAR2(100);
          BEGIN
             sql_state:='UPDATE emp SET sal=sal*(1+:percent/100) WHRE deptno=:dno';
             EXECUTE IMMEDIATE sql_state USING &1,&2;
          END;
       (3)、处理包含RETURNING 子句的DML语句
          必要要使用RETURNING INTO 子句接受返回数据。
          注意:直接使用EXECUTE IMMEDIATE 语句处理带有RETURNING 子句的DML语句时,只能处理作用在单行的DML语句。
               如果DML语句作用在多行伤,则必须要使用BULK子句。
          DECLARE
             salary NUMBER(6,2);
             sql_state VARCHAR2(100);
          BEGIN
             sql_state:='UPDATE emp SET sal=(sal*:present/100) WHERE empno=:eno RETURNING sal INTO :salary';
             EXECUTE IMMEDIATE sql_state USING &1,&2 RETURNING INTO salary;
             dbms_output.put_line('新工资:'||salary);
          END; 
       (4)、使用EXECUTE IMMEDIATE 处理单行查询
          要使用INTO 子句接受返回数据
          DECLARE
            sql_state VARCHAR2(100);
            emp_record emp%ROWTYPE;
          BEGIN
             sql_state:='SELECT * FROM emp WHERE empno=:eno';
             EXECUTE IMMEDIATE  sql_state INTO emp_record USING &1;   
             dbms_output.put_line('雇员:'||emp_record.ename||'的工资为:'||emp_record.sal); 
          END;
处理多行查询语句:
  使用EXECUTE IMMEDIATE只能处理单行查询语句,为了动态的处理SELECT语句所返回的多行数据,需要使用OPEN-FOR,FETCH,CLOSE语句。
  步骤如下
    定义游标变量-->打开游标变量-->循环提取数据-->关闭游标变量。
    1、定义游标变量:
       TYPE cursortype IS REF CURSOR;
       cursor_variable cursortype;
    2、打来游标变量
       OPEN   cursor_variable FOR dynamic_string [USING bind_argument,...];
        bind_argument 用于存放传递给动态SELECT语句值的变量。
    3、循环提取数据
       FETCH cursor_variable INTO {var1[,var2]...|record_var};
    4、关闭游标变量
       close cursor_variable;
    5、多行查询实例:
        DECLARE
          TYPE cursor_type IS REF CURSOR;
          sql_state VARCHAR2(100);
          emp_record emp%ROWTYPE;
          v_cursor vursor_type;
        BEGIN
          sql_state:='SELECT * FROM emp WHERE deptno=:dno';
          OPEN  v_cursor FOR sql_state USING &deptno;
          LOOP
            FETCH   v_cursor INTO emp_record;
            EXIT WHEN v_cursor%NOTFOUND;
            dbms_output.put_line('雇员名:'||emp_record.ename||'的工资是:'||emp_record.salary);
          END LOOP;
          CLOSE v_cursor;
        END;
在动态SQL中使用BULK子句
  ORACLE9i新增加的特性。可以加快批量数据的处理速度。
  有三种语句支持BULK子句:EXECUTE IMMEDIATE,FETCH和FORALL
  1、在EXECUTE IMMEDIATE语句中使用动态BULK子句
       EXECUTE IMMEDIATE dynamic_string
     [BULK COLLECT INTO |define_variable|,define_variable...|record]
     [USING [IN|OUT|INOUT] bind_argument...]
     [{RETURNING|RETURN} BULK COLLECT INTO bind_argument...]; 
   (1)、使用BULK子句处理DML语句返回子句
        DECLARE
          TYPE ename_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER;
          TYPE sal_table_type IS TABLE OF emp.sal%TYPE INDEX BY BINARY_INTEGER;
          ename_table ename_table_type;
          sal_table sal_table_type;
          sql_state VARCHAR2(150);
        BEGIN
          sql_state:='UPDATE emp SET sal=sal*(1+:precent/100) WHERE deptno=:dno'
             ||'RETURNING ename,sal INTO :name,:salary';
          EXECUTE IMMEDIATE sql_state USING &precent,&depno RETURNING BULK COLLECT INTO
           ename_table,sal_table   ;
           FOR i IN 1..ename_table.COUNT LOOP
              dbms_output.put_line('雇员名:'||ename_table(i)||'的工资是:'||sal_table(i));
           END LOOP;
         END;                                   
       (2)、使用BULK子句处理多行查询                              
          DECLARE
            sql_state VARCHAR2(100);
            TYPE ename_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER;
            ename_table ename_table_type;
          BEGIN
             sql_state:='SELECT ename FROM emp WHERE empno=:eno';
             EXECUTE IMMEDIATE  sql_state BULK COLLECT INTO emp_record USING &1;
             FOR i IN 1..ename_table.COUNT LOOP  
               dbms_output.put_line('雇员:'||ename_table(i)); 
             END LOOP; 
          END;
  2、在FETCH 语句中使用BULK子句
     OPEN-FOR ,FETCH,CLOSE .....BULK
     DECLARE
        TYPE cursor_type IS REF CURSOR;
        TYPE ename_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER;
        sql_state VARCHAR2(200);
        v_vursor cursor_type;
        ename_table ename_table_type;
     BEGIN
        sql_state:='SELECT ename FROM emp WHERE deptno=:dno';
        OPEN v_corsor FOR sql_state USING &deptno;
        FETCH v_cursor BULK COLLECT INTO ename_table;
        FOR i IN i..ename_table.COUNT LOOP
             dbms_output.put_line('雇员:'||ename_table(i)); 
        END LOOP;
        CLOSE   v_cursor;
     END; 
  FORALL       


本文转自:http://blog.youkuaiyun.com/memoordit/article/details/2385600?locationNum=5&fps=1

DEV-C++调试设置        昨天用C/C++去考了CSP,结果用DEV-C++调试总是闪退,按照我的记忆打开了调试参数,迷迷糊糊搞了一通,还是没办法调试,难受了几个小时。所以今天痛下决心,一定要写下DEV-C++设置调试的过程,警示自己! 解决步骤 1.打开DevC++找到上方工具栏 2.点击选择编译选项,再按下图所示设置即可 阅读详情

相关推荐

用4690张图片搞定物流仓储难题:手把手教你训练YOLOv8纸箱检测模型(附完整源码)

本文详细介绍了如何利用YOLOv8目标检测技术解决物流仓储中的纸箱识别难题。通过4690张图片构建高质量数据集,提供完整的训练教程和源码,实现98.7%的mAP@0.5准确率。文章涵盖数据采集、模型训练、调参技巧到边缘计算部署的全流程,帮助读者快速构建智能仓储检测系统。

weixin_28717939的博客 377

4.plsql游标使用

主页全部笔记

qq_45298339的博客 613

实战分享:如何用本地替换和插桩调试搞定Kasada最新版x-kpsdk-cd环境检测

本文深入解析Kasada最新版x-kpsdk-cd环境检测机制,提供动态请求拦截、本地替换和函数插桩等实战调试策略。通过Proxy保护破解、关键函数断点调试和环境检测对抗方案,帮助逆向工程师有效应对从280位扩展到294位的加密数组挑战,实现高效补环境调试。

weixin_29251567的博客 568

plsql 游标

游标 游标是一种从多条数据的结果集中每次提取一行数据的机制 游标可以充当指针 可以便利结果集中所有的行 但是一次只能取一行值 ; 游标提供了在逐行的基础上操作表中数据的方法 游标的结果集是由select语句指定的; 静态游标:显示游标----->普通的 ----->带参数的 隐式游标 动态游标:强类型 弱类型 动态游标 静态游标和动态游标的区别? 静态游标的结果集是固定的 中间不能改变 动态游标的结果集是不固定的 每次打开都可以更换结果集 显示游标和隐式游标的区别 ? 显示游标的结果集是在

weixin_45203191的博客 638

手把手教你用SlowFast训练自定义手势识别数据集(附FFmpeg抽帧技巧)

本文提供了一份基于SlowFast架构训练自定义手势识别数据集的完整实战指南。文章重点剖析了数据准备的核心挑战,详细讲解了利用FFmpeg进行高、低帧率抽帧的技巧,并介绍了构建半自动标注流水线、生成符合SlowFast要求的AVA格式数据集文件的具体方法。最后,针对手势识别场景,给出了关键的模型训练配置与调优建议,帮助开发者高效完成从数据到模型的全流程。

s1t2u3的博客 909

【计算机组成原理】实验4:单周期CPU(Verilog)中海大

【计算机组成原理】实验4:单周期CPU

m0_63023532的博客 3659

PL/SQL——动态SQL & 游标

动态SQL 1. 使用动态SQL可以在依赖对象不存在时创建子程序 2. 动态SQL主要利用execute immediate语句执行DML、DDL、DCL等语句操作 3. 如果使用了绑定变量,则必须在execute immediate中使用using字句设置所需要的绑定变量 4. 使用returning或return语句可以接收查询或更新后的返回结果 4. 使用批处理可以一次性将数据库之...

654657008的博客 463

库卡机器人外部轴配置全流程:从接线到WorkVisual 6.0实战(附避坑指南)

本文详细解析了库卡机器人外部轴配置的全流程,涵盖从硬件接线到WorkVisual 6.0软件配置的实战步骤。重点介绍了KPP驱动模块连接、电机参数匹配、安全配置激活及零点标定等关键环节,并提供了实用的避坑指南,旨在帮助工程师高效、安全地完成外部轴集成,提升工作站柔性。

weixin_29161785的博客 496

Oracle (PLSQL) [集合,动态SQL]

Oracle (PLSQL) [集合,动态SQL]

weixin_43889788的博客 1919

用Python+OpenCV给斗地主做个‘外挂’:手把手教你写个桌面记牌器(附源码)

本文详细介绍了如何使用Python和OpenCV开发一个智能斗地主记牌器,包括环境搭建、图像采集与预处理、扑克牌识别技术及PyQt5界面设计。通过实战案例,帮助开发者掌握图像处理与界面开发的结合应用,提升游戏辅助工具的编写能力。

weixin_29079643的博客 543

【推荐100个unity插件】Unity URP(通用渲染管线)的基于物理的天地和预计算大气散射——UnityPhysicallyBasedSkyURP

本文介绍了Unity URP(通用渲染管线)中基于物理的天地和预计算大气散射的实现方法。该插件提供物理天空、大气散射、高度雾效、动态天空反射和环境光等功能,要求Unity 2022.3及以上版本,支持着色器模型3.5+。使用步骤包括:添加渲染器功能、配置Volume组件(天空、雾效等),并建议太阳强度设为3、曝光为0作为初始设置。插件已在GitHub和Gitee开源,附带详细配置截图和效果展示。文末推荐了多个Unity开发相关专栏,涵盖游戏开发全领域知识。作者向宇提供了博客链接,欢迎交流学习问题。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1225

什么是动态Sql

动态SQL是一种在运行时构建和执行SQL语句的技术。通常情况下,静态SQL是预先定义好的SQL语句,而动态SQL允许根据程序运行时的条件和需求来动态地生成SQL语句。动态SQL的主要优点是灵活性和适应性。它可以根据不同的情境和需求生成不同的SQL语句,从而提供更高的灵活性和可重用性。例如,在一个搜索功能中,用户可能根据不同的条件来进行搜索,使用动态SQL可以根据用户输入的条件来构建相应的查询语句。

lw12345118的博客 6687

一种基于机载LiDAR点云电力线自动提取方法

文章目录一、引言二、算法实现2.1实现步骤2.2实现代码 一、引言 二、算法实现 2.1实现步骤 (1)首先采用首先采用高程滤波方法去除地面点和低矮地物点,滤波后的点云数据中除电力线点云外还含部分杆塔点、高植被点和噪声点。 (2)根据点云空间维度特征提取电力线点,使用空间密度聚类的方法实现单根电力线精确分离。 2.2实现代码 在这里插入代码片 ...

dayuhaitang1的博客 5170

强大的动态SQL

用于实现动态SQL的元素if:利用if实现简单的条件选择choose(when,otherwise):相当于java中的switch语句,通常与when和otherwise搭配where:简化Sql语句中where的条件判断set:解决动态更新语句trim:可以灵活的去除多余的关键字foreach:迭代一个集合,通常用于in条件那么,问题来了: 什么是动态SQL? 动态SQL有什么作用?传统的使用...

qq_40490518的博客 6775

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【MyBatis】动态SQL

本期讲解:MyBatis的动态SQL,主要讲解if、trim、where、set、foreach标签。

我的主页 3678

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Mybatis动态sql是做什么的?都有哪些动态sql?简述一下动态sql的执行原理?

1.Mybatis动态sql是做什么的?都有哪些动态sql?简述一下动态sql的执行原理? 1.动态SQL的概念 ​ 动态sql是指在进行sql操作的时候,传入的参数对象或者参数值,根据匹配的条件,有可能需要动态的去判断是否为空,循环,拼接等情况; 2.动态Sql的标签大致有以下几种 if 和 where 标签和include标签 ​ if标签中可以判断传入的值是否符合某种规则,比如是否不为空; ...

weixin_42427551的博客 8455

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Mybatis——动态SQL

动态 SQL 动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。 使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis显著地提升了这一特性的易用性。 如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可

yangyingjian123的博客 8519

动态sql有什么作用什么时候需要使用到动态sql_为什么需要动态SQL

为什么需要动态SQL在使用EF或者写SQL语句时,查询条件往往是这样一种非常常见的逻辑:如果客户填了查询信息,则查询该条件;如果客户没填,则返回所有数据。我常常看到很多人解决这类问题时使用了错误的静态SQL的解决办法,使得数据库无法利用索引,导致性能急剧下降。介绍数据这次我将使用我的某客户的真实数据来演示(已确认不涉及信息安全?),有一个订单表FoodOrder,结构如下:我在...

weixin_33358246的博客 1272

Oracle 动态SQL

动态SQL是在运行时动态构建和执行的SQL语句。与静态SQL相比,动态SQL的主要优势是可以根据不同条件生成不同的查询语句,从而提供更灵活的查询能力。动态SQL在处理复杂查询逻辑、动态过滤条件和动态列选择等方面非常有用。Oracle 动态SQL有两种写法:用 DBMS_SQL 或 execute immediate。

weixin_46268997的博客 1967

关于动态SQL的使用

关于动态SQL的使用本文作者:dinya内容摘要:在PL/SQL开发过程中,使用SQL,PL/SQL可以实现大部份的需求,但是在某些特殊的情况下,在PL/SQL中使用标准的SQL语句或DML语句不能实现自己的需求,比如需要动态建表或某个不确定的操作需要动态执行。这就需要使用动态SQL来实现。本文通过几个实例来详细的讲解动态SQL的使用。  本文适宜读者范围:Oracle初级,中级系

DINYA 8667

动态sql有什么作用什么时候需要使用到动态sql_为什么需要小心的使用动态SQL

为什么需要小心的使用动态SQL在使用EF或者写SQL语句时,查询条件往往是这样一种非常常见的逻辑:如果客户填了查询信息,则查询该条件;如果客户没填,则返回所有数据。我常常看到很多人解决这类问题时使用了错误的静态SQL的解决办法,使得数据库无法利用索引,导致性能急剧下降。介绍数据这次我将使用我的某客户的真实数据来演示(已确认不涉及信息安全?),有一个订单表FoodOrder,结构如...

weixin_31819459的博客 2586

静态SQL与动态SQL的比较

静态SQL与动态SQL的比较

qq_43667184的博客 2019

动态sql_为什么需要动态SQL

为什么需要动态SQL在使用EF或者写SQL语句时,查询条件往往是这样一种非常常见的逻辑:如果客户填了查询信息,则查询该条件;如果客户没填,则返回所有数据。我常常看到很多人解决这类问题时使用了错误的静态SQL的解决办法,使得数据库无法利用索引,导致性能急剧下降。介绍数据这次我将使用我的某客户的真实数据来演示(已确认不涉及信息安全 ),有一个订单表FoodOrder,结构如下: 我在Id、FoodMe...

weixin_39917791的博客 504
上一篇: SqlAlchemy ORM 学习
下一篇: Spring IOC 源码阅读之资源定位加载
Footloose_
博客等级 码龄10年 254粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值