execute immediate 及 dbms_sql 用法详解

版权声明:此博客仅用于学习,讨论,欢迎转载(请注明出处!) https://blog.csdn.net/qq_34745941/article/details/81556689

1、使用场景

oracle 中 DBMS_SQL package包 和 EXECUTE IMMEDIATE 都可以用来解析并执行/动态SQL语句或非运行时创建的PL/SQL块,相比较而言,EXECUTE IMMEDIATE使用较简单,能够满足较常用的需要。

1.1 基础数据

CREATE TABLE stu(
  ID   NUMBER(10),
  xm VARCHAR2(10)
);
INSERT INTO student(SID, SNAME) VALUES(1, '小游子');

2、execute immediate 详解

2.1 静态 sql 三种用法

DECLARE
        v_sql VARCHAR2(2000);
        v_xm  system.stu.xm%TYPE;
        v_num NUMBER;        
  BEGIN 
        -- 用法1 : 立即执行 SQL 语句。
        v_sql := 'create or replace view view_stu as select id,xm from stu';
        execute IMMEDIATE v_sql ;

        -- 用法2 :立即执行 SQL 语句,并赋值给某个变量
        v_sql := 'select count(1) from stu';
        EXECUTE IMMEDIATE v_sql INTO v_num;
        dbms_output.put_line('总记录条数:'|| v_num);

        -- 用法3 : 立即执行 带参数的 SQL 语句

        v_sql := 'select * from stu where id = :1 and xm = :2'; 
        EXECUTE IMMEDIATE v_sql 
          USING 1, '小游子';

        -- 特殊* : 即使语句有误,也不会弹框提示(强制报错),不过会有错误信息
        v_sql := 'select * from the world'; 
        EXECUTE IMMEDIATE v_sql ; -- sqlerrm : 表或视图不存在

EXCEPTION WHEN OTHERS THEN 
          dbms_output.put_line(SQLERRM);
    END;  

2.2 动态 dml - 需显式commit

注意 ’ ’ ’ 字符内的字符表现形式 ’ ’ ’ (而不是快捷键输出的 “)

DECLARE
        v_sql     VARCHAR2(1000);
        v_table   VARCHAR2(30) := 'stu';     
  BEGIN 
        v_sql := 'insert into '||v_table||' (id, xm) values( :1, :2)' ; -- 此时,字符串内的 sql 结尾不需要 ';'
        EXECUTE IMMEDIATE v_sql
          USING 2, '小倩子';
        COMMIT; --需显式提交, 否则视为不提交
        dbms_output.put_line('执行完成!');  

EXCEPTION WHEN OTHERS THEN 
          dbms_output.put_line(SQLERRM);
    END;

3、dbms_sql

1、DBMS_SQL包提供一个接口,用于执行 动态SQL(包括DDL 和DML)
2、DBMS_SQL定义了一个实体叫 游标ID,游标ID是一个PL/SQL整型数,通过游标ID,可以对游标进行操作

参考:https://www.cnblogs.com/zjfjava/p/7979633.html

3.1 DBMS_SQL.NATIVE

常量,用于解析 sql 时,所对应的版本,自动检索版本时,DBMS_SQL.NATIVE = 1

猜你喜欢

转载自blog.csdn.net/qq_34745941/article/details/81556689