PLSQL开发中动态SQL的使用方法
plsql使用技巧
plsql使用技巧PL/SQL(Procedural Language/Structured Query Language)是一种过程性的编程语言,用于Oracle数据库的开发和管理。
它结合了SQL语句和基于编程的语言元素,从而允许开发人员编写复杂的业务逻辑和数据处理程序。
以下是一些PL/SQL使用技巧,可以帮助您更好地利用这个强大的工具。
1. 使用块来组织代码:PL/SQL程序由一个或多个块组成,每个块由BEGIN和END语句包围。
使用块可以将相关的代码段组合在一起,并简化代码的调试和维护。
2. 使用异常处理来处理错误:PL/SQL提供了异常处理机制,可以捕获和处理程序中的错误。
通过使用异常处理,可以使程序更加健壮,并提供更好的用户体验。
3. 使用游标来处理查询结果:游标是一种用于操作查询结果的PL/SQL对象。
通过使用游标,可以对查询结果进行逐行处理,并执行各种操作,如插入、更新或删除。
4. 使用PL/SQL表来处理临时数据:PL/SQL提供了PL/SQL 表,这是一种在内存中存储数据的临时表。
使用PL/SQL表可以大大提高程序的性能,因为它们比数据库表更快。
5. 使用存储过程和函数来封装业务逻辑:存储过程和函数是PL/SQL程序的一种类型,它们允许将一系列SQL语句封装到一个可重用的代码块中。
使用存储过程和函数可以提高代码的可维护性和重用性。
6. 使用触发器来自动执行任务:PL/SQL触发器是与数据库表相关联的一种代码块,当满足特定条件时,会自动执行。
使用触发器可以实现自动化任务,如在插入、更新或删除行时执行某些操作。
7. 使用游程来优化数据处理:游程是一种PL/SQL特性,可以将一组记录作为一个单元处理,而不是逐行处理。
通过使用游程,可以大大提高程序的性能,尤其是当需要处理大量数据时。
8. 使用动态SQL来处理动态查询:PL/SQL提供了动态SQL的能力,这使得可以在运行时构建和执行SQL语句。
PLSQL怎么执行SQL语句
通过f5查看到的执行计划,其实是pl/sql developer工具内部执行查询 plan_table表然后格式化的结果。
select * from plan_table where statement_id=...。
其中description列描述当前的数据库操作,object owner列表示对象所属用户,object name表示操作的对象,cost列表示当前操作的代价(消耗),这个列基本上就是评价sql语句的优劣,cardinality列表示操作影响的行数,bytes列表示字节数篇二:plsqldeveloper工具使用教程plsql入门pl/sql的概述pl/sql的优势pl/sql是一种块结构的语言,允许你将业务逻辑封装在一起,这是到目前为止使用pl/sql的最大优势pl/sql是在服务器上运行,可以与数据库和sql引擎直接进行交互,pl/sql是什么?(procedural language/sql) 是oracle在标准的sql语言上的扩展,pl/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用列外处理各种错误,这样使得它的功能变得更加强大。
特性: 减少java程序的复杂性一.过程,函数,触发器是pl/sql编写的二.过程、函数、触发器是在oracle中三. pl/sql是非常强大的数据库过程语言四.过程,函数可以再java程序中调用为什么学?a) 提高应用程序的运行性能b) 模块化的设计思想[分页的过程,订单的过程,转账的过程]c) 减少网络传输量(传统的方法,用sql语句传输!现在就只需要调用存储过程) d) 提高安全性(传统sql 可以看到表名字段等…)不好:移植性不好,(你写好的存储过程,函数等当我们要换数据库时,这些东西就没用了)开发工具:1. sqlplus 开发工具是oracle公司提供的一个工具,这个因为我们在以前介绍过:2. pl/sql developer开发工具pl/sql developer是用于开发pl/sql块的集成开发环境(ide)它是一个独立的产品,而不是oracle的一个附带品,createprocedure sp_pro1//存储过程名字 isbegin---执行部分insert into mytest values(‘’,’’);end;/查看错误信息show error;调用过程:有两中方式1 exec 过程名(参数值1,参数值2…..)2 call 过程名用pl/sql developer--案例create or replace procedure简单分类pl/sql developer 工具的使用:plsql developer是一个为oracle数据库开发存储程序单元的集成开发环境,使用plsql developer你能方便的创建你的客户/服务器应用程序的服务器部分。
PL SQL 用户指南和参考第十一章 本地动态SQL
第十一章本地动态SQL一、什么是动态SQL大多数PL/SQL都做着一件特殊的结果可预知的工作。
例如,一个存储过程可能接受一个雇员的编号和他的提薪金额,然后更新表emp中的信息。
在这种情况下,UPDATE的全部文本内容在编译期就完全确定下来,这样的语句不会随着程序的执行而发生变化。
所以,称它们为静态SQL语句。
但是,有些程序只能是在运行时建立并处理不同的SQL语句。
例如,一般用途的报告打印就可能会根据用户的选择内容不同,而使我们的SELECT内容也随之变化,然后打印出相应的数据来。
这样的语句在编译期是无法确定它的内容的,所以称它们为动态SQL语句。
动态SQL语句是在运行时由程序创建的字符串,它们必须是有效的SQL语句或PL/SQL块。
它们也可以包含用于数据绑定的占位符。
占位符是未声明的标识符,所以,它的名称并不重要,只需以冒号开头。
例如,对于下面的字符串来说,PL/SQL不会认为它们有什么不同:'DELETE FROM emp WHERE sal > :my_sal AND comm < :my_comm''DELETE FROM emp WHERE sal > :s AND comm < :c'我们使用EXECUTE IMMEDIATE语句处理大多数的动态SQL语句。
但是,要处理多行查询(SELECT语句),就必须使用OPEN-FOR、FETCH和CLOSE语句。
二、动态SQL的需求只有在下的情况下我们才需要使用动态SQL:1.执行数据定义语句(如CREAET),数据控制语句(如GRANT)或会话控制语句(如ALTERSESSION)。
因为在PL/SQL中,这样的语句是不允许静态执行的。
2.为了获取更多的灵活性。
例如,我们想在运行时根据我们自己的实际需求来为SELECT语句的WHERE子句选择不同的schema对象。
3.动态地使用包DBMS_SQL执行SQL语句,但是为了获得更好的性能,灵活方便或是DBMS_SQL不支持的功能(如对象和集合的操作)。
PLSQL用法技巧
PL/SQL的使用技巧1、PL/SQL Developer记住登陆密码在使用PL/SQL Developer时,为了工作方便希望PL/SQL Developer记住登录Oracle的用户名和密码;设置方法:PL/SQL Developer7.1.4->tools->Preferences->Oracle->Logon History,“Store history”是默认勾选的,勾上“Store with password”即可,重新登录在输入一次密码则记住了。
2、执行单条SQL语句在使用PL/SQL Developer的SQL Window时,按F8键,PL/SQL Developer默认是执行该窗口的所有SQL 语句,需要设置为鼠标所在的那条SQL语句,即执行当前SQL语句;设置方法:PL/SQL Developer7.1.4-->tools->Preferences-->Window types,勾上“AutoSelect Statement”即可。
3、格式化SQL语句在使用PL/SQL Developer的SQL Window时,有时候输入的SQL语句太长或太乱,希望能用比较通用的写法格式话一下,这样看起来会好看些,也好分析;使用方法:选中需要格式化的SQL语句,然后点击工具栏的PL/SQL beautifier按钮即可.4.使用自定义快捷键PL/SQL Developer也可以像其他IDE那样使用自定义快捷键提高编写代码效率,为开发者提供方便。
如我们平时在sql窗口中使用最频繁的select*from我们就可以设置一个快捷键来简化select*from 的输入。
1).建立一个文本文件shortcuts.txt,并写入如下内容:引用s=SELECT*FROMw=WHERE1=1ANDsc=SELECT count(*)FROM复制代码另存到PL/SQL Developer的安装路径下的~\PlugIns目录下2).Tools-->Preferences-->User Interface-->Editor-->AutoReplace,选中Enable复选框,然后浏览文件选中之前创建的shortcuts.txt,点击Apply3).重启PL/SQL Developer,在sql窗口中输入s+空格,w+空格,sc+空格做测试4、查看执行计划在使用PL/SQL Developer的SQL Window时,有时候输入的SQL语句执行的效率,分析下表结构,如何可以提高查询的效率,可以通过查看Oracle提供的执行计划;使用方法:选中需要分析的SQL语句,然后点击工具栏的Explain plan按钮(即执行计划),或者直接按F5即可。
动态SQL基本语句用法
动态SQL基本语句⽤法1.if语句如果empno不为空,则在WHERE参数后加上AND empno = #{empno},这⾥有1=1所以即使empno为null,WHERE后⾯也不会报错。
映射⽂件<select id="getEmpById2" resultType="emp">SELECT * FROM emp WHERE 1=1<if test="empno != null">AND empno = #{empno}</if></select>EmpMapper接⼝public Emp getEmpById2(@Param("empno")Integer empno) throws IOException;有时候我们并不想应⽤所有的条件,⽽只是想从多个选项中选择⼀个。
⽽使⽤if标签时,只要test中的表达式为 true,就会执⾏ if 标签中的条件。
MyBatis 提供了 choose 元素。
if标签是与(and)的关系,⽽ choose 是或(or)的关系。
2.where语句和Choose(when,otherwise)1.Where后⾯empno和ename为null,那where就不会出现在sql语句中。
2. choose标签是按顺序判断其内部when标签中的test条件出否成⽴,如果有⼀个成⽴,则 choose 结束。
当 choose 中所有 when 的条件都不满则时,则执⾏ otherwise 中的sql。
类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。
映射⽂件<select id="getEmpById3" resultType="emp" parameterType="emp">SELECT * FROM EMP<where><choose><when test="empno != null">AND empno like #{empno}</when><when test="ename != null">AND ename like #{ename}</when><otherwise>AND job = "zz"</otherwise></choose></where></select>EmpMapper接⼝public Emp getEmpById3(Emp emp) throws IOException;3.set语句set主要也是⽤来解决更新问题的。
Oracle中使用PLSQL使用动态SQL语句实现数据处理实例
使用动态SQL语句实现数据处理实例
主要语句: 1.删除同名临时表语句,及执行语句
v_SQLStr:='DROP TABLE temptable'; EXECUTE IMMEDIATE v_SQLStr; 2.创建临时ห้องสมุดไป่ตู้语句,及执行语句 v_SQLStr:='CREATE TABLE temptable (id INT NOT NULL PRIMARY KEY,tmpname VARCHAR2(100))'; EXECUTE IMMEDIATE v_SQLStr;
使用动态SQL语句实现数据处理实例
使用动态SQL语句实现数据处理实例
执行结果:
使用动态SQL语句实现数据处理实例
主要语句: 3.向临时表插入数据语句,及执行语句
v_SQLStr:='INSERT INTO temptable VALUES(10,''临时名称1'')'; EXECUTE IMMEDIATE v_SQLStr; 4.查询语句,及执行语句 v_SQLStr:='SELECT * FROM temptable WHERE id=:tempId'; EXECUTE IMMEDIATE v_SQLstr INTO v_Id,v_Name USING &1;
Oracle中使用PL/SQL 使用动态SQL语句实现数据处理实例
动态SQL
• 动态SQL是指运行时由字符串拼合而成的SQL • 可使用 EXECUTE IMMEDIATE来执行动态SQL语句
使用动态SQL语句实现数据处理实例
要求: 动态创建一个临时表,向这个表中插入数据,然后查询表中的数据,
greatest plsql 用法
greatest plsql 用法
PL/SQL是Oracle数据库中一种强大的编程语言,可以用于存储过程、触发器、函数等编程任务。
下面列出了PL/SQL的一些最佳使用方法:
1. 使用存储过程来执行复杂的数据操作,这样可以减少网络流量并提高性能。
2. 使用游标来处理大量数据,以便在处理结果集时可以逐行操作。
3. 使用异常处理程序来处理错误,这样可以更好地控制程序的执行流程。
4. 使用集合类型来处理大量数据,例如VARRAYS和TABLES等。
5. 使用触发器来在数据库中自动执行操作,例如在插入、更新或删除数据时执行某些操作。
6. 使用函数来执行特定的计算任务,例如计算日期之间的间隔或字符串之间的相似度。
7. 使用包来组织PL/SQL程序,这样可以更好地管理代码并提高可读性。
8. 使用动态SQL来生成动态查询,以便根据不同的参数执行不同的查询。
9. 使用参数化查询来避免SQL注入攻击。
10. 使用性能调优工具来优化PL/SQL程序,以便提高程序的性能并减少资源消耗。
Oracle动态SQL之本地动态SQL的使用
计算机 与网络
Orce动 态 S al QL之 本地 动 态 S QL昀 使 用
长 沙环 境保 护职 业技 术 学 院信 息技 术 系 史 小玲
[ 摘 要] r l 提供 了动态 S 的 支持 , O ae c QL 通过使 用本地动 态 S L 在数 据库程序 开发 中可以实现动态的创 建、 除表 , Q , 删 动态的构造 S 语句等, QL 为程序 开发提供极大的灵活性。该文主要通过几个例子来简单介 绍一下 O a e r l 本地 S L的基本用法和使 用技巧。 c Q [ 关键词 】 r l 数据库 P / Q O ae c L S L开发 动 态 S L 本地动 态 S L Q Q
_ _ _
b gn e i v s l: c e t t b e a q =’r a e a l b t
_
e euei x c t mme i t s ; d aev ql
v
_
在这个例子使用了 R T R I GI T E U N N O子句和 U I G子句 。 N SN 需要注 意的是 , 在这个例子 中。 X C T M DA 语句 中取返 回值使用 的 E E U I E IT E M E 是 R T R I GI T E U N N N O子句 , 而单行查询 中使用 的是 I T N O子句 , 两者在 E E U EI M D I x C T E I ' M E语句中的位置也有所不 同。 2 使 用 F T H游标来处理多行查询语句的动态 S L 、 EC Q
s l: ’ a t ee t ntb q = g n l r s c o a
_
t t bc 一 D L e p l ’ C 语句 st u i; o
oracle动态sql语句基本语法
oracle动态sql语句基本语法Oracle动态SQL语句是一种在运行时动态生成SQL语句的技术。
它可以根据不同的条件和参数生成不同的SQL语句,从而实现更加灵活和高效的数据操作。
下面是Oracle动态SQL语句的基本语法:1. 使用EXECUTE IMMEDIATE语句执行动态SQL语句:EXECUTE IMMEDIATE 'SELECT * FROM employees WHERE department_id = :dept_id' USING dept_id;2. 使用BIND VARIABLES绑定变量:DECLAREv_dept_id NUMBER := 10;v_sql VARCHAR2(100);BEGINv_sql := 'SELECT * FROM employees WHERE department_id = :dept_id';EXECUTE IMMEDIATE v_sql USING v_dept_id;END;3. 使用PL/SQL变量拼接SQL语句:DECLAREv_dept_id NUMBER := 10;v_sql VARCHAR2(100);BEGINv_sql := 'SELECT * FROM employees WHERE department_id = ' || v_dept_id;EXECUTE IMMEDIATE v_sql;END;4. 使用CASE语句生成动态SQL语句:DECLAREv_dept_id NUMBER := 10;v_sql VARCHAR2(100);BEGINv_sql := 'SELECT * FROM employees WHERE department_id = ';v_sql := v_sql || CASE WHEN v_dept_id IS NULL THEN 'NULL' ELSE TO_CHAR(v_dept_id) END;EXECUTE IMMEDIATE v_sql;END;5. 使用FOR LOOP生成动态SQL语句:DECLAREv_dept_id NUMBER := 10;v_sql VARCHAR2(100);BEGINv_sql := 'SELECT * FROM employees WHERE department_id IN (';FOR i IN 1..10 LOOPv_sql := v_sql || i || ',';END LOOP;v_sql := SUBSTR(v_sql, 1, LENGTH(v_sql) - 1) || ')';EXECUTE IMMEDIATE v_sql;END;6. 使用SYS_CONTEXT函数获取当前用户信息:DECLAREv_user VARCHAR2(30) := SYS_CONTEXT('USERENV', 'CURRENT_USER');v_sql VARCHAR2(100);BEGINv_sql := 'SELECT * FROM employees WHERE created_by = ''' || v_user || '''';EXECUTE IMMEDIATE v_sql;END;7. 使用DBMS_SQL包执行动态SQL语句:DECLAREv_cursor INTEGER;v_sql VARCHAR2(100);BEGINv_sql := 'SELECT * FROM employees WHERE department_id = :dept_id';v_cursor := DBMS_SQL.OPEN_CURSOR;DBMS_SQL.PARSE(v_cursor, v_sql, DBMS_SQL.NATIVE);DBMS_SQL.BIND_VARIABLE(v_cursor, ':dept_id', 10);DBMS_SQL.EXECUTE(v_cursor);DBMS_SQL.CLOSE_CURSOR(v_cursor);END;8. 使用DBMS_SQL.RETURN_RESULT函数返回结果集:DECLAREv_cursor INTEGER;v_sql VARCHAR2(100);BEGINv_sql := 'SELECT * FROM employees WHERE department_id = :dept_id';v_cursor := DBMS_SQL.OPEN_CURSOR;DBMS_SQL.PARSE(v_cursor, v_sql, DBMS_SQL.NATIVE);DBMS_SQL.BIND_VARIABLE(v_cursor, ':dept_id', 10);DBMS_SQL.EXECUTE(v_cursor);DBMS_SQL.RETURN_RESULT(v_cursor);DBMS_SQL.CLOSE_CURSOR(v_cursor);END;9. 使用DBMS_SQL.DESCRIBE_COLUMNS函数获取结果集元数据:DECLAREv_cursor INTEGER;v_sql VARCHAR2(100);v_col_cnt INTEGER;v_col_desc DBMS_SQL.DESC_TAB;BEGINv_sql := 'SELECT * FROM employees WHERE department_id = :dept_id';v_cursor := DBMS_SQL.OPEN_CURSOR;DBMS_SQL.PARSE(v_cursor, v_sql, DBMS_SQL.NATIVE);DBMS_SQL.BIND_VARIABLE(v_cursor, ':dept_id', 10);DBMS_SQL.EXECUTE(v_cursor);v_col_cnt := DBMS_SQL.FETCH_ROWS(v_cursor);DBMS_SQL.DESCRIBE_COLUMNS(v_cursor, v_col_cnt, v_col_desc); DBMS_SQL.CLOSE_CURSOR(v_cursor);END;10. 使用DBMS_SQL.COLUMN_VALUE函数获取结果集列值:DECLAREv_cursor INTEGER;v_sql VARCHAR2(100);v_col_cnt INTEGER;v_col_desc DBMS_SQL.DESC_TAB;v_emp_id NUMBER;v_emp_name VARCHAR2(30);BEGINv_sql := 'SELECT employee_id, first_name FROM employees WHERE department_id = :dept_id';v_cursor := DBMS_SQL.OPEN_CURSOR;DBMS_SQL.PARSE(v_cursor, v_sql, DBMS_SQL.NATIVE);DBMS_SQL.BIND_VARIABLE(v_cursor, ':dept_id', 10);DBMS_SQL.EXECUTE(v_cursor);v_col_cnt := DBMS_SQL.FETCH_ROWS(v_cursor);DBMS_SQL.DESCRIBE_COLUMNS(v_cursor, v_col_cnt, v_col_desc); LOOPEXIT WHEN DBMS_SQL.FETCH_ROWS(v_cursor) = 0;DBMS_SQL.COLUMN_VALUE(v_cursor, 1, v_emp_id);DBMS_SQL.COLUMN_VALUE(v_cursor, 2, v_emp_name);DBMS_OUTPUT.PUT_LINE(v_emp_id || ' ' || v_emp_name);END LOOP;DBMS_SQL.CLOSE_CURSOR(v_cursor);END;以上是Oracle动态SQL语句的基本语法,可以根据实际需求进行灵活应用。
PLSQL(五)PLSQL中动态执行SQL语句
PLSQL(五)PLSQL中动态执⾏SQL语句在PL/SQL程序开发中,可以使⽤DML语句和事务控制语句,但是还有很多语句(⽐如DDL语句)不能直接在PL/SQL中执⾏。
这些语句可以使⽤动态SQL来实现。
PL/SQL块先编译然后再执⾏,动态SQL语句在编译时不能确定,只有在程序执⾏时把SQL语句作为字符串的形式由动态SQL命令来执⾏。
在编译阶段SQL语句作为字符串存在,程序不会对字符串中的内容进⾏编译,在运⾏阶段再对字符串中的SQL语句进⾏编译和执⾏,动态SQL的语法是:语法格式:动态SQLEXECUTE IMMEDIATE 动态语句字符串[INTO 变量列表][USING 参数列表]语法解析:如果动态语句是SELECT语句,可以把查询的结果保存到INTO后⾯的变量中。
如果动态语句中存在参数,USING为语句中的参数传值。
动态SQL中的参数格式是:[:参数名],参数在运⾏时需要使⽤USING传值。
案例9:动态SQL代码演⽰:动态SQLDECLAREsql_stmt VARCHAR2(200); --动态SQL语句emp_id NUMBER(4) :=7566;salary NUMBER(7,2);dept_id NUMBER(2) :=90;dept_name VARCHAR2(14) :='PERSONNEL';location VARCHAR2(13) :='DALLAS';emp_rec emp%ROWTYPE;BEGIN--⽆⼦句的execute immediateEXECUTE IMMEDIATE 'CREATE TABLE bonus1 (id NUMBER, amt NUMBER)'; ①----using⼦句的execute immediatesql_stmt :='INSERT INTO dept VALUES (:1, :2, :3)';EXECUTE IMMEDIATE sql_stmt USING dept_id, dept_name, location; ②----into⼦句的execute immediatesql_stmt :='SELECT * FROM emp WHERE empno = :id';EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id; ③----returning into⼦句的execute immediatesql_stmt :='UPDATE emp SET sal = 2000 WHERE empno = :1 RETURNING sal INTO :2';EXECUTE IMMEDIATE sql_stmt USING emp_id RETURNING INTO salary; ④EXECUTE IMMEDIATE 'DELETE FROM dept WHERE deptno = :num' USING dept_id; ⑤END;代码解析:①动态执⾏⼀个完整的SQL语句。
动态sql语句基本用法
动态sql语句基本⽤法if 标签通常⽤于WHERE 语句、UPDATE 语句、INSERT 语句中,通过判断参数值来决定是否使⽤某个查询条件、判断是否更新某⼀个字段、判断是否插⼊某个字段的值。
<if test="name != null and name != ''">and NAME = #{name}</if>foreach 标签主要⽤于构建 in 条件,可在 sql 中对集合进⾏迭代。
也常⽤到批量删除、添加等操作中。
<!-- in查询所有,不分页 --><select id="selectIn" resultMap="BaseResultMap">select name,hobby from student where id in<foreach item="item" index="index" collection="list" open="(" separator="," close=")">#{item}</foreach></select>collection:collection 属性的值有三个分别是 list、array、map 三种,分别对应的参数类型为:List、数组、map 集合。
item :表⽰在迭代过程中每⼀个元素的别名index :表⽰在迭代过程中每次迭代到的位置(下标)open :前缀close :后缀separator :分隔符,表⽰迭代时每个元素之间以什么分隔有时候我们并不想应⽤所有的条件,⽽只是想从多个选项中选择⼀个。
MyBatis 提供了choose 元素,按顺序判断when 中的条件出否成⽴,如果有⼀个成⽴,则choose 结束。
动态sql
1.什么是动态SQL?动态SQL是指在运行PL/SQL块时动态输入SQL语句。
在PL/SQL块中只能执行DDL(create、alter、drop)、DCL(grant、revoke)或比较灵活的SQL语句(如select子句不带where条件);动态SQL的性能不如静态SQL,但是比较灵活;在PL/SQL块中编写动态SQL语句时需要将SQL语句存放到字符串变量中而且SQL语句可以包含占位符(以冒号开始);2.动态SQL的语法2.1 使用execute immediate语句可以处理多数动态SQL操作如:DDL语句(create、alter、drop)、DML语句(insert、update、delete)、DCL(grant、revoke)以及单行的select子句;但是不能处理多行查询语句。
2.2 使用open...for,fetch和close语句在游标中使用。
2.3 使用批量动态SQL语句*/---------------------------------------------------------------***************************************************************1. 使用execute immediate---------------------------------------------------------------1.1 使用execute immediate处理DDL语句-----------------------------------------------------------------案例01:使用execute immediate处理DDL语句--createdeclarecreate_table varchar2(200);begincreate_table:='create table ' ||'&table_name' ||'(sid int, sno int)';execute immediate create_table ;end;--案例02:使用execute immediate处理DDL语句---alterdeclarealter_table varchar2(200);beginalter_table:='alter table &target_table_name modify &column_name varchar2(10)'; execute immediate alter_table ;end;--案例03:使用execute immediate处理DDL语句---dropdeclaredrop_table varchar2(200);begindrop_table:='drop table ' ||'&target_table_name';execute immediate drop_table ;end;--案例04:使用execute immediate处理DDL语句--drop tablecreate or replace procedure drop_table (table_name varchar2)issql_sta varchar2(200);beginsql_sta:='drop table ' ||table_name;execute immediate sql_sta;end;--调用方法:exec drop_table('accp');--案例05:使用execute immediate处理DDL语句--create+selectdeclareselect_sta varchar2(200);emp_rec emp%rowtype;beginexecute immediate'create table sodi(sid int, sno int)';select_sta:='select * from emp where empno=:id';execute immediate select_sta into emp_rec using &1; /*使用占位符时,这个占位符是在引号内使用的*/end;---------------------------------------------------------1.2 使用execute immediate处理DCL语句------------------------------------------------------------案例01:使用execute immediate处理DCL语句--grantcreate or replace procedure grant_priv(priv varchar2, username varchar2)ispriv_stat varchar2(200);beginpriv_stat:=' grant '|| priv || ' to ' || username; --注意字符串和连接符之间的空格execute immediate priv_stat;end;--调用方法exec grant_priv('create session', 'scott');--案例02:使用execute immediate处理DCL语句--revokecreate or replace procedure revoke_priv(priv varchar2, username varchar2)ispriv_stat varchar2(200);beginpriv_stat:=' revoke '|| priv || ' from ' || username; --注意字符串和连接符之间的空格execute immediate priv_stat;--调用方法exec revoke_priv('create session', 'scott');----------------------------------------------------------------1.3.使用execute immediate处理DML语句----------------------------------------------------------------1.处理无占位符和return子句的DML语句--案例01:查询子句:selectdeclaresql_stat varchar2(100);beginsql_stat:='select * from emp';execute immediate sql_stat;end;--案例02:处理无占位符和return子句的DML语句--insertdeclareinsert_table varchar2(200);begininsert_table:='insert into &table_name values (&sid, &sno)';execute immediate insert_table;end;--案例03:处理无占位符和return子句的DML语句--updatedeclareupdate_table varchar2(200);beginupdate_table:='update &table_name set &column_name=&new_value '; execute immediate update_table;end;--案例06:处理无占位符和return子句的DML语句--deletedelete_table varchar2(200);begindelete_table:='delete from &table_name ';execute immediate delete_table;end;--案例05:新建一个表然后插入数据--create+insertdeclarecreate_table varchar2(200);begincreate_table:='create table &table_name(sid int, sno int)'; execute immediate create_table ;end;declareinsert_table varchar2(200);begininsert_table:='insert into &table_name values (&sid, &sno)'; execute immediate insert_table;end;--案例06:同时实现新建一个表并插入数据--create+insertdeclarecreate_table varchar2(200);insert_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)'; execute immediate create_table ;insert_table:='insert into &table_name values (&sid, &sno)'; execute immediate insert_table;end;--案例07:同时实现新建一个表并插入数据--create+insert+update/*这里也可以分开写*/declarecreate_table varchar2(200);insert_table varchar2(200);update_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute immediate create_table ;insert_table:='insert into &table_name values (&sid, &sno)';execute immediate insert_table;update_table:='update &table_name set &column_name=&new_value where sid=&old_value'; execute immediate update_table;end;--案例08:同时实现新建一个表并插入数据--create+insert+update+deletedeclarecreate_table varchar2(200);insert_table varchar2(200);update_table varchar2(200);delete_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute immediate create_table ;insert_table:='insert into &table_name values (&sid, &sno)';execute immediate insert_table;update_table:='update &table_name set &column_name=&new_value where sid=&old_value'; execute immediate update_table;delete_table:='delete from &delete_tablename';execute immediate delete_table;end;--案例08:同时实现新建一个表并插入数据--create+insert+update+delete+insertdeclarecreate_table varchar2(200);insert_table varchar2(200);update_table varchar2(200);delete_table varchar2(200);re_insert_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute immediate create_table ;insert_table:='insert into &table_name values (&sid, &sno)';execute immediate insert_table;update_table:='update &table_name set &column_name=&new_value where sid=&old_value'; execute immediate update_table;delete_table:='delete from &delete_tablename';execute immediate delete_table;re_insert_table:='insert into &re_table_name values (&new_sid, &new_sno)';execute immediate re_insert_table;end;2.处理占位符的DML语句--案例01:处理占位符的DML语句:create+insertdeclarecreate_table varchar2(200);insert_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute immediate create_table ;insert_table:='insert into &target_table_name values (:sid, :sno)';execute immediate insert_table using &2,&3;end;--案例02:处理占位符的DML语句:create+insert_updatedeclarecreate_table varchar2(200);insert_table varchar2(200);update_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute immediate create_table ;insert_table:='insert into &target_table_name values (:sid, :sno)';execute immediate insert_table using &1,&2;update_table:='update &update_tablename set &update_column_name=:new_value where &condition_column=:old_value ';execute immediate update_table using &3 ,&4;end;---ordeclarecreate_table varchar2(200);insert_table varchar2(200);update_table varchar2(200);begincreate_table:='create table &新建的表名(sid int, sno int)';execute immediate create_table ;insert_table:='insert into &插入数据的表名values (:sid, :sno)';execute immediate insert_table using &sid的值,&sno的值;update_table:='update &被更新的表名set &更新的列名=:new_value where &条件列=:old_value ';execute immediate update_table using &新值,&条件列的值;end;--案例03:处理占位符的DML语句:create+update+insert+deletedeclarecreate_table varchar2(200);insert_table varchar2(200);update_table varchar2(200);delete_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute immediate create_table ;insert_table:='insert into &target_table_name values (:sid, :sno)';execute immediate insert_table using &1,&2;update_table:='update &update_tablename set &update_column_name=:new_value where &update_condition_column=:delete_condition_column_value ';execute immediate update_table using &3 ,&4;delete_table:='delete from &dele_table_name where &delete_condition_column=:delete_condition_column_value';execute immediate delete_table using &5;end;---执行过程:SQL> declarecreate_table varchar2(200);insert_table varchar2(200);update_table varchar2(200);delete_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute immediate create_table ;10 insert_table:='insert into &target_table_name values (:sid, :sno)';execute immediate insert_table using &1,&2;13 update_table:='update &update_tablename set &update_column_name=:new_value where &update_condition_column=:delete_condition_column_value ';execute immediate update_table using &3 ,&4;16 delete_table:='delete from &dele_table_name where &delete_condition_column=:delete_condition_column_value';execute immediate delete_table using &5;end;/输入table_name 的值: sz原值7: create_table:='create table &table_name (sid int, sno int)';新值7: create_table:='create table sz (sid int, sno int)';输入target_table_name 的值: sz原值10: insert_table:='insert into &target_table_name values (:sid, :sno)';新值10: insert_table:='insert into sz values (:sid, :sno)';输入1 的值: 101输入2 的值: 201原值11: execute immediate insert_table using &1,&2;新值11: execute immediate insert_table using 101,201;输入update_tablename 的值: sz输入update_column_name 的值: sid输入update_condition_column 的值: sno原值13: update_table:='update &update_tablename set &update_column_name=:new_ value where &update_condition_column=:delete_condition_column_value ';新值13: update_table:='update sz set sid=:new_value where sno=:delete_condition_column_value ';输入3 的值: 1001输入4 的值: 201原值14: execute immediate update_table using &3 ,&4;新值14: execute immediate update_table using 1001 ,201;输入dele_table_name 的值: sz输入delete_condition_column 的值: sno原值16: delete_table:='delete from &dele_table_name where &delete_condition_column=:delete_condition_column_value';新值16: delete_table:='delete from sz where sno=:delete_condition_column_value';输入5 的值: 201原值17: execute immediate delete_table using &5;新值17: execute immediate delete_table using 201;PL/SQL 过程已成功完成。
PLSQL批量操作与动态SQL
1、批量绑定:批量绑定是指单条SQL操作能传递所有PLSQL表的数据。
通过批量绑定,可以极大地加快数据处理速度,提高应用程序性能。
批量绑定语句forall主要针对insert、update、delete等语句,forall绑定的表必须是PLSQL表,即单列多行的数据结构(类似于c语言中的数组),如:索引表、嵌套表、变长数组,不能是记录表。
2、批量绑定语句forall的语法:(一次次的提取数据)语法一:(i作为PLSQL表的下标被引用)forall i in lower..upper sql_statement;解释:对PLSQL表中下标为i(取值范围为lower和upper之间,包括边界,i可以是其他满足命名规则的名字)的数据进行批量绑定。
例子:DECLARETYPE int_table_type IS TABLE OF INTEGER INDEX BY BINARY_INTEGER;--声明索引表类型,其中的数--据类型为integer,索引表类型是PLSQL表类型的一种TYPE varchar2_table_type IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER; --声明索引表类型,--其中的数据类型为varchar2(20)name_table varchar2_table_type;--用声明的索引表类型声明变量,即声明一个PLSQL表id_table int_table_type; --用声明的索引表类型声明变量,即声明另一个PLSQL表BEGINFOR i IN1..100000 LOOPid_table(i) := i;--为PLSQL表赋值name_table(i) := 'aaa' || i;--为另一个PLSQL表赋值END LOOP;FORALL i IN1..100000 INSERT INTO intest VALUES(id_table(i),name_table(i));-- 将PLSQL表--id_table和name_table下标为i的数据插入到intest表中,这里i从1到100000END;/语法二:(用于下标不连续的情况)forall i in indices of collection [between lower and upper] sql_statement;解释:对PLSQL表中下标为i(i的取值范围为indices取得的collection(PLSQL表)的所有下标值,同时i在范围为lower到upper之间,包括边界)的数据进行批量绑定。
oracle动态 sql 方法
oracle动态 sql 方法Oracle动态SQL方法简介Oracle数据库提供了一系列方法来处理动态SQL。
动态SQL是一种可以在运行时构建和执行的SQL语句。
它可以根据不同的条件和变量来生成不同的查询,从而实现更灵活和可扩展性的数据库操作。
在本文中,我们将详细介绍一些常用的Oracle动态SQL方法,并提供示例代码来说明每种方法的用法和效果。
1. EXECUTE IMMEDIATE语句EXECUTE IMMEDIATE语句是Oracle中最常用的动态SQL方法之一。
它允许我们在运行时执行一个动态的SQL字符串。
以下是EXECUTE IMMEDIATE语句的基本语法:EXECUTE IMMEDIATE dynamic_sql_string;其中,dynamic_sql_string是一个包含动态SQL语句的字符串。
示例下面是一个使用EXECUTE IMMEDIATE语句查询员工表中特定部门的示例:DECLAREsql_string VARCHAR;department_id NUMBER := 10;BEGINsql_string := 'SELECT * FROM employees WHERE departmen t_id = ' || department_id;EXECUTE IMMEDIATE sql_string;END;上述示例中,sql_string是一个包含动态SQL的字符串,我们将department_id变量的值拼接到字符串中,从而实现根据不同部门查询的动态效果。
2. 使用BIND变量为了提高动态SQL的执行效率和安全性,我们可以使用BIND变量代替直接在SQL语句中拼接变量值。
BIND变量以冒号(:)开头,表示在运行时由程序提供变量值。
以下是一个使用BIND变量的示例:DECLAREdynamic_sql_string VARCHAR := 'SELECT * FROM employees WHERE department_id = :dept_id';department_id NUMBER := 10;BEGINEXECUTE IMMEDIATE dynamic_sql_string USING department_ id;END;在上述示例中,:dept_id是一个BIND变量,它在运行时将被department_id的值替代。
动态SQL详解
动态SQL详解动态SQL在之前⽤户所编写的PL/SQL程序时有⼀个最⼤的特点:就是所操作的数据库对象(例如:表)必须存在,否则创建的⼦程序就会出问题,⽽这样的操作在开发之中被称为静态SQL操作,⽽动态SQL操作可以让⽤户在定义程序时不指定具体的操作对象,⽽在执⾏时动态的传⼊所需要的数据库对象,从⽽使程序变得更加的灵活。
创建⼀个功能,输⼊表名,输出表中有多少⾏,若没有这个表,则创建这个表。
⾸先禁⽤所有触发器GRANT CREATE ANY TABLE TO SCOTTcreate or replace function get_table_count_fun(p_table_name varchar2) return number asv_sql_statement varchar2(200);--定义操作的SQL语句v_count number;--保存表中记录beginselect count(*) into v_count from user_tables where table_name=UPPER(p_table_name);if v_count=0 then--数据表不存在v_sql_statement:='CREATE TABLE '|| p_table_name ||'(id number ,name varchar2(30) not null)';--创建数据表,注意此处不要忽略空格,按照正常写create table语句的格式加空格,否则⽆法识别execute immediate v_sql_statement;--执⾏动态SQLend if;v_sql_statement:=' select count(*) from '|| p_table_name;--查询数据表记录,注意加空格execute immediate v_sql_statement into v_count;--执⾏动态SQL并保存数据记录return v_count;end;/declarev1 varchar2(100);beginv1:=get_table_count_fun('t100');--查看t100表dbms_output.put_line(v1);end;/EXECUTE IMMEDIATE语句在动态SQL之中EXECUTE IMMEDIATE是最为重要的执⾏命令,使⽤此语句可以⽅便的在PL/SQL程序之中执⾏DML(INSERT/UPDATE/DELETE/单列SELECT)、DDL(CREATE/ALTER/DROP)、DCL(GRANT/REVOKE)语句,EXECUTE IMMEDIATE语法定义如下:EXECUTE IMMEDIATE 动态SQL字符串 [[BULK COLLECT]] INTO ⾃定义变量,...|记录类型|[USING [IN | OUT |IN OUT|绑定参数,...][[RETURNING | RETURN][BULK COLLECT] INTO 绑定参数,...];EXECUTE IMMEDIATE由以下三个主要字句组成:INTO:保存动态SQL执⾏结果,如果返回多⾏记录可以通过BULK COLLECT设置批量保存;USING:⽤来为动态SQL设置占位符设置内容;RETURNING | RETURN:两者使⽤效果⼀样,是取得更新表记录被影响的数据,通过BULK COLLECT来设置批量绑定。
『ORACLE』PLSQL动态游标的使用(11g)
『ORACLE』PLSQL动态游标的使⽤(11g)#静态游标指的是程序执⾏的时候不需要再去解析sql语⾔,对于sql语句的解析在编译的时候就可以完成的。
动态游标由于含有参数,对于sql语句的解析必须要等到参数确定的时候才能完成。
从这个⾓度来说,静态游标的效率也⽐动态游标更⾼⼀些。
#游标的相关概念: 定义: 游标它是⼀个服务器端的存储区,这个区域提供给⽤户使⽤,在这个区域⾥ 存储的是⽤户通过⼀个查询语句得到的结果集,⽤户通过控制这个游标区域当中 的指针来提取游标中的数据,然后来进⾏操作。
实质: 是⽤户在远程客户端上对服务器内存区域的操作,由数据库为⽤户提供这样的 ⼀个指针,使得⽤户能够去检索服务器内存区的数据。
#游标具有的属性:1、%ISOPEN(确定游标是否已经打开 true or false)2、%FOUND(返回是否从结果集提取到了数据 true or false)3、%NOTFOUND(返回是否从结果集没有提取到数据 true or false)4、%ROWCOUNT(返回到当前为⽌已经提取到的实际⾏数)#游标分类⼀、静态游标1、隐式游标:对于select..into...语句,⼀次只能从数据库中获取到⼀条数据,对于这种类型的DML SQL语句,就是隐式cursorselect update/insert/delete操作2、显⽰游标:由程序员定义和管理,对于从数据库中提取多⾏数据,就需要使⽤显式cursor1)定义游标---cursor [cursor name] is2)打开游标---open [cursor name]3)操作数据---fetch [cursor name]4)关闭游标---close [cursor name]⼆、REF游标1、REF 游标:动态关联结果集的临时对象。
即在运⾏的时候动态决定执⾏查询。
2、REF 游标作⽤:实现在程序间传递结果集的功能,利⽤REF CURSOR也可以实现BULK SQL,从⽽提⾼SQL性能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3 ERP
SQL>
建存储过程,并编译通过:
create or replace procedure proc_dbms_sql_update
(
id number,
name varchar2
)as
v_cursor number; --定义光标
v_string varchar2(200); --字符串变量
ID NAME
1 dinya
在上例中,本地动态SQL执行DML语句时使用了using子句,按顺序将输入的值绑定到变量,如果需要输出参数,可以在执行动态SQL的时候,使用RETURNING INTO 子句,如:
declare
p_id number:=1;
v_count number;
create or replace procedure proc_test
(
table_name in varchar2, --表名
field1 in varchar2, --字段名
datatype1 in varchar2, --字段类型
field2 in varchar2, --字段名
dbms_sql.bind_variable(v_cursor,’:p_name’,name); --绑定变量
dbms_sql.bind_variable(v_cursor,’:p_id’,id); --绑定变量
v_row:=dbms_sql.execute(v_cursor); --执行动态SQL
execute immediate str_sql; --动态执行DDL语句
exception
when others then
null;
end ;
以上是编译通过的存储过程代码。下面执行存储过程动态建表。
SQL> execute proc_test(’dinya_test’,’id’,’number(8) not null’,’name’,’varchar2(100)’);
dbms_sql.close_cursor(v_cursor); --关闭光标
exception
when others then
dbms_sql.close_cursor(v_cursor); --关闭光标
raise;
end;
执行过程,根据用户输入的参数更新表中的数据:
SQL> execute proc_dbms_sql_update(2,’csdn_dinya’);
dbms_sql.parse(v_cursor,v_string,dbms_sql.native); --分析语句
v_row:=dbms_sql.execute(v_cursor); --执行语句
dbms_sql.close_cursor(v_cursor); --关闭光标
exception
datatype2 in varchar2 --字段类型
) as
str_sql varchar2(500);
begin
str_sql:=’create table ’||table_name||’(’||field1||’ ’||datatype1||’,’||field2||’ ’||datatype2||’)’;
二、使用DBMS_SQL包
使用DBMS_SQL包实现动态SQL的步骤如下:A、先将要执行的SQL语句或一个语句块放到一个字符串变量中。B、使用DBMS_SQL包的parse过程来分析该字符串。C、使用DBMS_SQL包的bind_variable过程来绑定变量。D、使用DBMS_SQL包的execute函数来执行语句。
本文适宜读者范围:Oracle初级,中级
系统环境:
OS:windows 2000 Professional (英文版)
Oracle:8.1.7.1.0
正文:
一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使用动态SQL来实现。
1、使用DBMS_SQL包执行DDL语句
需求:使用DBMS_SQL包根据用户输入的表名、字段名及字段类型建表。
create or replace procedure proc_dbms_sql
(
table_name in varchar2, --表名
field_name1 in varchar2, --字段名
v_row number; --行数
begin
v_cursor:=dbms_sql.open_cursor; --为处理打开光标
v_string:=’create table ’||table_name||’(’||field_name1||’ ’||datatype1||’,’||field_name2||’ ’||datatype2||’)’;
v_row number; --行数
begin
v_cursor:=dbms_sql.open_cursor; --为处理打开光标
v_string:=’update dinya_test2 a set =:p_name where a.id=:p_id’;
dbms_sql.parse(v_cursor,v_string,dbms_sql.native); --分析语句
PL/SQL开发中动态SQL的使用方法
内容摘要:在PL/SQL开发过程中,使用SQL,PL/SQL可以实现大部份的需求,但是在某些特殊的情况下,在PL/SQL中使用标准的SQL语句或DML语句不能实现自己的需求,比如需要动态建表或某个不确定的操作需要动态执行。这就需要使用动态SQL来实现。本文通过几个实例来详细的讲解动态SQL的使用。
begin
v_string:=’select count(*) from table_name a where a.id=:id’;
execute immediate v_string into v_count using p_id;
end ;
更多的关于。
exception
when others then
null;
end ;
执行存储过程,插入数据到测试表中。
SQL> execute proc_insert(1,’dinya’);
PL/SQL procedure successfully completed
SQL> select * from dinya_test;
PL/SQL procedure successfully completed
SQL> select * from dinya_test2;
ID NAME
1 Oracle
2 csdn_dinya
3 ERP
SQL>
执行过程后将第二条的name字段的数据更新为新值csdn_dinya。这样就完成了使用dbms_sql包来执行DML语句的功能。
总结说明:
在Oracle开发过程中,我们可以使用动态SQL来执行DDL语句、DML语句、事务控制语句及系统控制语句。但是需要注意的是,PL/SQL块中使用动态SQL执行DDL语句的时候与别的不同,在DDL中使用绑定变量是非法的(bind_variable(v_cursor,’:p_name’,name)),分析后不需要执行DBMS_SQL.Bind_Variable,直接将输入的变量加到字符串中即可。另外,DDL是在调用DBMS_SQL.PARSE时执行的,所以DBMS_SQL.EXECUTE也可以不用,即在上例中的v_row:=dbms_sql.execute(v_cursor)部分可以不要。
Oracle中动态SQL可以通过本地动态SQL来执行,也可以通过DBMS_SQL包来执行。下面就这两种情况分别进行说明:
一、本地动态SQL
本地动态SQL是使用EXECUTE IMMEDIATE语句来实现的。
1、本地动态SQL执行DDL语句:
需求:根据用户输入的表名及字段名等参数动态建表。
NAME VARCHAR2(100) Y
SQL>
2、使用DBMS_SQL包执行DML语句
需求:使用DBMS_SQL包根据用户输入的值更新表中相对应的记录。
查看表中已有记录:
SQL> select * from dinya_test2;
ID NAME
1 Oracle
使用DBMS_SQL中,如果要执行的动态语句不是查询语句,使用DBMS_SQL.Execute或DBMS_SQL.Variable_Value来执行,如果要执行动态语句是查询语句,则要使用DBMS_SQL.define_column定义输出变量,然后使用DBMS_SQL.Execute, DBMS_SQL.Fetch_Rows, DBMS_SQL.Column_Value及DBMS_SQL.Variable_Value来执行查询并得到结果。
PL/SQL procedure successfully completed
SQL> desc dinya_test2;
Name Type Nullable Default Comments
---- ------------- -------- ------- --------
ID NUMBER(8)
首先我们应该了解什么是动态SQL,在Oracle数据库开发PL/SQL块中我们使用的SQL分为:静态SQL语句和动态SQL语句。所谓静态SQL指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。