Oracle+PlSql存储过程 学习文档
- 格式:doc
- 大小:136.50 KB
- 文档页数:18
Oracle数据库存储过程技术文档目录前言 (3)第一章oracle存储过程概述 (4)1.1 存储过程基本结构(PROCEDURE) (5)1.1.1创建存储过程 (5)1.1.2 存储过程删除 (6)1.1.3 调用存储过程 (6)1.2存储函数(FUNCTIONE) (7)1.2.1 创建存储函数 (8)1.2.2 删除存储函数 (8)1.3 包(package) (9)1.3.1 包的基本结构 (9)1.3.2 包的创建 (9)1.3.3 调用包中元素 (10)1.3.4 包的修改和删除 (10)第二章oracle存储过程基础――PL/SQL (11)2.1 pl/sql基础 (11)2.1.1 PL/SQL简介 (11)2.1.2 一个简单的PL/SQL块 (12)2.1.3 PL/SQL流程控制 (15)2.2 游标(CURSOR) (19)2.2.1 游标的概念 (19)2.2.2 游标的属性 (19)2.2.3 游标中FOR循环的使用 (21)2.2.4 带参数游标的使用方法 (22)2.3 动态SQL语句 (22)2.4 例外处理 (24)2.5 一个完整的PL/SQL实例 (26)第三章oracle存储过程讨论 (27)3.1 函数(FUNCTION) (27)3.1.1 用户函数创建,编译,删除 (27)3.1.2 参数传递 (28)3.2 存储过程 (30)3.3 包 (31)3.3.1 创建包 (31)3.3.2 删除包 (31)3.3.3 应用举例 (32)3.4 UTL_FILE包的使用 (34)3.4.1 文件控制: (35)3.4.2 文件输出: (35)3.4.3 文件输入: (36)3.4.4 应用举例 (36)4.1 Wrapper应用 (36)第四章存储过程运行环境 (37)4.1 存储过程以及PL/SQL执行环境 (37)4.1.1 SQL*PLUS环境 (37)4.1.2 Pro*c预编译环境 (38)4.2 存储过程调试方法 (39)4.2.1 SQL*PLUS环境中显示错误 (39)4.2.2 插入测试表调试存储过程 (40)4.2.3 DBMS_OUTPUT系统内置包 (41)附录一sql*plus工具 (42)附录1.1 sql*plus启动和关闭 (42)附录1.2 sql*plus 环境设置 (43)附录1.3 设置环境参数 (43)附录1.4 sqlplus命令的执行 (44)附录1.5 sql*plus编辑命令 (44)前言本文编写目的:本文对ORACLE存储过程,存储函数,包作了一个概括性的介绍,以实例为驱动介绍了存储过程,存储函数,包的语法,数据类型以及程序开发编写的方法。
PL/SQL程序设计包游标。
第一章PL/SQL 程序设计简介 (3)§1.2 SQL与PL/SQL (3)§1.2.1 什么是PL/SQL? (3)§1.2.1 PL/SQL的好处 (3)§1.2.2 PL/SQL 可用的SQL语句 (4)§1.3 运行PL/SQL程序 (4)第二章PL/SQL块结构和组成元素 (5)§2.1 PL/SQL块 (5)§2.2 PL/SQL结构 (5)§2.3 标识符 (5)§2.4 PL/SQL 变量类型 (6)§2.4.1 变量类型 (6)§2.4.2 复合类型 (7)§2.4.3 使用%ROWTYPE (9)§2.4.4 PL/SQL 表(嵌套表) (9)§2.5 运算符和表达式(数据定义) (10)§2.5.1 关系运算符 (10)§2.5.2 一般运算符 (10)§2.5.3 逻辑运算符 (11)§2.6 变量赋值 (11)§2.6.1 字符及数字运算特点 (11)§2.6.2 BOOLEAN 赋值 (11)§2.6.3 数据库赋值 (11)§2.6.4 可转换的类型赋值 (12)§2.7 变量作用范围及可见性 (12)§2.8 注释 (13)§2.9 简单例子 (13)§2.9.1 简单数据插入例子 (13)§2.9.2 简单数据删除例子 (13)第三章PL/SQL流程控制语句 (14)§3.1 条件语句 (14)§3.2 CASE 表达式 (15)§3.3 循环 (15)§3.3 标号和GOTO (17)§3.4 NULL 语句 (17)第四章游标的使用 (19)§4.1 游标概念 (19)§4.1.1 处理显式游标 (19)§4.1.2 处理隐式游标 (23)§4.1.3 关于NO_DATA_FOUND 和%NOTFOUND的区别 (24)§4.1.4 游标修改和删除操作 (24)第五章异常错误处理 (26)§5.1 异常处理概念 (26)§5.1.1 预定义的异常处理 (26)§5.1.2 非预定义的异常处理 (27)§5.1.3 用户自定义的异常处理 (28)§5.2 在PL/SQL 中使用SQLCODE, SQLERRM (29)第六章存储函数和过程 (31)§6.1 引言 (31)§6.2 创建函数 (31)§6.3 存储过程 (35)§6.3.1 创建过程 (35)§6.3.2 调用存储过程 (36)§6.3.3 AUTHID (38)§6.3.4 开发存储过程步骤 (38)§6.3.5 删除过程和函数 (39)第七章包的创建和应用 (40)§7.1 引言 (40)§7.2 包的定义 (40)§7.3 包的开发步骤 (41)§7.4 包定义的说明 (41)§7.5 子程序重载 (49)§7.6 删除包 (51)§7.7 包的管理 (51)第八章触发器 (52)§8.1 触发器类型 (52)§8.1.1 DML触发器 (52)§8.1.2 替代触发器 (52)§8.1.3 系统触发器 (52)§8.2 创建触发器 (53)§8.2.1 触发器触发次序 (54)§8.2.2 创建DML触发器 (54)§8.2.3 创建替代(INSTEAD OF)触发器 (54)§8.2.3 创建系统事件触发器 (56)§8.2.4 系统触发器事件属性 (57)§8.2.5 使用触发器谓词 (57)§8.2.6 重新编译触发器 (57)§8.3 删除和使能触发器 (58)第一章PL/SQL 程序设计简介PL /SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE 数据库进行访问。
PLSQL--存储过程 1.在开发程序中,为了⼀个特定的业务功能,会向数据库进⾏多次连接关闭连接(连接和关闭数据库是很耗费资源的),需要对数据库进⾏多次I/O读写,性能⽐较低。
如果把这些业务放到PLSQL中,在应⽤程序中只需要调⽤PLSQL就可以做到连接关闭⼀次数据库就可以实现我们的业务,可以⼤⼤提⾼效率。
2.ORACLE官⽅给出的解释:能够让数据库操作的不要放在程序中,在数据库实现基本不会出错,在程序操作中可能会出错,(如果在数据库中操作,可以有⼀点的⽇志恢复等功能) 3.语法1create or replace procedure过程名称[(参数列表)]is2begin345end过程名称;3.3⽆参存储1create or replace procedure p_a is2begin3 dbms_output.put_line('hello world');4end p_a;调⽤存储:1begin2-- Call the procedure3 p_a;4end;运⾏结果:在SQLPLUS通过exce调⽤3.4 带输⼊参数的存储过程1--查询并打印员⼯号7839的姓名和薪⽔2--存储过程,要求:调⽤的时候传⼊员⼯编号,⾃动控制打印3create or replace procedure p_query(i_empno IN emp.empno%TYPE) as4--声明变量5 v_ename emp.ename%TYPE;6 v_sal emp.sal%TYPE;7begin8SELECT ename,sal INTO v_ename,v_sal FROM emp WHERE empno = i_empno;9--打印变量10 DBMS_OUTPUT.PUT_LINE('姓名:'|| V_ENAME ||'薪⽔:'|| V_SAL);11end p_query;调⽤:1begin2-- Call the procedure3 p_query(7839);4end;结果:3.4带输⼊输出的存储过程1--查询并打印员⼯号7839的姓名和薪⽔2--存储过程,要求:调⽤的时候传⼊员⼯编号,⾃动控制打印3create or replace procedure p_shuchu(i_empno IN emp.empno%TYPE,o_sal OUT emp.sal%TYPE) as 4--声明变量5 v_ename emp.ename%TYPE;6 v_sal emp.sal%TYPE;7begin8SELECT sal INTO o_sal FROM emp WHERE empno = i_empno;9--打印变量10END ;调⽤:1DECLARE2--声明变量3 v_sal emp.sal%TYPE;4begin5-- Call the procedure67 p_shuchu(7839,v_sal);8 dbms_output.put_line('薪⽔:'||v_sal);9end;运⾏结果:。
oracle_PL_SQL学习笔记(sql与触发器、存储过程等)Oracle学习笔记李铁峰(2003-01-10)这篇笔记主要总结了机械工业出版社的《Oracle8 PL/SQL程序设计》的主要语法和内置函数部分1第一章PL/SQL简介1.1 块结构(Block)DECLARE --declarative section/*声明部分,声明变量(variables)、类型(types)、游标(cursors)和局部子程序*/BEGIN --executable section/*执行部分,放置过程性语句(procedural statement)*或SQL语句(SQL statemnet)。
*这是主体,是必须的。
*/EXCTPTION --exception section/*错误处理部分*/END; //“;”很关键,不要忘记1.2 变量和类型(variables and types)支持各种常用的数据库类型,还支持用户自定义类型,如表(table)、记录(record)。
还支持对象类型。
1.3 注释(comment)Oracle的PL/SQL支持"--"和“/* */”的注释风格。
2第二章PL/SQL基础2.1 PL/SQL块匿名块(anonymous)动态生成,只执行一次。
带名块(named)是带有标签的匿名块,动态生成,只执行一次。
子程序(subprogram)是存储在数据库内部的过程、函数和包。
可多次执行。
触发器(trigger)是存储在数据库内部的带名块,可多次执行。
由触发事件(triggering event)来触发。
2.2 词法单位(lexical unit)包括标识符(identifier)、分界符(delimiter)、文字(literal)和注释(comment)2.2.1标识符(identifier)PL/SQL对大小写不敏感。
最长30位。
a)保留字(reserved word)或关键字(keyword),保留字单独使用时是保留的,但可以出现在其他标识符的内部。
(1)SEQNAME.NEXTV AL里面的值如何读出来?可以直接在insert into test values(SEQNAME.NEXTV AL) 是可以用这样:SELECT tmp#_seq.NEXTV ALINTO id_tempFROM DUAL; 然后可以用id_temp(2)PLS-00103: 出现符号">"在需要下列之一时:代码如下:IF (sum>0)THENbeginINSERT INTO emesp.tp_sn_production_logV ALUES (r_serial_number, , id_temp);EXIT;end;一直报sum>0 这是个很郁闷的问题因为变量用了sum 所以不行,后改为i_sum>0(3)oracle 语法1. Oracle应用编辑方法概览答:1) Pro*C/C++/... : C语言和数据库打交道的方法,比OCI更常用;2) ODBC3) OCI: C语言和数据库打交道的方法,和ProC很相似,更底层,很少用;4) SQLJ: 很新的一种用Java访问Oracle数据库的方法,会的人不多;5) JDBC6) PL/SQL: 存储在数据内运行, 其他方法为在数据库外对数据库访问;2. PL/SQL答:1) PL/SQL(Procedual language/SQL)是在标准SQL的基础上增加了过程化处理的语言;2) Oracle客户端工具访问Oracle服务器的操作语言;3) Oracle对SQL的扩充;4. PL/SQL的优缺点答:优点:1) 结构化模块化编程,不是面向对象;2) 良好的可移植性(不管Oracle运行在何种操作系统);3) 良好的可维护性(编译通过后存储在数据库里);4) 提升系统性能;第二章PL/SQL程序结构1. PL/SQL块答:1) 申明部分, DECLARE(不可少);2) 执行部分, BEGIN...END;3) 异常处理,EXCEPTION(可以没有);2. PL/SQL开发环境答:可以运用任何纯文本的编辑器编辑,例如:VI ;toad很好用3. PL/SQL字符集答:PL/SQL对大小写不敏感4. 标识符命名规则答:1) 字母开头;2) 后跟任意的非空格字符、数字、货币符号、下划线、或# ;3) 最大长度为30个字符(八个字符左右最合适);5. 变量声明答:语法V ar_name type [CONSTANT][NOT NULL][:=value];注:1) 申明时可以有默认值也可以没有;2) 如有[CONSTANT][NOT NULL], 变量一定要有一个初始值;3) 赋值语句为“:=”;4) 变量可以认为是数据库里一个字段;5) 规定没有初始化的变量为NULL;第三章1. 数据类型答:1) 标量型:数字型、字符型、布尔型、日期型;2) 组合型:RECORD(常用)、TABLE(常用)、V ARRAY(较少用)3) 参考型:REF CURSOR(游标)、REF object_type4) LOB(Large Object)2. %TYPE答:变量具有与数据库的表中某一字段相同的类型例:v_FirstName studengts.first_name%TYPE;3. RECORD类型答:TYPE record_name IS RECORD( /*其中TYPE,IS,RECORD为关键字,record_name 为变量名称*/field1 type [NOT NULL][:=expr1], /*每个等价的成员间用逗号分隔*/field2 type [NOT NULL][:=expr2], /*如果一个字段限定NOT NULL,那么它必须拥有一个初始值*/... /*所有没有初始化的字段都会初始为NULLfieldn type [NOT NULL][:=exprn]);4. %ROWTYPE答:返回一个基于数据库定义的类型DECLAREv_StuRec Student%ROWTYPE; /*Student为表的名字*/注:与3中定一个record相比,一步就完成,而3中定义分二步:a. 所有的成员变量都要申明; b. 实例化变量;5. TABLE类型答:TYPE tabletype IS TABLE OF type INDEX BY BINARY_INTEGER;例:DECLARETYPE t_StuTable IS TABLE OF Student%ROWTYPE INDEX BY BINARY_INTERGER;v_Student t_StuTable;BEGINSELECT * INTO v_Student(100) FROM Student WHERE id = 1001;END;注:1) 行的数目的限制由BINARY_INTEGER的范围决定;6. 变量的作用域和可见性答:1) 执行块里可以嵌入执行块;2) 里层执行块的变量对外层不可见;3) 里层执行块对外层执行块变量的修改会影响外层块变量的值;第四章1. 条件语句答:IF boolean_expression1 THEN...ELSIF boolean_expression2 THEN /*注意是ELSIF,而不是ELSEIF*/... /*ELSE语句不是必须的,但END IF;是必须的*/ELSE...END IF;2. 循环语句答:1) Loop...IF boolean_expr THEN /* */EXIT; /* EXIT WHEN boolean_expr */END IF; /* */END LOOP;2) WHILE boolean_expr LOOP...END LOOP;3) FOR loop_counter IN [REVERSE] low_blound..high_bound LOOP...END LOOP;注:a. 加上REVERSE 表示递减,从结束边界到起始边界,递减步长为一;b. low_blound 起始边界; high_bound 结束边界;3. GOTO语句答:GOTO label_name;1) 只能由内部块跳往外部块;2) 设置标签:<<label_name>>3) 示例:LOOP...IF D%ROWCOUNT = 50 THENGOTO l_close;END IF;...END LOOP;<<l_close>>;...4. NULL语句答:在语句块中加空语句,用于补充语句的完整性。
PLSQL中的存储过程和函数PLSQL中的存储过程和函数语法:create [or replace] procedure procedure_name[(parament1 [model1] datatype1,parament2 [model2] datatype2,...)]is|asPL/SQL Block;举例:create or replace procedure raise_salary(p_id in employees.employee_id%type)isbeginupdate employeesset salary = salary * 1.10where employee_id = p_id;end;PLSQL存储过程d额参数模式:+ in 默认模式,⽤于把值传给过程;参数可以是常量、变量、表达式;可以赋予默认值+ out 必须显式指定;⽤于把值从过程返回给调⽤环境;必须是个变量;不能赋予默认值+ in out 必须显式指定;⽤于把变量传给过程,并返回给调⽤环境;必须是个变量;不能赋予默认值参数传递⽅式 ( 按顺序传递 或者 使⽤=>符号传递 ) :create or replace procedure query_emp(p_id in employees.employee_id%type,p_name out st_name%type,p_salary out employeees.salary%type,p_comm out mission_pct%type )beginselect last_name,salary,commission_pctinto p_name,p_salary,p_commfrom employeeswhere employee_id = p_id;end query_emp;PLSQL存储函数:CREATE OR REPLACE FUNCTION get_sal(p_id in number) RETURN NUMBER ISv_salary NUMBER;BEGINSELECT salaryINTO v_salaryFROM employeesWHERE employee_id = p_id;RETURN v_salary;END get_sal;调⽤:select get_sal(100) from dual;。
Oracl e 存储过程目录Oracle 存储过程 (1)Oracle存储过程基础知识 (1)Oracle存储过程的基本语法 (2)关于Oracle存储过程的若干问题备忘 (4)1. 在Oracle中,数据表别名不能加as。
(4)2. 在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。
(5)3. 在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no datafound"异常。
(5)4. 在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错 (5)5. 在存储过程中,关于出现null的问题 (5)6. Hibernate调用Oracle存储过程 (6)用Java调用Oracle存储过程总结 (6)一、无返回值的存储过程 (6)二、有返回值的存储过程(非列表) (8)三、返回列表 (9)在存储过程中做简单动态查询 (11)一、本地动态SQL (12)二、使用DBMS_SQL包 (13)Oracle存储过程调用Java方法 (16)Oracle高效分页存储过程实例 (17)Oracle存储过程基础知识商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。
存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。
这样的结果就是,代码存储一次但是能够被多个程序使用。
要创建一个过程对象(procedural object),必须有CREATE PROCEDURE 系统权限。
如果这个过程对象需要被其他的用户schema 使用,那么你必须有CREATE ANY PROCEDURE 权限。
执行procedure 的时候,可能需要excute权限。
或者EXCUTE ANY PROCEDURE 权限。
如果单独赋予权限,如下例所示:grant execute on MY_PROCEDURE to Jelly调用一个存储过程的例子:execute MY_PROCEDURE( 'ONE PARAMETER');存储过程(PROCEDURE)和函数(FUNCTION)的区别。
function有返回值,并且可以直接在Query中引用function或者使用function的返回值。
本质上没有区别,都是PL/SQL 程序,都可以有返回值。
最根本的区别是:存储过程是命令, 而函数是表达式的一部分。
比如:select max(NAME) FROM但是不能exec max(NAME) 如果此时max是函数。
PACKAGE是function,procedure,variables 和sql 语句的组合。
package允许多个procedure使用同一个变量和游标。
创建procedure的语法:可以使用create or replace procedure 语句,这个语句的用处在于,你之前赋予的excute 权限都将被保留。
IN, OUT, IN OUT用来修饰参数。
IN 表示这个变量必须被调用者赋值然后传入到PROCEDURE进行处理。
OUT 表示PRCEDURE 通过这个变量将值传回给调用者。
IN OUT 则是这两种的组合。
authid代表两种权限:定义者权限(difiner right 默认),执行者权限(invoker right)。
定义者权限说明这个procedure中涉及的表,视图等对象所需要的权限只要定义者拥有权限的话就可以访问。
执行者权限则需要调用这个procedure的用户拥有相关表和对象的权限。
Oracle存储过程的基本语法将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)例子:8.用pl/sql developer debug连接数据库后建立一个Test WINDOW在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试9.Pl/Sql中执行存储过程提交,类似于DP中FORMS_DDL语句,在此语句中str是不能换行的,只能通过连接字符"||",或着在在换行时加上"-"连接字符。
关于Oracle存储过程的若干问题备忘1.在Oracle中,数据表别名不能加as。
如:select a.appname from appinfo a;-- 正确select a.appname from appinfo as a;-- 错误也许,是怕和Oracle中的存储过程中的关键字as冲突的问题吧2.在存储过程中,select某一字段时,后面必须紧跟into,如果sel ect整个记录,利用游标的话就另当别论了。
select af.keynode into knfrom APPFOUNDATION afwhere af.appid=aid and af.foundationid=fid; -- 有into,正确编译select af.keynodefrom APPFOUNDATION afwhere af.appid=aid and af.foundationid=fid;-- 没有into,编译报错,提示:Compilation Error: PLS-00428: an INTO clause is expected in this SELECT statement3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。
可以在该语法之前,先利用select count(*) from 查看数据库中是否存在该记录,如果存在,再利用select...into...4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错select keynode into kn from APPFOUNDATION where appid=aid and foundationid=fid;-- 正确运行select af.keynode into kn from APPFOUNDATION af where af.appid=appid and af.foundationid =foundationid;-- 运行阶段报错,提示:ORA-01422:exact fetch returns more than requested number of rows5.在存储过程中,关于出现null的问题create table A(id varchar2(50) primary key not null,vcount number(8) not null,bid varchar2(50) not null -- 外键);如果在存储过程中,使用如下语句:select sum(vcount) into fcount from A where bid='xxxxxx';如果A表中不存在bid="xxxxxx"的记录,则fcount=null(即使fcount定义时设置了默认值,如:fcount number(8):=0依然无效,fcount还是会变成null),这样以后使用fcount时就可能有问题,所以在这里最好先判断一下:if fcount is null thenfcount:=0;end if;这样就一切ok了。
6.Hibernate调用Oracle存储过程用Java调用Oracl e存储过程总结一、无返回值的存储过程例: 存储过程为(当然了,这就先要求要建张表TESTTB,里面两个字段(I_ID,I_NAME)。
二、有返回值的存储过程(非列表)注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。
三、返回列表由于Oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,1.建一个程序包。
如下:2.在Java里调用时就用下面的代码:在这里要注意,在执行前一定要先把Oracle的驱动包放到class路径里,否则会报错的。
在存储过程中做简单动态查询在存储过程中做简单动态查询代码 ,例如:一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL 语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使用动态SQL来实现。
首先我们应该了解什么是动态SQL,在Oracle数据库开发PL/SQL块中我们使用的SQL 分为:静态SQL语句和动态SQL语句。
所谓静态SQL指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。
而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。
编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。
Oracle中动态SQL可以通过本地动态SQL来执行,也可以通过DBMS_SQL包来执行。
下面就这两种情况分别进行说明:一、本地动态SQL本地动态SQL是使用EXECUTE IMMEDIATE语句来实现的。
1、本地动态SQL执行DDL语句:需求:根据用户输入的表名及字段名等参数动态建表。
到这里,就实现了我们的需求,使用本地动态SQL根据用户输入的表名及字段名、字段类型等参数来实现动态执行DDL语句。
2、本地动态SQL执行DML语句。
需求:将用户输入的值插入到上例中建好的dinya_test表中。
执行存储过程,插入数据到测试表中。
在上例中,本地动态SQL执行DML语句时使用了using子句,按顺序将输入的值绑定到变量,如果需要输出参数,可以在执行动态SQL的时候,使用RETURNING INTO 子句,如:二、使用DBMS_SQL包使用DBMS_SQL包实现动态SQL的步骤如下:A、先将要执行的SQL语句或一个语句块放到一个字符串变量中。
B、使用DBMS_SQL包的parse过程来分析该字符串。
C、使用DBMS_SQL包的bind_variable过程来绑定变量。