• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    批处理 动态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绑定,以此类推
    您可能感兴趣的文章:
    • 基于Oracle的高性能动态SQL程序开发
    • 为什么ASP中执行动态SQL总报错误信息?提示语句语法错误
    • 动态SQL语句使用心得
    • sqlserver 支持定位当前页,自定义排序的分页SQL(拒绝动态SQL)
    • 编程经验点滴 动态SQL的拼接技巧
    • oracle中动态SQL使用详细介绍
    • mysql存储过程 在动态SQL内获取返回值的方法详解
    • MySQL 存储过程中执行动态SQL语句的方法
    • mybatis的动态sql详解(精)
    上一篇:SQL 合并多行记录的方法总汇
    下一篇:SQL Server 2008的逻辑查询处理步骤
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    批处理 动态sql 批处理,动态,sql,批处理,