--=========本地动态sql:(采用execute immediate) --根据业务的需要,如果输入不同查询条件, --则生成不同的执行SQL查询语句,对于这种情况需要使用动态SQL来完成 --Notice : PLSQL只能执行:DML(insert ,update , delete ) ,TCL(commit)语句 ---------执行DDL语句,采用execute immediate --首先看下如下PLSQL程序 declare sql_stat VARCHAR2(100); v_commit varchar2(20); begin -- 静态SQL :第一次运行时进行编译,而后续再次调用,则不再编译该过程。 -- 即一次编译,多次调用,使用的相同的执行计划 insert into emp values ( 8080,'out','developer',7900,sysdate,8999.9,2222,10); -- 动态SQL: 每次运行时需要事先对其编译。即多次调用则需要多次编译.(结尾不能要 ; 号); sql_stat :='DELETE FROM emp WHERE empno=8080'; --使用动态SQL来删除记录 v_commit := 'commit'; EXECUTE IMMEDIATE sql_stat; --每次执行 每次编译 EXECUTE IMMEDIATE v_commit; END; -----执行过程: ----1.pl/sql程序分为编译和执行阶段 ----2.sql语句分为解析(编译) 和执行 ----3.静态sql语句编译(分析) 发生在pl/sql程序的编译阶段. ----4.动态SQL( 用'' 的语句) 是在plsql执行的时候 才会进行分析和执行 --分析下面的SQL declare begin execute immediate 'create table t1 (c1 number(2) )'; insert into t1 values 1; commit; end; -- ERROR:表或者视图不存在 -- why ? --在PLSQL编译阶段 ''中的内容当成字符串,不会解析成SQL -- insert 是静态SQL,在PLSQL编译阶段,会完成语句的分析(语句语法,提及对象,确认对象权限) -- 但是在提及对象的时候发现 t1 不存在,所以会出错. ------修改如下---- declare begin execute immediate 'create table t1 (c1 number(2) )'; execute immediate 'insert into t1 values (1)'; execute immediate 'commit'; end; -- ok:分析 --在PLSQL编译阶段 create , insert , commit 都是字符段,不会解析SQL --在PLSQL执行阶段,完成 create , insert ,commit的解析和执行操作 --====================DML语句+参数操作(using子句)==================== -- 对于使用了参数传入的动态SQL,需要使用USING子句来指明传入的参数 -- 在DML语句中使占位符, --占位符: 用以冒号开头,紧跟任意字母或数字表示 -- 因此在使用EXECUTE IMMEDIATE使用USING子句为其指定其参数。 -- DDL语句不能使用 占位符 declare v_c1 number(2) := 1; v_c2 varchar2(10) :='aa'; begin --error: PLSQL不支持 静态DDL语句 sql不能执行 --create table t1 (c1 number(1), c2 varchar2(10) ;--error -- 动态SQL 创建表 execute immediate 'create table t1 (c1 number(1), c2 varchar2(10))'; -- 动态SQL插入+ using参数 -- DML语句中使用了占位符( :c1, :c2 ) execute immediate 'insert into t1 values'|| ' ( :c1 , :c2)' using v_c1 , v_c2;--为占位符指定参数或值 execute immediate 'commit'; end; --======Returning 子句 +DML语句============== --更新7900的sal,返回更新后的sal DECLARE salary number(6, 2); sql_stat varchar2(100); v_deptno number(4) :=7900; BEGIN sql_stat := 'UPDATE emp SET sal = 999.99' || ' WHERE empno = :eno RETURNING sal INTO :salary'; --使用了占位符:eno,:salary,以及RETURNING子句 EXECUTE IMMEDIATE sql_stat USING v_deptno RETURNING INTO salary; --必须使用USING及RETURNING子句 COMMIT; dbms_output.put_line('salary: ' || salary); END; 更详细的参见:那些大神博客篇 第一个链接
相关推荐
oracle数据库利用plsql提取使用
plsql developer连接远程数据库(本地不用安oracle)
Oralce数据库SQL和pl_sql实例教程Oralce数据库SQL和pl_sql实例教程Oralce数据库SQL和pl_sql实例教程
数据库开发 Oracle数据库 SQL开发教程 第01章 Oracle数据库基础(共60页).pdf 数据库开发 Oracle数据库 SQL开发教程 第02章 编写简单的查询语句(共34页).pdf 数据库开发 Oracle数据库 SQL开发教程 第03章 限制...
PL/SQL Developer是一个集成开发环境,专门面向Oracle数据库存储程序单元的开发。如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。PL/SQL ...
Oracle数据库开发SQL与PLSQL源码
2-2-Oracle数据库知识 PLSQL介绍 共69页.ppt 3-1-Oracle数据库知识 PLSQL控制结构 共25页.ppt 4-1-异常处理 共87页.ppt 4-2-过程与函数 共62页.ppt 4-3-在PLSql中使用sql 共98页.ppt 5-1-DistributedDatabaseSystem...
Oracle数据库10g新的SQL和PLSQL功能.ppt
ORACLE数据库设计(SQL&PLSQL) 内部教材
oracle数据库ppt 第1章 关系数据库与SQL语言环境 第2章 数据查询 第3章 数据操作 第4章 表和视图 第5章 其他数据库对象 第6章 SQL基础 第7章 游标和异常处理 第8章 存储过程、函数和包 第9章 触发器 第10章 数据库...
plsql oracle 数据库图形化 plsql oracle 数据库图形化
大量源码案例,手把手教你PLSQL数据库开发。内容预览: ---- 第一章 PL/SQL 简介 ---- ---- 第二章 PL/SQL程序结构 ---- ---- 第三章 变量与数据类型 ---- ---- 第四章 PL/SQL控制语句 ---- ---- 第五章 PL/SQL游标 ...
Oracle主目录名 = D:\install\PLSQL\instantclient_11_2 OCI库 = D:\install\PLSQL\instantclient_11_2\oci.dll 四. 补充 tnsnames.ora 文件需要手动创建并进行相应的设置, 参考网上教程.
第17章 本地动态sql 第18章 pl/sql过程 第19章 pl/sql函数 第20章 pl/sql包 第21章 触发器 第22章 使用对象类型 第四部分 pl/sql系统包 第23章 使用大对象 第24章 读写os文件 第25章 开发多媒体...
plsql连接oracle数据库插件,修改tnsnames.ora文件里面的配置信息
oracle数据库中的PLSQL程序设计
详细介绍了PLSQL的使用方法,并有详细的举例说明
Oracle数据库维护常用SQL语句集合(3)-PLSQL
PL/SQL Developer 是一个为Oracle数据库开发存储程序单元的集成开发环境(IDE) ,使用 PL/SQL Developer,你能方便地创建你的客户端/ 服务器应用程序的服务器部分。PL/SQL Developer压缩包内包含安装程序和注册机;...
oracle数据库跟踪工具