在PL/SQL使用游标获取数据及动态SQL
1.游标概念:
当在PL/SQL块中执行DML(增删改)时,Oracle会为其分配上下文区(Context Area),游标是指向上下文区的指针
2. 游标分类:
A. 隐式游标
a. 在PL/SQL中使用DML语句时自动创建隐式游标
b. 隐式游标自动声明、打开和关闭,其名为 SQL
c. 通过检查隐式游标的属性可以获得最近执行的DML 语句的信息
d. 隐式游标的属性有:
%FOUND – SQL 语句影响了一行或多行时为 TRUE
%NOTFOUND – SQL 语句没有影响任何行时为TRUE
%ROWCOUNT – SQL 语句影响的行数
%ISOPEN - 游标是否打开,始终为FALSE
e. 隐式游标的错误处理:NO_DATA_FOUND:没有查询到任何行。TOO_MANY_ROWS:返回多行。
B. 显式游标
a. 显式 游标的使用步骤:
1) 声明显式游标语法:
CURSOR 游标名[(游标参数列表)] [RETURN 返回值规范] IS SELECT 语句 [FOR UPDATE OF [列名列表]];
2) 打开显式游标语法:
OPEN 显式游标名 (参数列表);
3) 提取数据语法:
FETCH 游标名 INTO 记录或变量列表;
4) 关闭游标语法:
CLOSE 游标名;
b. 显式游标属性
显式游标名%属性
%FOUND – SQL 语句影响了一行或多行时为 TRUE
%NOTFOUND – SQL 语句没有影响任何行时为TRUE
%ROWCOUNT – SQL 语句影响的行数
%ISOPEN - 游标是否打开,始终为FALSE
3. 循环游标 :
用于简化游标处理代码、当用户需要从游标中提取所有记录时使用
循环游标的语法如下:
FOR <record_index> IN <cursor_name>
LOOP
<executable statements>
END LOOP;
4. BULK COLLECT
为什么要使用BULK COLLECT?
提交PL/SQL中SELECT语句的查询效率。
原理:减少了PL/SQL与SQL引擎之间的开关次数,因而加速了数据获取的速度
语法:
... BULK COLLECT into 集合
5. REF 游标和游标变量:用于处理运行时动态执行的 SQL 查询
使用游标变量的步骤:
A. 创建游标变量需要两个步骤:
a. 声明 REF 游标类型
b. 声明 REF 游标类型的变量
用于声明 REF 游标类型的语法为:
TYPE <ref_cursor_name> IS REF CURSOR [RETURN <return_type>];
用于声明REF 游标类型变量的语法:变量名 游标类型名;
B. 打开游标变量的语法如下:
OPEN cursor_name FOR select_statement;
C. 提取数据语法:
a. FETCH 游标变量名 INTO 接收游标数据的变量 ……;
b. FETCH 游标变量名 INTO 接收游标结果的集合变量 ….[LIMIT rows];
D. 关闭游标变量语法:CLOSE 游标变量名 ;
6. 游标变量的优点和限制
A. 游标变量的优点有:
a. 可从不同的 SELECT 语句中提取结果集
b. 可以作为过程的参数进行传递
c. 可以引用游标的所有属性
d. 可以进行赋值运算
B. 使用游标变量的限制:
a. 不能在程序包中声明游标变量
b. FOR UPDATE子句不能与游标变量一起使用
c. 不能使用比较运算符
7. 动态SQL概述
A. 绑定
a. 编译器识别程序中的标识符存储位置的过程。
b. 分类:早期绑定与晚期绑定
B. 动态 SQL 是指在PL/SQL程序执行时生成的 SQL 语句
C. DDL 语句命令和会话控制语句不能在 PL/SQL 中直接使用,但是可以通过动态 SQL 来执行
D. 两种动态SQL技术
a. DBMS_SQL包:Oracle 8i以前使用。
b. 本地动态SQL:Oracle 9i以后使用。
对比:本地动态SQL更简单、执行更快。
E. 执行动态SQL
a. 语法1:execute immediate 'sql语句字符串'
b. 语法2:open x for 'sql语句字符串'
8. 绑定变量
A. 为什么使用绑定变量:减少编译SQL的次数,提交执行效率
B. 绑定变量说明
execute immediate
'insert into t1(f1,f2) values(:a,:b)' using x,y;
注意: using后面的变量与绑定变量根据位置一一对应。 x-->a、y-->b
C. 绑定变量的使用
a. 在SQL*PLUS(命令窗口) 中使用绑定变量
只能在SQL*PLUS交互环境下使用。
b. 在PL/SQL(存储过程和函数)中使用绑定变量
参数引用的已经是绑定变量。
c. 在动态SQL中使用绑定变量
只能绑定字面量(替换具体的值)
不能替换数据库对象名称
d. 在JDBC中使用绑定变量
PreparedStatement对象
9. 动态SQL语法
语法1:execute immediate 'sql语句字符串'
语法2:open for 'sql语句字符串'
在PL/SQL使用游标获取数据及动态SQL的更多相关文章
- 如何用asp.net MVC框架、highChart库从sql server数据库获取数据动态生成柱状图
如何用asp.net MVC框架.highChart库从sql server数据库获取数据动态生成柱状图?效果大概是这样的,如图: 请问大侠这个这么实现呢?
- ajax异步获取数据后动态向表格中添加数据(行)
因为某些原因,项目中突然需要做自己做个ajax异步获取数据后动态向表格中添加数据的页面,网上找了半天都没有 看到现成的,决定自己写个例子 1.HTML页面 <!doctype html> ...
- 【PL/SQL系列】Oracle存储过程使用动态SQL
Oracle存储过程相信大家都比较了解,下面就为您介绍Oracle存储过程使用动态SQL的方法,希望对您能够有所帮助. CREATE OR REPLACE PROCEDURE P_STAT_SCORE ...
- treeTable的使用(ajax异步获取数据,动态渲染treeTable)
一.展示效果(treetable基本样式https://www.cnblogs.com/shuihanxiao/p/10413454.html) 二.html文件(若一个页面又多个treetable, ...
- 游标使用 和sp_executesql动态sql
/****** Script for SelectTopNRows command from SSMS ******/ declare @oid int declare @cid int declar ...
- mybatis 的sql语句及使用mybatis的动态sql mybatis防注入
由于看到写的比较详细的文档这里将之前的删掉了,只留下一些我认为能帮助理解的和关于动态sql及防注入的一些理解.文档链接 :mybatis官方文档介绍 <!-- 根据条件查询用户 --> ...
- sql server rdl report 如何用动态sql
我做rdl report 一般用存储过程,可是今天遇到个问题,需要用动态sql,rdl report数据集不能绑定字段 查了一下谷歌,解决如下: declare @CarrierList table ...
- sql 根据时间获取数据
获取当月数据 MONTH(时间字段)=MONTH(GETDATE()) and year(时间字段)=year(GETDATE()) 计算两个时间差了多少分钟 DATEDIFF(mi,'7:00',c ...
- Oracle SQL Lesson (1) - 使用SQL Select语句获取数据
第一节课: 启动数据库并且使用特定用户连接:su - oracle; 启动sqlplus并且使用sys连接:conn / as sysdba; 启动数据库:startup; 解锁用户:alter us ...
随机推荐
- react 导航切换
<ul class="nav"> <li onClick={() => this.changeFontColor(0)} className={`${0 = ...
- 如何同步iframe与嵌入内容的高度
最近频繁的做一些通过iframe在a页面嵌入b页面需求.总结下来,有以下问题需要解决 1.如何同步iframe与嵌入内容的高度 2.将b页面载入到a页面后,如何隐藏掉b页面上的元素,如左导航,顶部导航 ...
- pipreqs(找当前项目依赖的包)
pipreqs pipreqs可以帮你找到当前项目的所有组件及其版本.就是当别人给你一个程序的时候,你要在自己电脑上运行起来,就需要安装程序所依赖的组件,总不能自己一个一个找吧. # 安装 pip3 ...
- sectional data interpolation in Tecplot
$!Varset |NumLoop|= $!Loop |NumLoop| $!Varset |num|=(|Loop|*+) $!RotateData ZoneList = [] Angle = |n ...
- 为什么要有uboot?带你全面分析嵌入式linux系统启动过程中uboot的作用
1.为什么要有uboot 1.1.计算机系统的主要部件 (1)计算机系统就是以CPU为核心来运行的系统.典型的计算机系统有:PC机(台式机+笔记本).嵌入式设备(手机.平板电脑.游戏机).单片机(家用 ...
- 页面加载即执行JQuery的三种方法
[1]$(function( ){ }): $(function(){ $("#name").click(function(){ //adding your code here } ...
- jquery ajax获取json并解析,获取的json是object对象格式
首先我们使用的是ajax方式,推荐一个学习网址: http://blog.csdn.net/shiyaru1314/article/details/51065410 这个博主写的特别好.现在来看我们的 ...
- [24点计算器][C++版本]无聊拿去玩
特性:数字数量.目标答案不限,当然数据大了会很慢... 基本可以去除所有本质相同的表达式...至少能等出结果的数据规模可以.. 安卓:http://yun.baidu.com/s/1slCGILn 程 ...
- HDU——1787 GCD Again
题意: 在一次acm竞赛之后,你花了一些时间去思考和尝试解决那些未解决的问题吗? 不知道?哦,当你想成为“大牛”的时候,你就必须这样做. 现在你会发现,这个问题是如此熟悉: 两个正整数a和b的最大GC ...
- Spring关于使用注解@Configuration去配置FormattingConversionServiceFactoryBean来实现自定义格式字符串处理无效的问题(未找到是什么原因造成的)
说明:在Spring MVC和Spring Boot中都能正常使用. 首先,我实现了一个自定义的注解,@Trimmed去除字符串String的前后空格. 如果是在Spring MVC的XML配置中,可 ...