版权声明:此博客仅用于学习,讨论,欢迎转载(请注明出处!) 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