mysql执行动态批处理_批处理 动态sql

批处理 动态sql

更新时间:2009年06月25日 16:12:41   作者:

批处理 动态sql

1.

DECLARE

TYPE ref_cursor_type IS ref CURSOR;

v_mycursor ref_cursor_type;

TYPE id_list IS TABLE OF integer;

TYPE name_list IS TABLE OF varchar2(30);

v_tabid id_list:=id_list();

v_tabname name_list:=name_list();

sql_str varchar2(200);

BEGIN

--查询所以行,放在集合里

sql_str:='select empno,ename from emp';

sql_str:=sql_str||' order by empno desc';

execute immediate sql_str BULK COLLECT INTO v_tabid,v_tabname;

FOR c IN v_tabid.first..v_tabid.last LOOP

dbms_output.put_line('empno为'||v_tabid(c)||' 记录的NAME为'||v_tabname(c));

END LOOP;

dbms_output.put_line('---------------------------------');

--更新(返回更新后的值)

sql_str:='update emp set empno=1+empno,ename=''a'' where rownum=1 RETURNING empno,ename into :1,:2 ';

execute immediate sql_str RETURNING BULK COLLECT INTO v_tabid, v_tabname;

FOR c IN v_tabid.first..v_tabid.last LOOP

dbms_output.put_line('empno为'||v_tabid(c)||' 记录的NAME为'||v_tabname(c));

END LOOP;

dbms_output.put_line('---------------------------------');

--删除(返回被删除的行)

sql_str:='delete from emp where rownum<=2 RETURNING empno,ename into :1,:2 ';

execute immediate sql_str RETURNING BULK COLLECT INTO v_tabid, v_tabname;

FOR c IN v_tabid.first..v_tabid.last LOOP

dbms_output.put_line('empno为'||v_tabid(c)||' 记录的NAME为'||v_tabname(c));

END LOOP;

dbms_output.put_line('---------------------------------');

--插入(返回插入的行)

sql_str:='insert into emp(empno,ename) values(1,''abc'') RETURNING empno,ename into :1,:2 ';

execute immediate sql_str RETURNING BULK COLLECT INTO v_tabid, v_tabname;

FOR c IN v_tabid.first..v_tabid.last LOOP

dbms_output.put_line('empno为'||v_tabid(c)||' 记录的NAME为'||v_tabname(c));

END LOOP;

dbms_output.put_line('---------------------------------');

/* 批fetch

语法:

fetch dynamic_cursor

bulk collect into define_variable[,define_variable...]

*/

sql_str:='select empno,ename from emp';

sql_str:=sql_str||' order by empno desc';

OPEN v_mycursor FOR sql_str;

--取

FETCH v_mycursor BULK COLLECT INTO v_tabid,v_tabname;

--关

CLOSE v_mycursor;

--输

FOR c IN v_tabid.first..v_tabid.last LOOP

dbms_output.put_line('empno为'||v_tabid(c)||' 记录的NAME为'||v_tabname(c));

END LOOP;

dbms_output.put_line('---------------------------------');

END;

2.-------

forall

DECLARE

/*批forall

语法:动态字符串必须为insert/update/delete,不能为select

forall index in lower..upper

execute immediate dynamic_string

using bind |bind(index)[,bind |bind(index)...]

[{returning|return} bulk collect into bind_argument[,bind_argument...]];

*/

TYPE sal_list IS TABLE OF number(8,2);

TYPE name_list IS TABLE OF varchar2(30);

TYPE dept_list IS VARRAY(15) OF integer;

v_depts dept_list:=dept_list(10,20,30,40,50,60,70,80);

v_tabsal sal_list:=sal_list();

v_tabname name_list:=name_list();

sql_str varchar2(200);

BEGIN

sql_str:='update emp set sal=sal*:arg1 where DEPTNO=:arg2';

sql_str:=sql_str||' returning ename,sal into :arg3,:arg4';

--给前面4个部门加薪10%,并返回结果到集合.

FORALL j IN 1..4

execute immediate sql_str

using 1.10,v_depts(j)

RETURNING BULK COLLECT INTO v_tabname,v_tabsal;

--显示结果

FOR j IN v_tabname.first..v_tabname.last LOOP

dbms_output.put_line('雇员'||v_tabname(j)

||' 的薪水被提到'||v_tabsal(j));

END LOOP;

dbms_output.put_line('---------------------------------');

--给后面4个部门加薪20%,并返回结果到集合.

FORALL j IN 5..8

execute immediate sql_str

using 1.20,v_depts(j)

RETURNING BULK COLLECT INTO v_tabname,v_tabsal;

--显示结果(用notfound判断是否有结果集)

IF SQL%NOTFOUND THEN

dbms_output.put_line('无数据更新');

ELSE

FOR j IN v_tabname.first..v_tabname.last LOOP

dbms_output.put_line('雇员'||v_tabname(j)

||' 的薪水被提到'||v_tabsal(j));

END LOOP;

END IF;

END;

3.用一个值绑定绑定名称相同的值.

把sql语句用begin end括起来就能实现

如:

execute immediate 'begin calc_stats(:x,:x,:y,:x,:y); end;' using a,b;

将A与X绑定,当第二次出来不同名称时,与B绑定,以此类推

相关文章

1a1b05c64693fbf380aa1344a7812747.png

本周技术研究部(TRD)的一名DBA 对我们编写SQL时的一些问题,进行了汇报讲演,以下是来自它的脚本,我在它讲演的基础上写出了自己想表述的,以便于大家相互交流学习2012-08-08

4f55910a645b073bc4fc65dc10dc14bd.png

SQL Server在安装到服务器上后,由于出于服务器安全的需要,所以需要屏蔽掉所有不使用的端口,只开放必须使用的端口。2012-10-10

0ea3c7666119d5615e582f823fb3fad6.png

把数据批量插入具有Identity列的表的方法。2009-08-08

4f96a78db829b1556ff16de21e013c7a.png

这篇文章主要介绍了MySQL 数据库 source 命令详解及实例的相关资料,需要的朋友可以参考下2017-06-06

8cc1031babc6aff2319f1c6af8544aa0.png

这篇文章主要介绍了SQL Server中的RAND函数的介绍和区间随机数值函数的实现 的相关资料,需要的朋友可以参考下2015-12-12

0c932a99bb7b6f23c937db507070cc7b.png

这里主要有两个:1.Windows事件日志2.SQLSERVER ErrorLog记下来将详细介绍下它们的作用及使用方法,感兴趣的朋友可以了解下,或许本的知识点对你有所帮助2013-02-02

cca732bf65a93ed2ec0ac80c638460fe.png

这篇文章主要介绍了sql server通过pivot对数据进行行列转换的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-05-05

2d9f31f2af7b675a3d153d2b7f1035a7.png

JDBC技术事实上是一种能通过JAVA语言访问任何结构化数据库的应用程序接口(API)(Sun这样说的,我也不知道是不是真的),而且现在的JDBC 3.0据Sun说也能访问Execel等电子表格程序!2009-06-06

b452cee8ec5cd9e58ab98eba17281e59.png

在一些统计报表中,常常会用到将行结果用列形式展现。我们这里用一个常见的学生各门课程的成绩报表,来实际展示实现方法。2008-11-11

f4838ec7e2d4da28e0b57d4e852dadd4.png

这篇文章主要介绍了Mybatis4 之Mybatis动态sql的实现代码,本文给大家提到了静态sql与动态sql有什么区别,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-03-03

最新评论

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值