• dbms_sql包的用法


    http://blog.itpub.net/20948385/viewspace-691398

    对于一般的select操作,如果使用动态的sql语句则需要进行以下几个步骤: 
    open   cursor---> parse---> define   column---> excute---> fetch   rows---> close   cursor; 
    而对于dml操作(insert,update)则需要进行以下几个步骤: 
    open   cursor---> parse---> bind   variable---> execute---> close   cursor; 
    对于delete操作只需要进行以下几个步骤: 
    open   cursor---> parse---> execute---> close   cursor;

    例一:
    create table test(n_id   number,  v_name  varchar2(50), d_insert_date date);
    alter table test add constraint pk_id  primary key(n_id);

    declare
       v_cursor   number;
       v_sql      varchar2(200);
       v_id       number;
       v_name     varchar2(50);
       v_date     date;
       v_stat     number;
    begin
       
       v_id := 1;
       v_name := '测试 insert';
       v_date := sysdate;
       v_cursor := dbms_sql.open_cursor;  --打开游标
       v_sql := 'insert into test(n_id, v_name, d_insert_date) values(:v_id,:v_name,:v_date)';
       dbms_sql.parse(v_cursor, v_sql, dbms_sql.native);  --解析SQL
       dbms_sql.bind_variable(v_cursor, ':v_id', v_id);   --绑定变量
       dbms_sql.bind_variable(v_cursor, ':v_name', v_name);
       dbms_sql.bind_variable(v_cursor, ':v_date', v_date);
       
       v_stat := dbms_sql.execute(v_cursor);  --执行
       dbms_sql.close_cursor(v_cursor);   --关闭游标
       commit;
    end;

    例二:

    declare
       v_cursor   number;
       v_sql      varchar2(200);
       v_id       number;
       v_name     varchar2(50);
       v_stat     number;
    begin
        v_name := '测试 update';
        v_id := 1;
        v_cursor := dbms_sql.open_cursor;
        v_sql := 'update test set v_name = :v_name, d_insert_date = :v_date where n_id = :v_id';
        dbms_sql.parse(v_cursor, v_sql, dbms_sql.native);
        dbms_sql.bind_variable(v_cursor, ':v_name', v_name);
        dbms_sql.bind_variable(v_cursor, ':v_date', sysdate);
        dbms_sql.bind_variable(v_cursor, ':v_id', v_id);
        v_stat := dbms_sql.execute(v_cursor);
        dbms_sql.close_cursor(v_cursor);
        commit;
    end;

    例三:

    declare
        v_cursor   number;
        v_sql      varchar2(200);
        v_id       number;
        v_stat     number;
    begin

       v_id := 1;
       v_sql := 'delete from test where n_id = :v_id';
       v_cursor := dbms_sql.open_cursor;
       dbms_sql.parse(v_cursor, v_sql, dbms_sql.native);
       dbms_sql.bind_variable(v_cursor, ':v_id', v_id);
       v_stat := dbms_sql.execute(v_cursor);
       dbms_sql.close_cursor(v_cursor);
       commit;
    end;

    例四:

    declare
       v_cursor    number;
       v_sql       varchar2(200);
       v_id        number;
       v_name      varchar2(50);
       v_date      varchar2(10);
       v_stat      number;
    begin

        v_sql := 'select n_id, v_name, to_char(d_insert_date, ''yyyy-mm-dd'') from test';
        v_cursor := dbms_sql.open_cursor;              --打开游标
        dbms_sql.parse(v_cursor, v_sql, dbms_sql.native);  --解析游标
        dbms_sql.define_column(v_cursor, 1, v_id);         --定义列
        dbms_sql.define_column(v_cursor, 2, v_name, 50);   --注意:当变量为varchar2类型时,要加长度
        dbms_sql.define_column(v_cursor, 3, v_date, 10);
        v_stat := dbms_sql.execute(v_cursor);        --执行SQL
        loop
            exit when dbms_sql.fetch_rows(v_cursor) <= 0;  --fetch_rows在结果集中移动游标,如果未抵达末尾,返回1。
            dbms_sql.column_value(v_cursor, 1, v_id);   --将当前行的查询结果写入上面定义的列中。
            dbms_sql.column_value(v_cursor, 2, v_name);
            dbms_sql.column_value(v_cursor, 3, v_date);
            dbms_output.put_line(v_id || ':' || v_name || ':' || v_date);
        end loop;
    end;

     

     

     

     

    http://blog.tianya.cn/blogger/post_read.asp?BlogID=3351679&PostID=39449188

    表名为变量,利用dbms_sql及游标返回多条记录(调用时候传入表名,无法在sql中动态修改标明)

    这几天一直在利用PL/SQL Developer写一个存储过程,因为是新手,写了好几天,功能就是根据传入进来的参数(表名和某一特定值查询记录),并将记录插入另一个表中。由于表名是变量,所以使用dbms_sql动态包来解析sql语句,游标也不采用静态游标。
      1.创建存储过程 
      create or replace procedure proGetLayerInfoFtable(in_layerName in varchar2,
       in_objName in varchar2) is
       --in_layerName :输入的图层名
       --in_objName:输入的具体地理物体名
       str_sql varchar2(500); --查询字符串
       v_cursor number; --游标
       rowprocess number;
       column_Name varchar2(100); --临时变量,存储地理对象名
       column_Minx float; --临时变量,存储从表中获取的EMINX值
       column_Miny float; --临时变量,存储从表中获取的EMINY值
      2.begin
       v_cursor := dbms_sql.open_cursor; --打开游标
       str_sql := 'select 名称,t.SHAPE.MINX,t.SHAPE.MINY from ' || tableBName ||
       ' t where t.名称=''' || in_objname || '''';
       dbms_sql.parse(v_cursor, str_sql, dbms_sql.native);分析游标
      
       --动态定义列,并将游标的值赋给对应列
       dbms_sql.define_column(v_cursor, 1, column_Name, 40);
       dbms_sql.define_column(v_cursor, 2, column_Minx);
       dbms_sql.define_column(v_cursor, 3, column_Miny);
       loop
       if dbms_sql.fetch_rows(v_cursor) > 0 then
       dbms_sql.column_value(v_cursor, 1, column_Name);
       dbms_sql.column_value(v_cursor, 2, column_minx);
       dbms_sql.column_value(v_cursor, 3, column_Miny);
       else
       exit;
       end if;
       end loop;
       dbms_sql.close_cursor(v_cursor);
      end proGetLayerInfo;

  • 相关阅读:
    jquery模拟刮刮乐
    jq默认选中每项第一个
    让一个div水平且垂直居中
    ES6模块的import和export用法总结
    linux 标准目录
    spring 注解配置
    多线程下的两种单例写法
    java版二叉树算法实现
    JAVA版A星算法实现
    对于宫格地图寻最短路径的一个广度搜索算法
  • 原文地址:https://www.cnblogs.com/bnuvincent/p/3532276.html
Copyright © 2020-2023  润新知