`
wushuangyan26
  • 浏览: 26387 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

动态SQL之EXECUTE IMMEDIATE

阅读更多

1          EXECUTE IMMEDIATE

        oracleDBMS_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

   
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       不绑定输入变量

 
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       绑定输入变量

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       返回单行值

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      使用记录表获取

 

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      使用多个嵌套表获取
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 获取返回值

 
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绑定函数输出变量

 

 
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        动态调用过程

 

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;

 

 

0
0
分享到:
评论

相关推荐

    oracle动态sql之EXECUTE IMMEDIATE.docx

    Oracle 动态 SQL 之 EXECUTE IMMEDIATE Oracle 动态 SQL 中的 EXECUTE IMMEDIATE 语句是数据库中执行动态 SQL 语句或非运行时创建的 PL/SQL 块的重要工具。与 DBMS_SQL package 相比,EXECUTE IMMEDIATE 使用较...

    Gbase8s动态sql的介绍

    在 Gbase8s 中,可以使用 execute immediate 语句来执行动态 SQL,execute immediate 需要在存储过程中使用。 例如,创建一个存储过程,可以用来创建表。以下是一个示例代码: create or replace procedure create...

    Oracle中EXECUTE IMMEDIATE用法

    在Oracle数据库中,`EXECUTE IMMEDIATE`是一个非常强大的特性,允许在运行时动态执行SQL语句或PL/SQL块。这一功能自Oracle 8i版本的DBMS_SQL包引入以来,极大地增强了PL/SQL的灵活性和动态性。通过`EXECUTE ...

    execute immediate 用法研究

    Execute Immediate 是 Oracle 中的一个功能强大且灵活的语句,它可以解析并马上执行动态的 SQL 语句或非运行时创建的 PL/SQL 块。 Execute Immediate 的目标是减小企业费用并获得较高的性能,较之以前它相当易于编码...

    EXECUTE IMMEDIATE用法小结

    动态创建和执行SQL语句性能超前,EXECUTE IMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用EXECUTE IMMEDIATE,因为它获的收益在包之上。 — 使用技巧 ...

    用execute immediate 执行备份恢复SQLSVR数据库

    "execute immediate" 是Oracle数据库中的动态SQL执行语句,但在这里我们讨论的是SQL Server,它使用不同的命令来实现类似的功能。不过,我们可以理解这个描述是在尝试通过编程方式自动化SQL Server的备份恢复过程。...

    在Oracle中执行动态SQL

    "Oracle中执行动态SQL" Oracle中执行动态SQL是指在Oracle数据库中执行的动态生成的SQL语句。动态SQL是一种灵活的SQL语句,它...动态游标可以实现灵活的SQL语句生成,而EXECUTE IMMEDIATE可以提供高性能的动态SQL执行。

    静态、动态sql及各种游标

    动态SQL则是指利用EXECUTE IMMEDIATE语句执行的SQL语句,这种方式可以在运行时动态生成SQL语句的内容。 一、静态SQL 静态SQL是指在PL/SQL中直接运行的SQL语句,例如SELECT、INSERT、UPDATE、DELETE等语句。这种...

    Oracle动态SQL之本地动态SQL的使用.pdf

    使用EXECUTE IMMEDIATE语句执行动态SQL非常简单,只需将要执行的动态SQL语句作为字符串赋值给一个变量,然后将该变量作为EXECUTE IMMEDIATE命令的参数即可执行。在处理动态SQL时,如果有需要绑定参数,则可以在...

    本地动态SQL的开发

    `EXECUTE IMMEDIATE`语句是处理动态SQL的主要手段之一。它允许开发者执行动态构建的SQL语句或匿名PL/SQL块。该语句的基本语法如下: ```sql EXECUTE IMMEDIATE dynamic_string [INTO {define_variable[, define_...

    oracle 动态SQL

    - EXECUTE IMMEDIATE是Oracle中执行动态SQL的主要方式,它可以用来执行DML(数据操纵语言)和DDL(数据定义语言)语句。 - 使用EXECUTE IMMEDIATE时,需要注意事务管理,因为DML操作不会自动提交,需要显式调用...

    动态SQL四种类型的语句格式

    1. **动态SQL Format 1: EXECUTE IMMEDIATE** 这是最简单的动态SQL形式,直接在一行中执行SQL语句。例如,`EXECUTE IMMEDIATE`后跟一个字符串变量或直接的SQL语句。在示例中,字符串变量`MysqlMysql`包含了创建...

    PB动态SQL语句

    这种格式使用 EXECUTE IMMEDIATE 语句,可以执行没有输入参数并且没有返回结果集的 SQL 语句。例如,创建一张数据库表、插入一条记录等。 EXECUTE IMMEDIATE ‘CREATE TABLE base(code char(6),name char(30))’ ...

    Oracle中动态SQL详解

    EXECUTE IMMEDIATE '动态SQL语句' USING [绑定变量] RETURNING INTO [输出变量]; ``` - **DDL语句**:可以用来执行DDL语句,如创建表等。 - **DML语句**:支持动态执行各种DML语句,如插入、更新、删除等。 - **...

    Oracle动态执行SQL四种方式的例子

    **EXECUTE IMMEDIATE**是另一种动态执行SQL语句的方式,它可以直接在PL/SQL块中执行任何有效的SQL语句。 #### 示例3:执行DDL语句 ```sql execute immediate 'DROP TABLE tab_temp'; ``` 这条语句直接在PL/SQL...

    PB动态SQL语句[文].pdf

    语法为EXECUTE IMMEDIATE SQLStatement{USING TransactionObject};其中SQLStatement是要执行的SQL语句,可以直接用引号将要执行的SQL引起来用,或者用字符串变量的形式提供SQL语句。TransactionObject是用户所使用...

    oracle关于动态SQL的使用

    本地动态SQL是通过`EXECUTE IMMEDIATE`语句来实现的。这个语句允许你在运行时构建SQL字符串并立即执行。例如,文章中展示了如何使用`EXECUTE IMMEDIATE`创建一个动态的DDL语句来创建表。在提供的示例中,`PROC_TEST`...

    oracle执行动态sql

    在 Oracle 中,`EXECUTE IMMEDIATE` 是一种常用的执行动态 SQL 的方式。下面通过几个示例来具体说明: 1. **执行 DML 语句** ```plsql DECLARE n_deptno NUMBER := 20; BEGIN EXECUTE IMMEDIATE 'SELECT ...

Global site tag (gtag.js) - Google Analytics