动态游标(例如表名作为参数)以及动态SQL分析
表名作为参数的动态游标
DECLARE
v_table_name VARCHAR2(30) := 'CUX_MES_WIP_BARCODE_MAP';
--l_rec SYS_REFCURSOR;
TYPE t_data IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
TYPE t_cur IS REF CURSOR;
l_data t_data;
l_rec t_cur;
l_cur VARCHAR2(4000);
v_fm_barcode VARCHAR2(30) := 'cxy-p-001';
v_to_barcode VARCHAR2(30) := 'cxy-p-002';
v_barcode VARCHAR2(30);
BEGIN l_cur := 'select barcode from ' || v_table_name || ' where barcode >= ' ||
''''||v_fm_barcode||'''' || ' and barcode <= ' ||
''''||v_to_barcode || '''';
dbms_output.put_line(l_cur);
OPEN l_rec FOR l_cur;
LOOP
EXIT WHEN l_rec%NOTFOUND;
FETCH l_rec BULK COLLECT
INTO l_data;
FOR i IN 1 .. l_data.count LOOP dbms_output.put_line(l_data(i));
END LOOP; END LOOP;
END;
动态SQL
/*
1.什么是动态SQL?
动态SQL是指在运行PL/SQL块时动态输入SQL语句。在PL/SQL块中只能执行DDL(create、alter、drop)、DCL
(grant、revoke)或比较灵活的SQL语句(如select子句不带where条件);
动态SQL的性能不如静态SQL,但是比较灵活;
在PL/SQL块中编写动态SQL语句时需要将SQL语句存放到字符串变量中而且SQL语句可以包含占位符(以冒号开始); 2.动态SQL的语法
2.1 使用execute immediate语句
可以处理多数动态SQL操作如:DDL语句(create、alter、drop)、DML语句(insert、update、delete)、DCL(grant、revoke)
以及单行的select子句;但是不能处理多行查询语句。 2.2 使用open...for,fetch和close语句 在游标中使用。 2.3 使用批量动态SQL语句 */ ---------------------------------------------------------------
***************************************************************
1. 使用execute immediate ---------------------------------------------------------------
1.1 使用execute immediate处理DDL语句
--------------------------------------------------------------- --案例01:使用execute immediate处理DDL语句--create declare
create_table varchar2(200);
begin
create_table:='create table ' ||'&table_name' ||'(sid int, sno int)';
execute immediate create_table ;
end; --案例02:使用execute immediate处理DDL语句---alter declare
alter_table varchar2(200);
begin
alter_table:='alter table &target_table_name modify &column_name varchar2(10)';
execute immediate alter_table ;
end; --案例03:使用execute immediate处理DDL语句---drop declare
drop_table varchar2(200);
begin
drop_table:='drop table ' ||'&target_table_name';
execute immediate drop_table ;
end; --案例04:使用execute immediate处理DDL语句--drop table create or replace procedure drop_table (table_name varchar2)
is
sql_sta varchar2(200);
begin
sql_sta:='drop table ' ||table_name;
execute immediate sql_sta;
end; --调用方法:
exec drop_table('accp'); --案例05:使用execute immediate处理DDL语句--create+select
declare
select_sta varchar2(200);
emp_rec emp%rowtype;
begin
execute immediate
'create table sodi(sid int, sno int)';
select_sta:='select * from emp where empno=:id';
execute immediate select_sta into emp_rec using &1; /*使用占位符时,这个占位符是在引号内使用的*/
end; ---------------------------------------------------------
1.2 使用execute immediate处理DCL语句
---------------------------------------------------------- --案例01:使用execute immediate处理DCL语句--grant create or replace procedure grant_priv(priv varchar2, username varchar2)
is
priv_stat varchar2(200);
begin
priv_stat:=' grant '|| priv || ' to ' || username; --注意字符串和连接符之间的空格
execute immediate priv_stat;
end; --调用方法
exec grant_priv('create session', 'scott'); --案例02:使用execute immediate处理DCL语句--revoke create or replace procedure revoke_priv(priv varchar2, username varchar2)
is
priv_stat varchar2(200);
begin
priv_stat:=' revoke '|| priv || ' from ' || username; --注意字符串和连接符之间的空格
execute immediate priv_stat;
end; --调用方法
exec revoke_priv('create session', 'scott'); ----------------------------------------------------------------
1.3.使用execute immediate处理DML语句
---------------------------------------------------------------- 1.处理无占位符和return子句的DML语句 --案例01:查询子句:select declare
sql_stat varchar2(100);
begin
sql_stat:='select * from emp';
execute immediate sql_stat;
end; --案例02:处理无占位符和return子句的DML语句--insert
declare
insert_table varchar2(200);
begin
insert_table:='insert into &table_name values (&sid, &sno)';
execute immediate insert_table;
end; --案例03:处理无占位符和return子句的DML语句--update
declare
update_table varchar2(200);
begin
update_table:='update &table_name set &column_name=&new_value ';
execute immediate update_table;
end; --案例06:处理无占位符和return子句的DML语句--delete
declare
delete_table varchar2(200);
begin
delete_table:='delete from &table_name ';
execute immediate delete_table;
end; --案例05:新建一个表然后插入数据--create+insert declare
create_table varchar2(200);
begin
create_table:='create table &table_name(sid int, sno int)';
execute immediate create_table ;
end; declare
insert_table varchar2(200);
begin
insert_table:='insert into &table_name values (&sid, &sno)';
execute immediate insert_table;
end; --案例06:同时实现新建一个表并插入数据--create+insert declare
create_table varchar2(200);
insert_table varchar2(200);
begin
create_table:='create table &table_name (sid int, sno int)';
execute immediate create_table ;
insert_table:='insert into &table_name values (&sid, &sno)';
execute immediate insert_table;
end; --案例07:同时实现新建一个表并插入数据--create+insert+update
/*
这里也可以分开写 */ declare
create_table varchar2(200);
insert_table varchar2(200);
update_table varchar2(200);
begin
create_table:='create table &table_name (sid int, sno int)';
execute immediate create_table ;
insert_table:='insert into &table_name values (&sid, &sno)';
execute immediate insert_table;
update_table:='update &table_name set &column_name=&new_value where sid=&old_value';
execute immediate update_table;
end; --案例08:同时实现新建一个表并插入数据--create+insert+update+delete
declare
create_table varchar2(200);
insert_table varchar2(200);
update_table varchar2(200);
delete_table varchar2(200);
begin
create_table:='create table &table_name (sid int, sno int)';
execute immediate create_table ;
insert_table:='insert into &table_name values (&sid, &sno)';
execute immediate insert_table;
update_table:='update &table_name set &column_name=&new_value where sid=&old_value';
execute immediate update_table;
delete_table:='delete from &delete_tablename';
execute immediate delete_table;
end; --案例08:同时实现新建一个表并插入数据--create+insert+update+delete+insert
declare
create_table varchar2(200);
insert_table varchar2(200);
update_table varchar2(200);
delete_table varchar2(200);
re_insert_table varchar2(200);
begin
create_table:='create table &table_name (sid int, sno int)';
execute immediate create_table ;
insert_table:='insert into &table_name values (&sid, &sno)';
execute immediate insert_table;
update_table:='update &table_name set &column_name=&new_value where sid=&old_value';
execute immediate update_table;
delete_table:='delete from &delete_tablename';
execute immediate delete_table;
re_insert_table:='insert into &re_table_name values (&new_sid, &new_sno)';
execute immediate re_insert_table;
end; 2.处理占位符的DML语句 --案例01:处理占位符的DML语句:create+insert
declare
create_table varchar2(200);
insert_table varchar2(200);
begin
create_table:='create table &table_name (sid int, sno int)';
execute immediate create_table ;
insert_table:='insert into &target_table_name values (:sid, :sno)';
execute immediate insert_table using &2,&3;
end; --案例02:处理占位符的DML语句:create+insert_update
declare
create_table varchar2(200);
insert_table varchar2(200);
update_table varchar2(200);
begin
create_table:='create table &table_name (sid int, sno int)';
execute immediate create_table ;
insert_table:='insert into &target_table_name values (:sid, :sno)';
execute immediate insert_table using &1,&2;
update_table:='update &update_tablename set &update_column_name=:new_value where &condition_column=:old_value ';
execute immediate update_table using &3 ,&4;
end; ---or
declare
create_table varchar2(200);
insert_table varchar2(200);
update_table varchar2(200);
begin
create_table:='create table &新建的表名 (sid int, sno int)';
execute immediate create_table ;
insert_table:='insert into &插入数据的表名 values (:sid, :sno)';
execute immediate insert_table using &sid的值 ,&sno的值;
update_table:='update &被更新的表名 set &更新的列名=:new_value where &条件列=:old_value ';
execute immediate update_table using &新值 ,&条件列的值;
end; --案例03:处理占位符的DML语句:create+update+insert+delete declare
create_table varchar2(200);
insert_table varchar2(200);
update_table varchar2(200);
delete_table varchar2(200);
begin
create_table:='create table &table_name (sid int, sno int)';
execute immediate create_table ; insert_table:='insert into &target_table_name values (:sid, :sno)';
execute immediate insert_table using &1,&2; update_table:='update &update_tablename set &update_column_name=:new_value where &update_condition_column=:delete_condition_column_value ';
execute immediate update_table using &3 ,&4; delete_table:='delete from &dele_table_name where &delete_condition_column=:delete_condition_column_value';
execute immediate delete_table using &5;
end; ---执行过程:
SQL> declare
2 create_table varchar2(200);
3 insert_table varchar2(200);
4 update_table varchar2(200);
5 delete_table varchar2(200);
6 begin
7 create_table:='create table &table_name (sid int, sno int)';
8 execute immediate create_table ;
9
10 insert_table:='insert into &target_table_name values (:sid, :sno)';
11 execute immediate insert_table using &1,&2;
12
13 update_table:='update &update_tablename set &update_column_name=:new_value
where &update_condition_column=:delete_condition_column_value ';
14 execute immediate update_table using &3 ,&4;
15
16 delete_table:='delete from &dele_table_name where &delete_condition_column=
:delete_condition_column_value';
17 execute immediate delete_table using &5;
18 end;
19 /
输入 table_name 的值: sz
原值 7: create_table:='create table &table_name (sid int, sno int)';
新值 7: create_table:='create table sz (sid int, sno int)';
输入 target_table_name 的值: sz
原值 10: insert_table:='insert into &target_table_name values (:sid, :sno)';
新值 10: insert_table:='insert into sz values (:sid, :sno)';
输入 1 的值: 101
输入 2 的值: 201
原值 11: execute immediate insert_table using &1,&2;
新值 11: execute immediate insert_table using 101,201;
输入 update_tablename 的值: sz
输入 update_column_name 的值: sid
输入 update_condition_column 的值: sno
原值 13: update_table:='update &update_tablename set &update_column_name=:new_
value where &update_condition_column=:delete_condition_column_value ';
新值 13: update_table:='update sz set sid=:new_value where sno=:delete_conditi
on_column_value ';
输入 3 的值: 1001
输入 4 的值: 201
原值 14: execute immediate update_table using &3 ,&4;
新值 14: execute immediate update_table using 1001 ,201;
输入 dele_table_name 的值: sz
输入 delete_condition_column 的值: sno
原值 16: delete_table:='delete from &dele_table_name where &delete_condition_c
olumn=:delete_condition_column_value';
新值 16: delete_table:='delete from sz where sno=:delete_condition_column_valu
e';
输入 5 的值: 201
原值 17: execute immediate delete_table using &5;
新值 17: execute immediate delete_table using 201; PL/SQL 过程已成功完成。 SQL> select * from sz; 未选定行 3.处理包含returning子句的DML语句 --案例01:处理包含returning子句的DML语句--create+insert+update
declare
create_table varchar2(200);
insert_table varchar2(200);
update_table varchar2(200);
res varchar2(100);
begin
create_table:='create table &new_table_name (sid int, sno int)';
execute immediate create_table;
insert_table:='insert into &insert_target_table_name values (:sid, :sno)';
execute immediate insert_table using &1,&2 ;
update_table:='update &update_target_table_name set &udpate_column_name=:new_value where &condition_column_name=:old_value returning &returning_name into :res';
execute immediate update_table using &3,&4
returning into res;
dbms_output.put_line('the result is : ' ||res);
end;
动态游标(例如表名作为参数)以及动态SQL分析的更多相关文章
- MyBatis在表名作为参数时遇到的问题
之前在用MyBatis的时候没用过表名作为参数,最近使用到了. 基于注释使用MyBatis的Dao层代码如下: @Repository public interface Base1102Dao { @ ...
- mysql表名作为参数传入存储过程
有以下存储过程: CREATE DEFINER=`root`@`localhost` PROCEDURE `P_HoverTreePages`( ), ) , ), ), ), IN `SortTyp ...
- sql 使用存储过程传递列名或表名作为参数
原网址: http://www.cnblogs.com/85538649/archive/2011/09/23/2186155.html alter procedure Proc_UpdateDate ...
- Mysql中表名作为参数的问题
近期由于程序的异常,导致数据库中创建了大量的表(约4000个),纠结的是表中的数据还都是有用的. 需要合并到一个表中,首先想到的就是使用存储过程来处理,但由于表名都是动态生成的,需要解决在存储过程中处 ...
- oracle学习笔记(二十二) REF 动态游标
动态游标 定义语法 --声明 $cursor_name$ sys_refcursor --打开动态游标 open $cursor_name$ is 查询语句; --关闭游标 close $cursor ...
- hibernate动态创建数据库表名几种方式
数据库中数据量很大, 但又不可以删除时同时又要优化程序检索数据时间. 答:方式有很多比如 创建数据库表分区,创建索引, 存储过程等; 我这里采用动态创建数据库表的方式. 完全可以在不创建表分区情况下实 ...
- orcle中如何使用动态游标来对变量进行赋值
在oracle中动态游标的概念一般不常用,但有时根据客户的特殊业务,需要使用到动态游标来解决问题!在对于一条动态SQL语句而产生多条记录时,动态游标的使用将是一个很好的选择,具体参见如下在工作流项目中 ...
- 动态游标(比如表名作为參数)以及动态SQL分析
表名作为參数的动态游标 DECLARE v_table_name VARCHAR2(30) := 'CUX_MES_WIP_BARCODE_MAP'; --l_rec SYS_REFCURSOR; T ...
- C语言中数组名作为参数进行函数传递
用数组名作函数参数与用数组元素作实参有几点不同. 1) 用数组元素作实参时,只要数组类型和函数的形参变量的类型一致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的.因此,并不要求函数的 ...
随机推荐
- Elasticsearch 学习(一):入门
一.概念 Elasticsearch 是一个实时分布式搜索和分析引擎.它用于全文搜索.结构化搜索.分析以及将这三者混合使用. 维基百科.英国卫报.StackOverflow.Github 等公司都在使 ...
- expect IDENTIFIER, actual IDENTIFIER 处理
涉及到注入数据库的报错,这是很常见的了. 但是期望IDENTIFIER,实际IDENTIFIER 的报错,你们知道是什么意思吗? 我已开始看到的时候,是mybatis报错发神经了,报错了报错.再跑一次 ...
- SVN提交时显示:Path is not a working copy directory
说明你地址没有checkout啊 先checkout,才能add和commi. 要是在一个已有的项目出现这个错误,就是包含这个地址的文件夹没添加进去,去上一层再试一次. 总之,养成在项目根目录提交的习 ...
- Kibana插件sentinl使用教程
简介 对于Kibana的一些数据我们有时候是想要对某些字段进行持续关注的,这时候通过报警的手段就可以大幅提升对这些信息状态了解的及时性及可靠性.使用sentinl插件就可以帮助我们实现这个功能. 此教 ...
- os和sys模块的区别及其常用方法总结
官方解释:os: This module provides a portable way of using operating system dependent functionality. 翻译:提 ...
- java.lang.ClassCastException: oracle.sql.CLOB cannot be cast to oracle.sql.CLOB
错误现象: [framework] 2016-05-26 11:34:53,590 -INFO [http-bio-8080-exec-7] -1231863 -com.dhcc.base.db.D ...
- vue开发中v-for在Eslint的规则检查下出现:Elements in iteration expect to have 'v-bind:key' directives
在使用VScode编辑器vue开发过程中,v-for在Eslint的规则检查下出现报错:Elements in iteration expect to have 'v-bind:key' direct ...
- Node.js Query Strings
Query String 稳定性: 3 - 稳定 这个模块提供了一些处理 query strings 的工具,包括以下方法: querystring.stringify(obj[, sep][, eq ...
- PHP $_GET 变量
$_GET 变量 预定义的 $_GET 变量用于收集来自 method="get" 的表单中的值. 从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏 ...
- PHP 实例 AJAX 与 MySQL
AJAX 数据库实例 下面的实例将演示网页如何通过 AJAX 从数据库读取信息: 实例 Person info will be listed here... 实例解释 - MySQL 数据库 在上 ...