1          EXECUTE IMMEDIATE

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

1.1         语法

EXECUTE IMMEDIATE v_sql  [BULK COLLECT INTO 或INTO 返回值变量] [INTO 入参 1,.., out 出参1,..]。

说明:

1、v_sql为varchar2类型或clob(11g才支持),可以为DDL、DML等动态拼接的sql字符串。用在pl/sql代码中时,如果是varchar2类型,则长度不能大于32767(32K)。

2、v_sql为DML动态语句时,执行后不会提交,需要使用commit显式提交。如果为DDL命令,执行后则会提交所有之前改变的。

3、如果需要从动态sql返回值,则可以定义返回值变量,BULK COLLECT INTO返回多行值,此时定义的变量需是数组变量的列表或记录表类型;INTO返回单行,此时定义的变量可以使多个pl/sql变量的列表或记录类型。

4、如果动态sql中需要绑定变量,则使用USING,通常绑定的变量为输入入参,此时变量的in可以省略;如果需要绑定输出变量(如调用过程时可能需要输出),则在变量前用out显示指明。

1.2         实例说明

1.2.1 动态DDL

Sql代码

DECLARE

v_sql   VARCHAR2(1000);

v_table VARCHAR2(30) := 'test_ynamic_sql';

BEGIN

v_sql := ' create table ' || v_table ||

' (id varchar2(10),name varchar2(100))';

EXECUTE IMMEDIATE v_sql;

END;

1.2.2        动态DML insert

1.2.2.1       不绑定输入变量

Sql代码

DECLARE

v_sql   VARCHAR2(1000);

v_table VARCHAR2(30) := 'test_ynamic_sql';

BEGIN

--1、不绑定输入变量

v_sql := ' insert into ' || v_table ||

' values (''1'',''no_binding_in_variable'')';

EXECUTE IMMEDIATE v_sql;

COMMIT; --dml需要显示提交

END;

1.2.2.2       绑定输入变量

Sql代码

DECLARE

v_sql   VARCHAR2(1000);

v_table VARCHAR2(30) := 'test_ynamic_sql';

BEGIN

--1、绑定输入变量

v_sql := ' insert into ' || v_table || ' values (:1,:2)';

EXECUTE IMMEDIATE v_sql

USING '2', 'binding_in_variable'; --使用using绑定输入变量

END;

1.2.3        动态DML select

1.2.3.1       返回单行值

Sql代码

DECLARE

v_sql   VARCHAR2(1000);

v_table VARCHAR2(30) := 'test_ynamic_sql';

--1、使用简单pl/sql变量v_id,v_name获得单行输出

v_id   VARCHAR2(10);

v_name VARCHAR2(100);

--2、使用基于test_ynamic_sql表的记录变量获得单行输出

TYPE test_ynamic_sql_record IS RECORD(

v_id   test_ynamic_sql.ID%TYPE,

v_name test_ynamic_sql.NAME%TYPE);

test_ynamic_sql_row test_ynamic_sql_record;

BEGIN

--1、使用简单pl/sql变量v_id,v_name获得单行输出

v_sql := ' select id,name from ' || v_table || ' where id=:1 ';

EXECUTE IMMEDIATE v_sql

INTO v_id, v_name

USING '1';

DBMS_OUTPUT.put_line('id=' || v_id || ',name=' || v_name);

--2、使用基于test_ynamic_sql表的记录变量获得单行输出

EXECUTE IMMEDIATE v_sql

INTO test_ynamic_sql_row

USING '1';

DBMS_OUTPUT.put_line('id=' || test_ynamic_sql_row.v_id || ',name=' ||

test_ynamic_sql_row.v_name);

END;

1.2.3.2       返回多行值

1.2.3.2.1      使用记录表获取

Sql代码

DECLARE

v_sql   VARCHAR2(1000);

v_table VARCHAR2(30) := 'test_ynamic_sql';

--1、使用基于test_ynamic_sql表的记录变量获得多行输出

TYPE test_ynamic_sql_record IS RECORD(

id   test_ynamic_sql.ID%TYPE,

NAME test_ynamic_sql.NAME%TYPE);

TYPE test_ynamic_sql_table_type IS TABLE OF test_ynamic_sql_record INDEX BY BINARY_INTEGER;

/*可以用以下方式定义记录表*/

--TYPE test_ynamic_sql_table_type IS TABLE OF test_ynamic_sql%ROWTYPE INDEX BY BINARY_INTEGER;

test_ynamic_sql_multi_row test_ynamic_sql_table_type;

BEGIN

--1、使用基于test_ynamic_sql表的记录变量获得多行输出

v_sql := ' select id,name from ' || v_table;

EXECUTE IMMEDIATE v_sql BULK COLLECT

INTO test_ynamic_sql_multi_row;

FOR m IN 1 .. test_ynamic_sql_multi_row.COUNT LOOP

DBMS_OUTPUT.put_line('id=' || test_ynamic_sql_multi_row(m)

.id || ',name=' || test_ynamic_sql_multi_row(m).NAME);

END LOOP;

END;

1.2.3.2.2      使用多个嵌套表获取

Sql代码

DECLARE

v_sql   VARCHAR2(1000);

v_table VARCHAR2(30) := 'test_ynamic_sql';

--1、使用基于多个嵌套表获取多行输出

TYPE test_ynamic_sql_id_type IS TABLE OF test_ynamic_sql.ID%TYPE INDEX BY BINARY_INTEGER;

TYPE test_ynamic_sql_name_type IS TABLE OF test_ynamic_sql.NAME%TYPE INDEX BY BINARY_INTEGER;

test_ynamic_sql_multi_row_id   test_ynamic_sql_id_type;

test_ynamic_sql_multi_row_name test_ynamic_sql_name_type;

BEGIN

--1、使用基于多个嵌套表获取多行输出

v_sql := ' select id,name from ' || v_table;

EXECUTE IMMEDIATE v_sql BULK COLLECT

INTO test_ynamic_sql_multi_row_id, test_ynamic_sql_multi_row_name;

FOR m IN 1 .. test_ynamic_sql_multi_row_id.COUNT LOOP

DBMS_OUTPUT.put_line('id=' || test_ynamic_sql_multi_row_id(m) ||

',name=' || test_ynamic_sql_multi_row_name(m));

END LOOP;

END;

1.2.4        动态调用函数

1.2.4.1       使用select 获取返回值

Sql代码

DECLARE

v_sql  VARCHAR2(1000);

v_name VARCHAR2(100);

BEGIN

--1、先创建测试函数

v_sql := ' CREATE OR REPLACE FUNCTION f_test_ynamic_sql(v_id VARCHAR2) RETURN VARCHAR2 IS

v_name VARCHAR2(100);

BEGIN

SELECT NAME INTO v_name FROM test_ynamic_sql WHERE id = v_id;

RETURN v_name;

END ; ';

EXECUTE IMMEDIATE v_sql;

--2、  使用select 获取返回值

v_sql := ' select f_test_ynamic_sql(:1) from dual';

EXECUTE IMMEDIATE v_sql

INTO v_name

USING '1';

DBMS_OUTPUT.put_line(' NAME = ' || v_name);

END;

1.2.4.2       使用begin .. end绑定函数输出变量

Sql代码

DECLARE

v_sql    VARCHAR2(1000);

v_name_o VARCHAR2(100);

BEGIN

--1、先创建测试函数

v_sql := ' CREATE OR REPLACE FUNCTION f_test_ynamic_sql(v_id VARCHAR2,v_name_o out varchar2) RETURN VARCHAR2 IS

v_name VARCHAR2(100);

BEGIN

SELECT NAME INTO v_name FROM test_ynamic_sql WHERE id = v_id;

v_name_o:=v_name;

RETURN v_name;

END ; ';

EXECUTE IMMEDIATE v_sql;

--2、使用begin .. end绑定函数输出变量

v_sql := ' declare v_name varchar2(100);

begin  v_name:=f_test_ynamic_sql(:1,:2); end;';

EXECUTE IMMEDIATE v_sql

USING '1', OUT v_name_o;

DBMS_OUTPUT.put_line('name_o=' || v_name_o); --using中的输出变量需要显示说明

END;

1.2.5        动态调用过程

Sql代码

DECLARE

v_sql    VARCHAR2(1000);

v_name_o VARCHAR2(100);

BEGIN

--1、先创建测试过程

v_sql := ' CREATE OR REPLACE procedure p_test_ynamic_sql(v_id VARCHAR2,v_name_o out varchar2) IS

BEGIN

SELECT NAME INTO v_name_o FROM test_ynamic_sql WHERE id = v_id;

END ; ';

EXECUTE IMMEDIATE v_sql;

--2、使用begin .. end绑定过程输出变量

v_sql := ' begin  p_test_ynamic_sql(:1,:2); end;';

EXECUTE IMMEDIATE v_sql

USING '1', OUT v_name_o; --using中的输出变量需要显示说明

DBMS_OUTPUT.put_line('name_o=' || v_name_o);

END;

mysql execute immediate_动态SQL之EXECUTE IMMEDIATE相关推荐

  1. mysql存储过程之动态sql

     Mysql 5.0 以后,支持了动态sql语句,我们可以通过传递不同的参数得到我们想要的值 这里介绍两种在存储过程中的动态sql: set sql = (预处理的sql语句,可以是用concat拼接 ...

  2. 动态 SQL、EXECUTE IMMEDIATE、using、into、returning

    很多时候我们需要在存储过程中使用动态的SQL,要怎么用好动态SQL呢,怎样执行效率最高呢.下面来介绍一下,如何使用动态SQL操作数据库. 在存储过程中执行一个简单的SQL语句使用下面的方法即可. DE ...

  3. sqlserver 动态sql执行execute和sp_executesql

    sqlserver 动态sql的执行,有两个方法execute和 sp_executesql.其中第一个方法execute可以简写为exec. execute方法适合执行没有返回值的动态sql,sp_ ...

  4. mysql存储过程执行动态sql返回结果,mysql存储过程执行动态sql语句并返回值

    Java代码 set @sql='xxx'; prepare stmt from @sql; execute stmt; deallocate prepare stmt; select @curd1; ...

  5. mysql choose when_mybatis动态sql使用:choose分支选择

    编写根据员工和姓名查询的junit单元测试方法: @Test public void test1() throws Exception { String resource = "mybati ...

  6. mysql 临时表 事务_MySQL学习笔记十:游标/动态SQL/临时表/事务

    逆天十三少 发表于:2020-11-12 08:12 阅读: 90次 这篇教程主要讲解了MySQL学习笔记十:游标/动态SQL/临时表/事务,并附有相关的代码样列,我觉得非常有帮助,现在分享出来大家一 ...

  7. mysql存储过程动态sql

    mysql存储过程中,变量直接拼接在执行sql上会把变量解析成 '变量执行',比如: DECLARE v_condition VARCHAR(4) DEFAULT 'id=1'; select * f ...

  8. oracle 动态声明变量_oracle存储过程动态sql变量赋值

    如何动态执行存储过程或函数 目前在Oracle数据库存储过程研发过程中,遇到需要从某张表中读取存储过程名并进行动态执行的情况,经查找资料,制作成DEMO,并通过测试,现共享下,以备其他同事遇到此种情况 ...

  9. PL/SQL -- 动态SQL

    --==================== -- PL/SQL --> 动态SQL --==================== 使用动态SQL是在编写PL/SQL过程时经常使用的方法之一.很 ...

  10. Oracle入门(十四.18)之使用动态SQL

    一.SQL的执行流程 数据库中的所有SQL语句都经历了不同的阶段: •解析:预执行"这可能吗?"检查包括语法,对象存在,权限等 •绑定:获取语句中引用的任何变量的实际值 •执行:语 ...

最新文章

  1. oracle中的exists 和 not exists 用法详解
  2. cefsharp wpf 中文输入问题解决方法
  3. Android 操作SQLite基本用法
  4. 对抗神经网络,梦,潜意识
  5. 计算机二级考试常用代码,二级计算机VB考试常用代码(看完必过).doc
  6. MacOS中运行第一个PySide6实例
  7. visual studio能统计代码规模吗_描述统计之用——熟悉数据
  8. 数据分析报告应该包含的内容
  9. [Java] 蓝桥杯BASIC-20 基础练习 数的读法
  10. 让apache支持mysql_Apache+PHP+Mysql环境搭建之三:配置Apache支持PHP
  11. JavaSE基础笔记一
  12. 九度题目1341:艾薇儿的演唱会
  13. DUC HDC 笔记
  14. Matlab 棋盘制作
  15. 我的世界服务器无限刷凋零,《我的世界》高效刷凋零骷髅的方法
  16. 苹果 CEO 为什么选中了何同学?
  17. 不要迷恋我,虽然我利用Python来耍植物大战僵尸
  18. 4个顶级CAD制图软件,对照职业入手哦~
  19. 2019写给对象的话_最新写给女朋友的情话短句 一句话形容最好的爱情说说2019
  20. Android SQLite 数据库常用命令

热门文章

  1. 承认你的父母其实不那么爱你
  2. ROS从入门到精通3-5:blender机器人模型定制皮肤贴图
  3. python练习题5:货币转换 I
  4. Qt编写输入法V2019终极版
  5. 测试不同体重体型软件样子的,一种智能体型体重测量仪的设计
  6. app推广渠道数据统计Xintall
  7. Aloha (世界上最早的无线电计算机通信网)
  8. 计算机硬盘清理,怎么清理电脑磁盘释放存储空间
  9. input和output实例
  10. Mysql磁盘碎片整理教程