热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据库技术:executeimmediate

首先在这里发发牢骚,指责下那些刻板的书写方式,不考虑读者理不理解,感觉就是给专业人员用来复习用的一样,没有前戏,直接就高潮,实在受不了!没基础或基础差的完全不知道发生了什么,一脸懵

首先在这里发发牢骚,指责下那些刻板的书写方式,不考虑读者理不理解,感觉就是给专业人员用来复习用的一样,没有前戏,直接就高潮,实在受不了!没基础或基础差的完全不知道发生了什么,一脸懵逼的看着,一星差评!!!

execute immediate

以下引用介绍比较好的例子说明

create or replace procedure proc_test( --参数区域 ) is  --变量区域     --sql脚本     v_sql varchar2(2000) :='';     --记录学生数量     v_num number; begin --执行区域      -- execute immediate用法1:立刻执行sql语句     v_sql := 'create or replace view myview as select id,name from student';     execute immediate v_sql;          --- execute immediate用法2:立刻执行sql语句,并赋值给某个变量     v_sql := 'select count(1) from student';     execute immediate v_sql into v_num;          -- execute immediate用法3:带参数的sql     v_sql:='select * from student t where t.name=:1 and t.age=:2';      execute immediate v_sql using 'zhangsan',23;      end proc_test; /

看了上面的代码,是否觉得理解?no,no,no

对execute immediate  的解释如下

简单来说 就是你一个存储过程当中 创建了一个表 table_a 然后要用insert into将其他的数据插入到这个table_a当中,但是因为你在创建过程的时候 table_a还不存在,过程就会显示有编译错误,因为table_a不存在必然导致过程无法执行,所以无法编译成功,而把insert into语句加如到 execute immediate之后 则oracle不会再去理会这个对象是否存在,因此可以成功编译和执行。

看完了,估计还会有小朋友举手问,跟动态有什么关系,为何扯上动态,哪里动态了,能不能讲明白,等等。。。

敲黑板,人家说的动态,是说execute immediate后面跟的sql代码不固定,你想写就写啥,动态的!

然后又有小朋友,站起来了,你呀的,胡我啊,说最后代码,随便写,我都想笑,这个跟直接写sql代码,不要前面的execute immediate有什么区别?不都执行那条语句么?

哈哈,小朋友你坐下别激动,你问到点上了,execute immediate后边sql代码要用一对单引号的(即’ ‘),而直接写sql没有的对吧,告诉你动态的秘诀就在于execute immediate后边sql代码可以去拼接,这就实现了所谓动态,会根据不同情况,拼接不同的代码。

简单举例

直接写的   select * from dual;

用execute immediate写    v_sql:=’select * from dual’;
                                          execute immediate v_sql; 
一般来说直接写sql的性能是高于拼字符串的,因为如果执行拼字符串的需要内部自动调动oracle机制,先解析字符串映射成sql语句然后再执行。
但是拼sql的方式有好处。即sql语句是一个字符串可以动态拼接,根据不同的条件来改变sql语句,这是直接写sql所不能达到的。

拼sql还有个好处就是    v_sql:=’select * from tables t where t.c_date=:1 and t.name=:2′;  
                                         execute immediate v_sql using ‘20130304’,’xiaoming’;

可以动态的对参数传递值,这是最大的优势。 
语法结构:
execute immediate dynamic_string [into {define_variable[,define_variable]…| record}] [using [in | out | in out] bind_argument[,[in | out  in out] bind_argumnet]…] [{returning | return} into bind_argument[,bind_argument]…];

本地动态sql语句一个优点是可以在代码中是使用绑定变量。

先说说绑定变量 “:“称绑定变量指示符,解释如下:

它是用户放入查询中的占位符,它会告诉oracle” 现在生成一个方案框架,实际执行语句的时候,会提供应该使用的实际值”。

例子如下:
select * from emp where dep=’sale’ ;                   //不使用绑定变量
select * from emp where dep=:sale                    //使用绑定变量

execute immediate

execute immediate

execute immediate

用法
    处理ddl操作(create,alter,drop)
    create or replace procedure drop_table(table_name varchar2)
    is
     sql_statemet varchar2(100);
    begin 
     sql_statement:=’drop table’ || table_name;
     execute immediate sql_statement;
    end;
    /
    建立过程drop_table后,调用如下:
    sql> exec drop_table(‘worker’)
    处理dcl操作(grant revoke)
    sql> conn system/manager
    create or replace procedure grant_sys_priv(priv varchar2,username varchar2)
    is
     sql_stat varchar2(100);
    begin
     sql_stat:=’grant “ || priv|| ’ to ’|| username;
    execute immediate sql_stat;
    end;
    /
    调用
    sql> exec grant_sys_priv(‘create session’,’scott’)
    处理dml操作(insert update delete)
    如果dml语句带有占位符,那么在e i语句中则要带using子句
    如果dml语句带有returning子句,那么e i语句中要带有returninginto子句
    例子,处理单行查询:
    declare
     sql_stat varchar2(100);
     emp_record tbl%rowtype;
    begin
     sql-stat:=’select * from tbl where tblno=:no’;
     execute immediate sql_stat into emp_record using &1;
     dbms_output.put_line(emp_record.ename||emp_record.sal);
    end;

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,都可以关注数据库技术分享栏目—编程笔记

 


推荐阅读
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • SQLite 动态创建多个表的需求在网络上有不少讨论,但很少有详细的解决方案。本文将介绍如何在 Qt 环境中使用 QString 类轻松实现 SQLite 表的动态创建,并提供详细的步骤和示例代码。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 本文详细介绍了 MySQL 中 LAST_INSERT_ID() 函数的使用方法及其工作原理,包括如何获取最后一个插入记录的自增 ID、多行插入时的行为以及在不同客户端环境下的表现。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文详细介绍了C语言中链表的两种动态创建方法——头插法和尾插法,包括具体的实现代码和运行示例。通过这些内容,读者可以更好地理解和掌握链表的基本操作。 ... [详细]
  • 本文介绍了如何通过扩展 UnityGUI 创建自定义和复合控件,以满足特定的用户界面需求。内容涵盖简单和静态复合控件的实现,并展示了如何创建复杂的 RGB 滑块。 ... [详细]
  • openGauss每日一练:第6天 - 模式的创建、修改与删除
    本篇笔记记录了openGauss数据库中关于模式(Schema)的创建、修改和删除操作。通过这些操作,用户可以更好地管理和控制数据库对象。实验环境为openGauss 2.0.0,并使用由墨天轮提供的线上环境。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
author-avatar
小嘿嘿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有