没有合适的资源?快使用搜索试试~ 我知道了~
首页oracle关于动态SQL的使用
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/359845/bg1.jpg)
关于动态 SQL 的使用 -----摘录
内容摘要:在 开发过程中,使用 , 可以实现大部份的需求,但是在某些特殊
的情况下,在 中使用标准的 语句或 语句不能实现自己的需求,比如需要动态建
表或某个不确定的操作需要动态执行。这就需要使用动态 来实现。本文通过几个实例来详细的
讲解动态 的使用。
本文适宜读者范围: 初级,中级
系统环境:
OS:英文版
Oracle:
正 文:
一般的 程序设计中,在 和事务控制的语句中可以直接使用 ,但是 语句
及系统控制语句却不能在 中直接使用,要想实现在 中使用 语句及系统控制语
句,可以通过使用动态 来实现。
首先我们应该了解什么是动态 ,在 数据库开发 块中我们使用的 分为:
静态 语句和动态 语句。所谓静态 指在 块中使用的 语句在编译时是明确
的,执行的是确定对象。而动态 是指在 块编译时 语句是不确定的,如根据用户输
入的参数的不同而执行不同的操作。编译程序对动态语句部分不进行处理,只是在程序运行时动态
地创建语句、对语句进行语法分析并执行该语句。
中动态 可以通过本地动态 来执行,也可以通过 包来执行。下面就这
两种情况分别进行说明:
一、本地动态 SQL
本地动态 是使用 !"!#$%!&!&'%! 语句来实现的。
1、本地动态 SQL 执行 DDL 语句:
需求:根据用户输入的表名及字段名等参数动态建表。
createorreplaceprocedure( ))
)* +invarchar2,--表名
.invarchar2,--字段名
))/(invarchar2,--字段类型
.invarchar2,--字段名
))/(invarchar2 --字段类型
as
) 0varchar212
begin
) 034))*55)* +5555.5555))/(55,55.5555))/(552
executeimmediate) 02--动态执行 语句
exception
whenothersthen
null2
end2
以上是编译通过的存储过程代码。下面执行存储过程动态建表。
![](https://csdnimg.cn/release/download_crawler_static/359845/bg2.jpg)
SQL6execute( ))/ )),,7+*)7,+,892
SQLprocedure77/+()
SQL6desc/ ))2
NameType:7*Default#++)
---- ------------- -------- ------- --------
IDNUMBER
NAMEVARCHAR2;
SQL6
到这里,就实现了我们的需求,使用本地动态 根据用户输入的表名及字段名、字段类型等参数
来实现动态执行 语句。
2、本地动态 SQL 执行 DML 语句。
需求:将用户输入的值插入到上例中建好的 / )) 表中。
createorreplaceprocedure( )
idinnumber,--输入序号
nameinvarchar2 --输入姓名
as
) 0varchar212
begin
) 034))/ ))873,32
executeimmediate) 0usingid,name2--动态执行插入操作
exception
whenothersthen
null2
end2
执行存储过程,插入数据到测试表中。
SQL6execute( ),/2
SQLprocedure77/+()
SQL6select<from/ ))2
IDNAME
/
在上例中,本地动态 执行 语句时使用了 7= 子句,按顺序将输入的值绑定到变量,如
果需要输出参数,可以在执行动态 的时候,使用 >!%$>:&:?&:%子句,如:
declare
( number342
8 7)number2
begin
![](https://csdnimg.cn/release/download_crawler_static/359845/bg3.jpg)
8 )=34)7)<+)* +9432
executeimmediate8 )=into8 7)using( 2
end2
更多的关于动态 中关于返回值及为输出输入绑定变量执行参数模式的问题,请读者自行做测试。
二、使用 DBMS_SQL 包
使用 包实现动态 的步骤如下:'、先将要执行的 语句或一个语句块放到一个
字符串变量中。、使用 包的 ( 过程来分析该字符串。#、使用 包的
* 8* 过程来绑定变量。、使用 包的 @7) 函数来执行语句。
1、使用 DBMS_SQL 包执行 DDL 语句。
需求:使用 包根据用户输入的表名、字段名及字段类型建表。
createorreplaceprocedure( *+ 0
)* +invarchar2,--表名
. +invarchar2,--字段名
))/(invarchar2,--字段类型
. +invarchar2,--字段名
))/(invarchar2 --字段类型
as
8 7number2--定义光标
8 )=varchar22--定义字符串变量
8 number2--行数
begin
8 734*+ 0( 72--为处理打开光标
8 )=34))*55)* +5555. +5555))/(55,55. +5555
))/(552
*+ 0(8 7,8 )=,*+ 0)82--分析语句
8 34*+ 0execute8 72--执行语句
*+ 0 78 72--关闭光标
exception
whenothersthen
*+ 0 78 72--关闭光标
raise2
end2
以上过程编译通过后,执行过程创建表结构:
SQL6execute( *+ 0/ )),,7+*)
7,+,892
SQLprocedure77/+()
SQL6desc/ ))2
NameType:7*Default#++)
![](https://csdnimg.cn/release/download_crawler_static/359845/bg4.jpg)
---- ------------- -------- ------- --------
IDNUMBER
NAMEVARCHAR2;
SQL6
2、使用 DBMS_SQL 包执行 DML 语句。
需求:使用 包根据用户输入的值更新表中相对应的记录。
查看表中已有记录:
SQL6select<from/ ))2
IDNAME
#:
A!>
SQL6
建存储过程,并编译通过:
createorreplaceprocedure( *+ 0 7()
idnumber,
namevarchar2
as
8 7number2--定义光标
8 )=varchar22--字符串变量
8 number2--行数
begin
8 734*+ 0( 72--为处理打开光标
8 )=347()/ )))+43( +943( 2
*+ 0(8 7,8 )=,*+ 0)82--分析语句
*+ 0* 8*8 7,3( +,name2--绑定变量
*+ 0* 8*8 7,3( ,id2--绑定变量
8 34*+ 0execute8 72 --执行动态SQL
*+ 0 78 72--关闭光标
exception
whenothersthen
*+ 0 78 72--关闭光标
raise2
end2
执行过程,根据用户输入的参数更新表中的数据:
SQL6execute( *+ 0 7(), /2
![](https://csdnimg.cn/release/download_crawler_static/359845/bg5.jpg)
SQLprocedure77/+()
SQL6select<from/ ))2
IDNAME
/
A!>
SQL6
执行过程后将第二条的 + 字段的数据更新为新值 /。这样就完成了使用 *+ 0
包来执行 语句的功能。
使用 中,如果要执行的动态语句不是查询语句,使用 !@7) 或
B* B7 来执行,如果要执行动态语句是查询语句,则要使用
. 7+ 定义输出变量,然后使用 !@7),
C)9 >, #7+ B7 及 B* B7 来执行
查询并得到结果。
总结说明:
在 开发过程中,我们可以使用动态 来执行 语句、 语句、事务控制语句及系
统控制语句。但是需要注意的是, 块中使用动态 执行 语句的时候与别的不同,在
中使用绑定变量是非法的(* 8*8 7,3( +,+),分析后不需要执
行 B*,直接将输入的变量加到字符串中即可。另外, 是在调用
'>! 时执行的,所以 !"!#$%! 也可以不用,即在上例中的
8 34*+ 0@7)8 7部分可以不要。
13AD5添加评论 5固定链接 5引用通告 5写入日志 5计算机与 &))
这样的 SQL 如何写[行列转换]
问题的提出
)*有一个 B3$ & #7+2
))3
&@ :+%* :+#7+ :+#7+ )
---------------------------------------------------------------------------------------
& &%!>&
& &%!>&
& &%!&%!
& A" &%!&%
& A" &%!&%!
& A" &%!)A
剩余23页未读,继续阅读
![application/pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
atmcle
- 粉丝: 1
- 资源: 1
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- 京瓷TASKalfa系列维修手册:安全与操作指南
- 小波变换在视频压缩中的应用
- Microsoft OfficeXP详解:WordXP、ExcelXP和PowerPointXP
- 雀巢在线媒介投放策划:门户网站与广告效果分析
- 用友NC-V56供应链功能升级详解(84页)
- 计算机病毒与防御策略探索
- 企业网NAT技术实践:2022年部署互联网出口策略
- 软件测试面试必备:概念、原则与常见问题解析
- 2022年Windows IIS服务器内外网配置详解与Serv-U FTP服务器安装
- 中国联通:企业级ICT转型与创新实践
- C#图形图像编程深入解析:GDI+与多媒体应用
- Xilinx AXI Interconnect v2.1用户指南
- DIY编程电缆全攻略:接口类型与自制指南
- 电脑维护与硬盘数据恢复指南
- 计算机网络技术专业剖析:人才培养与改革
- 量化多因子指数增强策略:微观视角的实证分析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)