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

oracle的exec immediate

阅读更多

这段代码同样是执行了1000条insert语句,但是每一条语句都是不同的,因此ORACLE会把每条语句硬解析一次,其效率就比前面那段就低得多了。如果要提高效率,不妨使用绑定变量将循环中的语句改为

      sqlstr:='insert into 测试表 (:i,:i+1,:i*1,:i*2,:i-1) ';

      execute immediate sqlstr using i,i,i,i,i;

这样执行的效率就高得多了。

我曾试着使用绑定变量来代替表名、过程名、字段名等,结果是语句错误,结论就是绑定变量不能当作嵌入的字符串来使用,只能当作语句中的变量来用。

从效率来看,由于oracle10G放弃了RBO,全面引入CBO,因此,在10G中使用绑定变量效率的提升比9i中更为明显。

最后,前面说到绑定变量是在通常情况下能提升效率,那哪些是不通常的情况呢?

答案是:在字段(包括字段集)建有索引,且字段(集)的集的势非常大(也就是有个值在字段中出现的比例特别的大)的情况下,使用绑定变量可能会导致查询计划错误,因而会使查询效率非常低。这种情况最好不要使用绑定变量。

 

 

 

 

 

 

 

EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EXECUTE IMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用EXECUTE IMMEDIATE,因为它获的收益在包之上。

使用技巧

 

1. EXECUTE IMMEDIATE将不会提交一个DML事务执行,应该显式提交
如果通过EXECUTE IMMEDIATE处理DML命令,那么在完成以前需要显式提交或者作为EXECUTE IMMEDIATE自己的一部分. 如果通过EXECUTE IMMEDIATE处理DDL命令,它提交所有以前改变的数据

 

2. 不支持返回多行的查询,这种交互将用临时表来存储记录(参照例子如下)或者用REF cursors.

 

3. 当执行SQL语句时,不要用分号,当执行PL/SQL块时,在其尾部用分号.

 

4. 在Oracle手册中,未详细覆盖这些功能。下面的例子展示了所有用到Execute immediate的可能方面.希望能给你带来方便.

 

5. 对于Forms开发者,当在PL/SQL 8.0.6.3.版本中,Forms 6i不能使用此功能.

 

EXECUTE IMMEDIATE用法例子

 

1. 在PL/SQL运行DDL语句


begin
execute immediate 'set role all';
end;

 

2. 给动态语句传值(USING 子句)


declare
l_depnam varchar2(20) := 'testing';
l_loc    varchar2(10) := 'Dubai';
begin
execute immediate 'insert into dept values (:1, :2, :3)'
    using 50, l_depnam, l_loc;
commit;
end;

 

3. 从动态语句检索值(INTO子句)


declare
l_cnt    varchar2(20);
begin
execute immediate 'select count(1) from emp'
    into l_cnt;
dbms_output.put_line(l_cnt);
end;

 

4. 动态调用例程.例程中用到的绑定变量参数必须指定参数类型.黓认为IN类型,其它类型必须显式指定

 

declare
l_routin   varchar2(100) := 'gen2161.get_rowcnt';
l_tblnam   varchar2(20) := 'emp';
l_cnt      number;
l_status   varchar2(200);
begin
execute immediate 'begin ' || l_routin || '(:2, :3, :4); end;'
    using in l_tblnam, out l_cnt, in out l_status;

if l_status != 'OK' then
     dbms_output.put_line('error');
end if;
end;

 

5. 将返回值传递到PL/SQL记录类型;同样也可用%rowtype变量


declare
type empdtlrec is record (empno number(4),
                           ename varchar2(20),
                           deptno number(2));
empdtl empdtlrec;
begin
execute immediate 'select empno, ename, deptno ' ||
                   'from emp where empno = 7934'
    into empdtl;
end;

 

6. 传递并检索值.INTO子句用在USING子句前

 

declare
l_dept    pls_integer := 20;
l_nam     varchar2(20);
l_loc     varchar2(20);
begin
execute immediate 'select dname, loc from dept where deptno = :1'
    into l_nam, l_loc
    using l_dept ;
end;

 

7. 多行查询选项.对此选项用insert语句填充临时表,用临时表进行进一步的处理,也可以用REF cursors纠正此缺憾.

declare
l_sal   pls_integer := 2000;
begin
execute immediate 'insert into temp(empno, ename) ' ||
                   '          select empno, ename from emp ' ||
                   '          where sal > :1'
    using l_sal;
commit;
end;

 

       对于处理动态语句,EXECUTE IMMEDIATE比以前可能用到的更容易并且更高效.当意图执行动态语句时,适当地处理异常更加重要.应该关注于捕获所有可能的异常.

分享到:
评论

相关推荐

    如何通过Backup Exec实施Oracle的灾难恢复

    本文将详细阐述如何利用Backup Exec来执行Oracle数据库的灾难恢复。首先,理解Oracle灾难恢复的关键在于备份策略,这包括两种主要类型的备份:FULL CLOSED备份和FULL ONLINE备份。 1. FULL CLOSED备份: 这种备份是...

    BackupExec12.5备份Oracle

    ### BackupExec 12.5 备份 Oracle 数据库知识点详解 #### 一、测试背景与准备工作 在开始介绍如何使用 BackupExec 12.5 进行 Oracle 数据库备份之前,我们需要了解测试的背景以及进行备份前的准备工作。 **测试...

    Symantec Backup Exec12.5备份oracle演示

    ### Symantec Backup Exec 12.5 备份 Oracle 的详细步骤与注意事项 #### 一、测试背景 Backup Exec 是 Symantec 公司推出的一款面向 Windows 平台的优秀备份软件,它提供了全面的数据保护功能,适用于各种规模的...

    Backup_Exec_12_for_oracle_RAC安装-配置-应用

    ### Backup_Exec_12_for_oracle_RAC安装-配置-应用 #### 一、概述 本文档旨在详细介绍如何在Oracle RAC环境下安装、配置并使用Symantec Backup Exec 12来实现数据库的备份与恢复功能。Oracle Real Application ...

    execute immediate 用法研究

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

    linux下安装基于docker安装oracle.docx

    docker exec -it <容器 ID 或名称> /bin/bash ``` 切换到 root 账户: ``` su root ``` 输入密码:helowin 编辑环境变量: ``` vi /etc/profile ``` 添加以下内容: ``` export ORACLE_HOME=/home/oracle/app...

    Oracle 11g ProC_C++编程艺术 源代码

    7. **动态SQL**:在Pro*C/C++中,可以使用EXEC SQL EXECUTE IMMEDIATE动态执行SQL语句,这在需要在运行时构建SQL语句时非常有用。 8. **绑定变量**:为了提高性能和减少SQL注入风险,Pro*C/C++支持绑定变量。变量...

    Oracle 11g ProC_C++编程.rar

    4. **动态SQL**:通过EXEC SQL EXECUTE IMMEDIATE语句,可以在运行时动态执行SQL语句。 5. **嵌入式SQL**:ProC允许在C/C++代码中直接嵌入SQL语句,简化了数据库操作。 6. **绑定变量**:使用绑定变量可以提高性能,...

    Oracle日志管理logminer使用

    SQL> exec DBMS_LOGMNR.ADD_LOGFILE('C:\oracle\redo01.log', DBMS_LOGMNR.ADDFILE); ``` 3. **提交并解析日志:** ```sql SQL> exec DBMS_LOGMNR.COMMIT; SQL> exec DBMS_LOGMNR.PARSE_LOG; ``` 4. **查询...

    《精通Oracle 10g Pro*C/C++编程》源代码与学习笔记

    8. **动态SQL**:在Pro*C中,可以使用字符串拼接或者EXEC SQL EXECUTE IMMEDIATE语句执行动态SQL,这在处理灵活的查询需求时非常有用。 9. **存储过程和函数**:学习如何在C/C++中调用Oracle的存储过程和函数,以及...

    Oracle12C调优

    SHUTDOWN IMMEDIATE; STARTUP; ``` 4. 验证 DBWn 线程数已更改: ```sql SHOW PARAMETER db_writer_processes; ``` 5. 检查 DBWn 进程: ```bash ps -ef | grep oracle | grep dbw ``` ##### 4. 切换可拔...

    oracle批量删除数据

    EXEC del_Tab('tableName', 'min_id , '10000'); ``` 这里`tableName`是要删除数据的表名,`min_id 是删除条件,`10000`表示每次循环删除的最大记录数。 #### 三、注意事项 - **事务管理**:使用`PRAGMA ...

    win7下使用oracle11g在VS2008上配置ProC

    EXEC SQL EXECUTE IMMEDIATE :sqlstmt INTO :name; // ... } ``` 在这个例子中,`connect()`函数用于获取用户输入并建立数据库连接,`sqlerror()`函数用于处理SQL错误,`main()`函数则包含主程序逻辑,如执行SQL...

    ORACLE存储过程最全教程

    调用存储过程使用`EXECUTE`关键字,或者直接写过程名和参数,如`EXEC proc_name(param_value1, param_value2);` 四、存储过程的参数类型 1. IN参数:传递数据到过程,过程内部不能改变其值。 2. OUT参数:过程结束...

    Oracle 11g Pro C/C++编程艺术

    在Pro*C/C++中,可以通过`EXEC IMMEDIATE`命令来执行动态SQL。 #### 六、总结 本文详细介绍了Oracle 11g Pro*C/C++编程的基础知识和技术要点,包括嵌入式SQL、预编译器的工作原理、数据类型映射、数据库连接管理、...

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

    如果你想要通过动态SQL来执行这些操作,可以使用`EXEC`或`EXECUTE`命令,但它们在SQL Server中的用法不同于Oracle的`execute immediate`。以下是一个简单的示例,展示了如何在存储过程中创建动态SQL: ```sql ...

    ORACLE11G新特性

    2. **关闭数据库**:通过 `shutdown immediate` 命令立即关闭数据库。 3. **删除表空间文件**:在数据库关闭后,可以安全地删除 `users` 表空间的相关文件。 4. **重启数据库**:使用 `startup` 命令重新启动数据库...

    BackupExec12fororacleRAC安装配置应用.pdf

    《BackupExec12 for Oracle RAC安装配置详解》 在IT行业中,数据库的备份与恢复是至关重要的环节,尤其是对于企业级应用来说。BackupExec12 for Oracle RAC是一款专门针对Oracle Real Application Clusters(RAC)...

    oracle调用存储过程

    在存储过程中,可以使用动态SQL(`EXECUTE IMMEDIATE`)来执行在运行时构建的SQL语句,这在处理不确定的SQL结构时非常有用。 7. **包(Packages)**: Oracle推荐将相关的存储过程和函数组合成包,以便更好地管理...

    unix下oracle命令.zip

    - 关闭数据库:使用`shutdown`命令,可指定立即、交易完成或正常关闭(如`shutdown immediate`、`shutdown transactional`或`shutdown normal`)。 4. **数据文件管理**: - 查看数据文件:`select file_name ...

Global site tag (gtag.js) - Google Analytics