PLSql 动态SQL应用

一、知识点

(1)表类型

表类型变量table
语法如下:
type 表类型 is table of 类型 index by binary_integer;
表变量名 表类型;
类型可以是前面的类型定义,index by binary_integer 子句代表以符号整数为索引,这样访问表类型变量中的数据方法就是“表变量名(索引符号整数)”。table类型就是一个可变长的数组,key(符号整数索引)必须是整数,可以是负数,value(类型)可以是标量,也可以是record类型。可以不按顺序赋值,但必须先赋值后使用。

可以使用count、delete、first、last、next、exists和prior
等属性进行操作,使用方法为“表变量名.属性”,返回的是数字。

(2)动态SQL

动态sql是指在运行时候才构建的sql语句,静态sql指的是在代码编译时刻就已经包含在代码中的那些已经充分明确的固定的sql语句,而动态plsql是指整个跑了sql代码块都是动态构建,然后再编译执行的。

动态sql最大的优点就是可以灵活的变量带入,返回变量。

execute immediate 语句

execute immediate sql_string

[into{define_variable[,define_variable]…|record}]

[using|in|out| in out]bind_argument

[,[in |out|in out]bind_argument]…];

sql_string

这是一个包含了sql语句或者pl/sql代码块的字符串表达式。

define_variable

这是一个用于接收查询中的某一列值得变量

bind_argument

这是一个表达式,表达式的值将传递给sql语句或者plsql,同时可以是一个标识符

into子句

这个子句用于单行的查询;对于查询结果的每一列的值,必须提供单独的变量接收

using子句

利用这个语句,可以给sql字符串提供绑定参数,同时可以用于动态sql和动态plsql,不过这个模式只对plsql有意义,缺省模式是in。详细来讲就是using中使用的绑定参数可以使用在sql和plsql中,如果使用在plsql中需要制定是in、out还是in out模式默认情况下为in,而在sql中没用模式一说。注意不能传入null值,必须使用一个类型正确,并且恰好是null的变量来传入。

不能绑定plsql转悠类型,布尔,关联数组等以及用户自定义的记录类型。其传入的参数如果是

二、测试验证

(1)测试脚本

declaretype tabletype1 is table of varchar2(20) index by binary_integer;table_text tabletype1; --定义表类型sqltext    varchar2(1000);vnum   number(10);o_id   varchar2(30);c_id   varchar2(30);v_city varchar2(10);v_num number(6);begin
--表类型中增加数据,一维表table_text(1) := 'TB_PART_HASH';table_text(2) := 'TB_PART_LIST';table_text(3) := 'TB_PART_LIST_HASH';table_text(4) := 'TB_PART_RANGE';
--测试表类型的方法dbms_output.put_line('总记录数:' || to_char(table_text.count));dbms_output.put_line('第一条记录:' || table_text.first);dbms_output.put_line('最后条记录:' || table_text.last);dbms_output.put_line('第二条的前一条记录:' || table_text.prior(2));dbms_output.put_line('第三条的后一条记录:' || table_text.next(3));--动态SQL测试,from 后的表名是动态的,统计结果保存到变量中sqltext := 'select count(*) from ' || table_text(2);dbms_output.put_line(sqltext);execute immediate sqltextinto vnum;dbms_output.put_line(vnum);--动态SQL测试,两个条件是变量,查询结果是一行两列记录保存到变量中o_id    := 'iXQrIXEEAMLWgXwi';c_id    := 'HUKNXTMTYDHMDEOS';sqltext := 'select city ,order_num from ' || table_text(1) || ' where order_id = ' || '''' || o_id || '''' ||' and ' || ' contract_id = ' || '''' || c_id || '''';dbms_output.put_line(sqltext);execute immediate sqltextinto v_city,v_num;dbms_output.put_line('City:' || v_city || ' ,Order num: ' ||to_char(v_num));--使用using 传递变量sqltext := 'select city ,order_num from ' || table_text(1) ||' where order_id = :1  and  contract_id = :2 ';dbms_output.put_line(sqltext);
--注意into要在using前,否则报错execute immediate sqltextinto v_city,v_numusing  o_id, c_id;dbms_output.put_line('City:' || v_city || ' ,Order num: ' ||to_char(v_num));
end;

(2)输出结果

总记录数:4
第一条记录:1
最后条记录:4
第二条的前一条记录:1
第三条的后一条记录:4
select count(*) from TB_PART_LIST
2103000
select city ,order_num from TB_PART_HASH where order_id = ‘iXQrIXEEAMLWgXwi’ and contract_id = ‘HUKNXTMTYDHMDEOS’
City:GUANGZHOU ,Order num: 7790
select city ,order_num from TB_PART_HASH where order_id = :1 and contract_id = :2
City:GUANGZHOU ,Order num: 7790

三、小结

1、表类型,就相当于数组操作,可以是一维,也可以是多维。
2、拼接执行语句:

sqltext := ‘select city ,order_num from ’ || table_text(1) || ’ where order_id = ’ || ‘’’’ || o_id || ‘’’’ ||

效率低,每次执行需要编译。

用using 绑定变量

sqltext := ‘select city ,order_num from ’ || table_text(1) ||’ where order_id = :1 and contract_id = :2 ';

执行效率高,编写简单。
注意:传递变量只能在等号后面,在from后面还是需用拼接的方式传递变量(表名)。
不可能写成以下方式:

sqltext := 'select city ,order_num from :0 where order_id = :1 and contract_id = :2 ';

3、into必须在using前面

execute immediate sqltext
into v_city,v_num
using o_id, c_id;

PLSql 动态SQL应用理解相关推荐

  1. PLSQL——动态SQL、异常(预定义异常、非预定义异常、自定义异常)、引发应用程序错误

    1.动态 SQL 动态 SQL 是指在PL/SQL程序执行时生成的 SQL 语句 编译程序对动态 SQL 不做处理,而是在程序运行时动态构造语句.对语句进行语法分析并执行 DDL 语句命令和会话控制语 ...

  2. PLSQL 动态SQL

    在PL/SQL程序开发中,可以使用DML语句和事务控制语句,但是还有很多语句(比如DDL语句)不能直接在PL/SQL中执行. 这些语句可以使用动态SQL来实现. 语法格式:动态SQLEXECUTE I ...

  3. 9、mybatis中动态sql的使用

    对于初学者,如何进行mybatis的学习呢?我总结了几点,会慢慢的更新出来.首先大家需要了解mybatis是什么.用mybatis来做什么.为什么要用mybatis.有什么优缺点:当知道了为什么的时候 ...

  4. plsql动态的sql

    12 动态SQL语句和动态PLSQL语句 SQL语句 --  静态的SQL语句.动态的SQL语句 静态的SQL语句  --  在编译的时候已经确定的SQL,语法和语义引用也是在编译的时候确定下来的   ...

  5. SQL Server-聚焦深入理解动态SQL查询(三十二)

    前言 之前有园友一直关注着我快点出SQL Server性能优化系列,博主我也对性能优化系列也有点小期待,本来打算利用周末写死锁以及避免死锁系列的接着进入SQL Server优化系列,但是在工作中长时间 ...

  6. PLSQL之动态SQL与异常

    1.动态 SQL   动态 SQL 是指在PL/SQL程序执行时生成的 SQL 语句 编译程序对动态 SQL 不做处理,而是在程序运行时动态构造语句.对语句进行语法分析并执行 DDL 语句命令和会话控 ...

  7. Oracle 动态游标 PL/SQL 动态SQL语句 open for [using] 语句

    PL/SQL:open for [using] 语句 2017年07月19日 09:52:55 学孩儿无牙哭做粥 阅读数:681 标签: oracleSQLPLSQL 更多 个人分类: ORACLES ...

  8. oracle存储过程动态sql单引号拼接和变量拼接

    1.单引号的作用 在oracle中单引号主要有两个作用: 一是字符串都用单引号引用,例如'abc':二是转义符,转义符在使用时一般会出现多个连在一起的单引号,相对难理解一些.下面举例说明. 实例1:s ...

  9. Oracle 动态SQL语句

    Oracle 动态SQL语句     EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQLpackage包.  它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块 ...

最新文章

  1. siblings获取不平级_siblings()是获取平级元素,哪不是平级应该怎么获取元素呢?...
  2. 清华大学AMiner团队发布《超级计算机研究报告》(附下载)
  3. 人工智能中常见的误区
  4. ExtJs之Ext.grid.GridPanel(部分未完)
  5. 【OpenCV3】图像的读取、显示与保存
  6. 垂直梯形校正画质损失多少_投影仪梯形校正会影响画质吗?投影仪梯形校正调不正怎么办?...
  7. ZigBee,ZStack
  8. Git 常用命令(二)
  9. 【设计模式】第二章 代理模式
  10. python实现雪花动态图_如何通过雪花算法用Python实现一个简单的发号器
  11. 斯威夫特山地车_斯威夫特枚举
  12. ORCU浅析之安装和作用
  13. (转)嘉信理财再度全面降佣,它会否成为投资界的Amazon?
  14. ug80浩强工具_浩强工具下载|浩强UG工具下载 v2.59 最新版 - 比克尔下载
  15. 49个excel常用技巧(三)
  16. 电话交换机的作用,程控交换机的作用
  17. 2021年「博客之星」参赛博主:尔嵘
  18. 带附件的邮件的发送方法
  19. python3学习笔记
  20. 互动媒体技术——编程习作集

热门文章

  1. wangEditor实现导入word并将内容显示到编辑器中
  2. Win7下设置各种分辨率的方法
  3. svn合并不同树_如何利用SVN合并代码
  4. python turtle画笑脸_如何用Python画滑稽笑脸
  5. c++ memset函数使用及头文件
  6. 高校教师曝职评内幕:混行政圈比科研圈更重要
  7. inflater的用法
  8. 数值分析-雅克比迭代法
  9. 分享一些好用的插件(大佬看了都说好)
  10. CentOS下安装JDK的四种方法和卸载JDK