天天看点

动态SQL

1.使用动态SQL包来创建表:

declare

    v_cur binary_integer;

    v_sql varchar2(200);

begin

    --为执行动态sql语句打开一个游标

    v_cur:=dbms_sql.open_cursor;

    v_sql:='create table mytest_zhanghb(id number(5) primary key,name varchar2(10))';

    --解析动态sql语句:

    --参数1:打开游标

    --参数2:执行的sql语句

    --参数3:oracle数据库类型版本,native表示使用本地数据库的版本

    dbms_sql.parse(v_cur,v_sql,dbms_sql.native);

    --关闭游标

    dbms_sql.close_cursor(v_cur);

end;

/

注意:在匿名语句块中调用procedure,如果此过程中使用了DDL语句,那么该用户必须直接赋予权限.

oracle用户的权限:

create user jd0712 identified by jd0712.

grant connect,resource to jd0712;

grant create table to jd0712;

2.使用动态SQL包来查询数据库的记录

create or replace procedure pro_select_zhanghb(v_table varchar2,v_num number)

is

    v_result binary_integer;

    v_id    number(5);

    v_name    varchar2(10);

    v_sql    varchar2(200);

    --打开游标

    v_sql:='select id,name from '||v_table||' where rownum<'||v_num;

    --解析动态sql

    --指定取出数据的类型和约束

    --指定取出数据的类型,必须用变量表示(注意:字符串类型要指定约束)

    dbms_sql.define_column(v_cur,1,v_id);

    dbms_sql.define_column(v_cur,2,v_name,10);

    --执行sql

    v_result:=dbms_sql.execute(v_cur);

    --获取数据

    while dbms_sql.fetch_rows(v_cur)>0 loop

        --定义变量存放取出的数据

        dbms_sql.column_value(v_cur,1,v_id);

        dbms_sql.column_value(v_cur,2,v_name);

        dbms_output.put_line('id:'||v_id||' name:'||v_name);

    end loop;

    --关闭游标

    dbms_sql.close_cursor(v_cur);

    pro_select_zhanghb('tbl_zhanghb',5);

3.使用动态SQL包插入数据

create or replace procedure pro_insert_zhanghb(v_talbe varchar2,v_id number,v_name varchar2)

    v_cur    binary_integer;

    v_result    binary_integer;

    v_sql    varchar2(200);

    --打开游标

    v_cur:=dbms_sql.open_cursor;

    v_sql:='insert into '||v_talbe||' values(:id,:name)';

    --解析动态sql语句

    dbms_sql.parse(v_cur,v_sql,dbms_sql.native);

    --绑定变量

    dbms_sql.bind_variable(v_cur,':id',v_id);

    dbms_sql.bind_variable(v_cur,':name',v_name);

    --执行动态sql

    v_result:=dbms_sql.execute(v_cur);

    commit;

    pro_insert_zhanghb('tbl_zhanghb',589,'seaside');

4.定时调用

--定时调用,一共四个参数,1,脚本号,2、操作(varchar)3、系统时间(date),4、每隔x时间执行一次(varchar)

create table job(s_date date);

    code number;

        DBMS_JOB.SUBMIT(code,'insert into job values(sysdate);',SYSDATE,'SYSDATE+1/(24*60)');

--查询脚本号,在数据字典中查询

USER_JOBS;

select JOB,what from USER_JOBS;

--删除脚本

DBMS_JOB.REMOVE(21);

上一篇: 动态SQL