批处理 动态sql -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【meiwen.anslib.com - 电脑资料】

    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绑定,以此类推

   

您可能感兴趣的文章:

mysql存储过程 在动态SQL内获取返回值的方法详解

oracle中动态SQL使用详细介绍

编程经验点滴 动态SQL的拼接技巧

动态SQL中返回数值的实现代码

动态SQL语句使用心得

基于Oracle的高性能动态SQL程序开发

oracle索引介绍(图文详解)

oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)

oracle数据库中查看系统存储过程的方法

Oracle实现动态SQL的拼装要领

    QQ空间 搜狐微博 人人网 开心网 百度搜藏更多

    Tags:批处理 sql

    复制链接收藏本文打印本文关闭本文返回首页

    上一篇:SQL 合并多行记录的方法总汇

    下一篇:针对Sqlserver大数据量插入速度慢或丢失数据的解决方法

   

相关文章

2011-12-12解决SQL Server的“此数据库没有有效所有者”问题

2012-06-06SQLServer中用T—SQL命令查询一个数据库中有哪些表的sql语句

2011-05-05MSSQL存储过程学习笔记一 关于存储过程

2012-11-11SQL 中having 和where的区别分析

2010-11-11Sql function 多行中的列合并为一行一列的方法

2013-04-04关于SQL 存储过程入门基础(流程控制)

2009-10-10MSSQL ISQL命令详解

2013-03-03sql 截取域名的问题

2012-07-07Sqlserver 2000/2005/2008 的收缩日志方法和清理日志方法

2009-05-05sql server中的decimal或者numeric的精度问题

   

文章评论

   

最 近 更 新

   

SQL Server 置疑、可疑、正在恢复等情况分

SQL Server 2008 到底需要使用哪些端口?

sqlserver实现oracle的sequence方法

直接循环写入数据

使用BULK INSERT大批量导入数据 SQLSERVE

使SQL用户只能看到自己拥有权限的库(图文

列出SQL Server中具有默认值的所有字段的

sqlserver 游标的简单示例

清除SQL SERVER错误日志出现操作系统错误

SqlServer 执行计划及Sql查询优化初探

   

热 点 排 行

   

SQL Server 2008图文安装教程

SQL Server 2012 安装图解教程(附

sqlserver中distinct的用法(不重

SQL Server导入、导出、备份数据

SQL语句去掉重复记录,获取重复记

SQL Server数据库入门学习总结

SQL Server错误代码大全及解释(

sql convert函数使用小结

sql 时间函数 整理的比较全了

用SQL语句添加删除修改字段、一些

最新文章