表名作为參数的动态游标

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分析的更多相关文章

  1. 动态游标(例如表名作为参数)以及动态SQL分析

    表名作为参数的动态游标 DECLARE v_table_name VARCHAR2(30) := 'CUX_MES_WIP_BARCODE_MAP'; --l_rec SYS_REFCURSOR; T ...

  2. 关于mysql存储过程创建动态表名及參数处理

      转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)  近期游戏開始第二次内測,開始处理操作日志.最開始把日志放到同一个表里面,发现一天时间,平均100玩家 ...

  3. 获取Oracle隐含參数信息

    Oracle数据库的初始化參数.主要来源于两个Oracle内部数据字典表:X$KSPPCV和X$KSPPI通常我们查询的V$Parameter视图或使用show parameter命令都是就来源于这两 ...

  4. SQL报错error:索引中丢失IN或OUT參数

    简单记录下: 今天mybatis中遇到一个错误: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallba ...

  5. C语言中main函数的參数具体解释

    main函数的定义形式         main函数能够不带參数,也能够带參数,这个參数能够觉得是 main函数的形式參数.C语言规定main函数的參数仅仅能有两个,习惯上这两个參数写为argc和ar ...

  6. jQuery动态创建form表单并提交到后台(携带一定的数据进行页面跳转)

    今天遇到这么一个需求,携带一个编号一个名字跳转到另一个JSP页面,直接页面跳转(get携带数据)的话不太安全,于是想到到后台转发一下. 第一种:直接以表单提交方式的进行 JS代码: var form ...

  7. C中參数个数可变的函数

    一.什么是可变參数 我们在C语言编程中有时会遇到一些參数个数可变的函数,比如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一 ...

  8. oracle动态注冊參数local_listener

    local_listener參数有两种书写格式,提供了不同的功能. 监听文件上,1521和1526port上都有动态监听port. [oracle@dbsv admin]$ cat listener. ...

  9. Oracle 表的创建 及相关參数

    1. 创建表完整语法 CREATE TABLE [schema.]table (column datatype [, column datatype] - ) [TABLESPACE tablespa ...

随机推荐

  1. django uWSGI nginx搭建一个web服务器 确定可用

    网上的找了很多篇 不知道为什么不行,于是自己搭建了一个可用的Web 大家可按步骤尝试 总结下基于uwsgi+Nginx下django项目生产环境的部署 准备条件: .确保有一个能够用runserver ...

  2. POJ 3662 二分+Dijkstra

    题意: 思路: 二分+Disjktra 二分一个值 如果某条边的边权比它小,则连上边权为0的边,否则连上边权为1的边 最后的d[n]就是最小要免费连接多少电话线. //By SiriusRen #in ...

  3. 一些 <link> 标记分享

    <link rel="alternate" media="handheld" href="#" /> <link rel= ...

  4. 1570. [POJ3461]乌力波

    ★☆   输入文件:oulipo.in   输出文件:oulipo.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 法国作家乔治·佩雷克(Georges Perec,1 ...

  5. 003.ES2015和ES2016新特性--类.md

    JavaScript使用的是基于原型的OO模型,用对象字面量或者函数来实例化对象,用原型链来实现继承. 这样对于数据传统C++.Java的OO范式的开发者来说,会感到比较困惑,于是从ES2015开始逐 ...

  6. 高德地图和canvas画图结合应用(二)

    上节讲述了如在在高德地图中添加canvas图层,这节就讲述下如何在canvas图层添加鼠标的事件. 在上节脚本的最后加入以下代码: var text; $('#container').on('clic ...

  7. PostgreSQL Replication之第四章 设置异步复制(1)

    执行完您的第一个即时恢复(PITR,Point-In-Time-Recovery),我们准备在一个真正的复制设置上工作.在本章,您将学会如何设置异步复制和流.我们的目标是确保您可以实现更高的高可用和更 ...

  8. UI Framework-1: Aura Views

    Views Views is a user interface framework built on a type called, confusingly, View. Responsible for ...

  9. 错排公式 全排列函数 next_permitation(a,a+n)

    不容易系列之一 错排:3件东西分别装进3个不同的特定的袋子,如果刚好一个都没有装对,就叫做错排! 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了! 做好“一件”事情尚且不易,若想永远 ...

  10. [BeiJing2009 WinterCamp]取石子游戏 Nim SG 函数

    Code: #include<cstdio> #include<algorithm> #include<cstring> using namespace std; ...