• dbms_sql包的用法


    对于一般的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;

     
     
  • 相关阅读:
    CPU上下文的切换
    linux 零拷贝
    整型的长度
    What is the Memory Model in C++11
    leetcode刷题笔记九十二题 反转链表II
    leetcode刷题笔记九十一题 解码方法
    leetcode刷题笔记九十题 子集II
    leetcode刷题笔记八十九题 格雷编码
    leetcode刷题笔记八十八题 合并两个有序数组
    leetcode刷题笔记八十七题 扰乱字符串
  • 原文地址:https://www.cnblogs.com/likeju/p/5010502.html
Copyright © 2020-2023  润新知