execute immediate在存储过程中的使用
execute immediate 在存储过程中使用较为频繁,其作用是巨大的,下面简单介绍其基本用法
1:在存储过程中,我们知道只能使用DML语句,那么如果要使用DDL语句呢,就得使用execute immediate。例如:
WANG@db>create or replace procedure pro1
2 is
3 begin
4 create table table1(id int);
5 end;
6 /
Warning: Procedure created with compilation errors.
因为没有存储过程(匿名块也一样),不能使用DDL语句,所以报错,接下来我们使用execute immediate在存储过程中使用DDL语句
WANG@db>create or replace procedure pro1
2 is
3 begin
4 execute immediate 'create table table1(id int)';
5 end;
6 /
Procedure created.
执行该存储过程就可以创建一个表了,但是这里要注意你的用户必须有创建表的权限,并且这个权限不是在角色里面的赋予的。否则会报错。
WANG@db>conn / as sysdba
Connected.
SYS@db>grant create table to wang;
Grant succeeded.
SYS@db>conn wang/beijing
Connected.
WANG@db>exec pro1;
2:在写存储过程中,可能会碰到你查询的表是变量值,这个是时候直接使用变量是不行的,因外其会把变量名作为表名,而不是把变量值作为表名(这跟SHELL有所不同)。
例:
WANG@db>create or replace procedure pro2
2 is
3 v_table_name varchar2(20);
4 v_count varchar2(20);
5 begin
6 v_table_name :='testemp';
7 select count(*) into v_count from v_table_name;
8 dbms_output.put_line(v_count);
9 end;
10 /
Warning: Procedure created with compilation errors.
可以使用字符串截取你要是使用的SQL语句,在使用execute immediate 这个SQL实现该功能,这里需要说明的是普通的存储过程是通过select xxx into yyy from zz 来进行赋值的,但是使用execute immediate是使用execute immediate sql into zz来进行复制的。
例如:使用exexute immediate 来实现上面的功能
WANG@db>create or replace procedure pro2
2 is
3 v_table_name varchar2(20);
4 v_count number;
5 v_sql varchar2(100);
6 begin
7 v_table_name:='testemp';
8 v_sql:='select count(*) from ' || v_table_name;
9 execute immediate v_sql into v_count;
10 dbms_output.put_line(v_count);
11 end;
12 /
Procedure created.
WANG@db>exec pro2;
PL/SQL procedure successfully completed.
WANG@db>set serverout on
WANG@db>exec pro2;
14
这跟SHELL里面是不一样的,我们看到在使用DML语句后面接变量时,其不会使用变量的值,但是在SEHLL里面是使用的、,例如:
脚本内容:
[oracle@ogg_source /home/oracle]$cat test.sh
#!/bin/bash
table_name=testemp
fun(){
table_name=$1
sqlplus -s wang/beijing << EOF
set feedback off pagesize 0 linesize 200
select count(*) from $table_name;
exit;
EOF
}
main(){
v_count=`fun $table_name`
echo $v_count
}
main
执行结果:
[oracle@ogg_source /home/oracle]$sh test.sh
14
execute immediate在存储过程中的使用相关推荐
- oracle execute存过,存储过程中慎用 execute immediate
存储过程中慎用 execute immediate , execute immediate 执行DDL语句一定要小心,否则会造成数据一至性问题. [@more@] 1, create table t1 ...
- oracle execute immediate create,execute immediate在oracle存储过程中的使用
execute immediate 在存储过程中使用较为频繁,其作用是巨大的,下面简单介绍其基本用法 1:在存储过程中,我们知道只能使用DML语句,那么如果要使用DDL语句呢,就得使用execute ...
- 在存储过程中调用execute immediate 执行 create table语句报TBR-17004: Permission denied
错误描述: 在存储过程中调用execute immediate 执行 create table语句报错TBR-17004 权限不正确,但是直接执行该语句不报错. SQL> conn sys/ti ...
- 存储过程中返回结果集
存储过程中返回结果 从存储过程中返回结果有三种方式: 1. 返回结果集 这是客户端应用程序返回结果的最通用的方法.结果集是通过使用select语句选择数据产生的.结果集可以从永久表.临时表或局部变量中 ...
- 实例讲解如何把表格变量传递到存储过程中
传递表值参数 用户经常会碰到许多需要把数值容器而非单个数值放到存储过程里的情况.对于大部分的编程语言而言,把容器数据结构传递到例程里或传递出来是很常见而且很必要的功能.TSQL也不例外. SQL Se ...
- mysql 存储过程中limit
mysql 存储过程中limit 1.mysql的高版本(5.5),存储过程中的limit可以使用变量,如下:select * from student limit iStart,iNum; 2.my ...
- 以表达式作为参数传入SQL的存储过程中去
在开发过程中,需要把一句Sql 的expression作为一个参数传入Procedure中去. 在asp.net中,一个Search的动作,把用户所操作的搜索条件写成了一句表达式,现只需要把这句表达式 ...
- oracle存储过程日志打印,如何在oracle存储过程中逐行打印
我正在执行一个存储过程,但它在某个时候失败了, 当前错误代码不帮我找到错误的位置和确切位置 我想知道它正在失败,所以想要在执行时逐行输出. 例如:如何在oracle存储过程中逐行打印 create o ...
- 在存储过程中构建动态SQL
目录 介绍 sp_executesql与EXECUTE命令 例1.0 例1.1 存储过程中的动态SQL 例2.0 在动态SQL中使用Like操作符,IN操作符和Order By 例3.0 - 使用LI ...
最新文章
- 实现自己的“单页”博客,只需要一个指令 (Moka)
- 需求分析挑战之旅——疯狂的订餐系统
- 005 NsPack 1.4 之附加数据初探
- android官方文档中文版_Now in Android:01 - 如何掌握最新的 Android 技术?
- 线程池ThreadPool,线程池底层ThreadPoolExecutor方法七大参数,拒绝策略,以及实际开发中高并发下用到哪个线程池?
- vscode 支持ansi_vscode terminal美化
- 01-路由跳转 安装less this.$router.replace(path) 解决vue/cli3.0语法报错问题
- C++中之---数组和vector
- Transact-SQL 存储过程(c#调用执行)
- 编程初学者必须知道的十件事
- 代码生成工具系列-----代码生成工具(CodeEasy)介绍
- android 合并数组
- Verilog HDL 出租车计费器实现
- linux其他命令(查找文件、软链接、硬链接)
- python入门教程陈孟林_适用于小白的 python 快速入门教程
- ios mac使用mitmproxy抓包
- ubuntu命令行启动浏览器_linux命令行下使用linux打开浏览器命令
- 直方图均衡化、规定化、局部直方图、直方图统计
- Jmeter接口测试-if控制器
- 提示dns服务器未响应,网络诊断提示DNS服务器未响应解决方法_
热门文章
- ipad怎么压缩文件?教你一招快捷压缩图片
- windows下使用nexus3.x搭建maven私服
- FISCO BCOS 2022年度贡献者榜单
- 脏写、脏读、不可重复读、幻读的区别
- mysql只能导出65535条_导出Excel超过65535条限制解决方案
- 用Chrome浏览器模拟手机,andriord,iphone,ipad访问网站
- Ubuntu下图片转pdf和pdf合并
- 【渝粤教育】电大中专常见病药物治疗 (3)作业 题库
- Cadence 中贴片元件焊盘的制作
- vue+echarts+自适应 实现可视化大屏展示效果