PROCEDURE create_dept
(new_dname IN CHAR(14),
new_loc IN CHAR(13),
new_deptno OUT NUMBER(2)) IS
BEGIN
SELECT deptno_seq.NEXTVAL INTO new_deptno FROM dual;
INSERT INTO dept VALUES (new_deptno, new_dname, new_loc);
END create_dept;
其中的IN/OUT,表示参数模式 。IN是传递参数值到过程,而OUT是从过程传递参数值到调用者 。
但是,如果使用这些扩展的功能,也会造成同其他数据库厂商的嵌入SQL的不兼容 。
4.3 动态SQL语句
4.3.1 ORACLE动态SQL语句的一些特点
ORACLE DBMS进入市场的时间早于DB2,其动态SQL支持是以IBM的system/R原型为基础的 。因此,ORACLE支持的动态SQL与IBM的DB2标准有不同 。虽然ORACLE和DB2在很大程度上是兼容的,但是在使用参数标志、SQLDA格式及支持数据类型转换等方面都有差异 。
DB2中不允许在PREPARE的动态语句中引用宿主变量,而是用问号来标志语句中的参数,然后用EXECUTE或OPEN语句来规定参数值 。ORACLE允许用户用宿主变量规定动态语句中的参数 。
而且,ORACLE支持的DESCRIBE语句同DB2有一些区别 。如:
从已经PREPARE后的动态查询语句中获得对查询结果列的信息的语句为:
EXEC SQL DESCRIBE SELECT LIST FOR qrystmt INTO qry_sqlda;
等价于DB2的:
EXEC SQL DESCRIBE qrystmt INTO qry_sqlda;
从已经PREPARE后的动态查询语句中获得对查询参数的说明的语句为:
EXEC SQL DESCRIBE BIND LIST FOR qrystmt INTO qry_sqlda;
该ORACLE语句没有对应的DB2语句 。用户只能按照当前需要的参数和SQLDA的结构对SQLDA赋值 。然后再在OPEN语句或EXECUTE语句中使用SQLDA结构 。
4.3.2 使用动态SQL的四种方法
使用动态SQL,共分成四种方法:方法 支持的SQL语句1 该语句不包含宿主变量,该语句不是查询语句
2 该语句包含输入宿主变量 ,该语句不是查询语句
3 包含已知数目的输入宿主变量或列的查询
4 包含未知数目的输入宿主变量或列的查询
l方法1:使用EXECUTE IMMEDIATE命令实现,具体语法为:
EXEC SQL EXECUTE IMMEDIATE { :host_string | string_literal };
其中,host_variable和string是存放完整T-SQL语句 。
请看下面这个例子 。这个例子的作用是执行用户随意输入的合法的SQL语句 。
char dyn_stmt[132];
...
for (;;)
{
printf("Enter SQL statement: ");
gets(dyn_stmt);
if (*dyn_stmt == "")
break;
/* dyn_stmt now contains the text of a SQL statement */
EXEC SQL EXECUTE IMMEDIATE :dyn_stmt;
}
...
EXECUTE IMMEDIATE命令的作用是:分析该语句的语法,然后执行该语句 。方法1适合于仅仅执行一次的语句 。
l方法2:方法支持的语句可以包含输入宿主变量 。这个语句首先做PREPARE操作,然后通过EXECUTE执行 。PREPARE语句的语法为:
EXEC SQL PREPARE statement_name FROM { :host_string | string_literal };
该语句接收含有SQL语句串的宿主变量,并把该语句送到ORACLE 。ORACLE编译语句并生成执行计划 。在语句串中包含一个“?”表明参数,当执行语句时,ORACLE需要参数来替代这些“?” 。PREPRARE执行的结果是,DBMS用语句名标志准备后的语句 。在执行SQL语句时,EXECUTE语句后面是这个语句名 。EXECUTE语句的语法为:
EXECUTE 语句名 USING 宿主变量 | DESCRIPTOR 描述符名
它的作用是,请求ORACLE执行PREPARE语句准备好的语句 。当要执行的动态语句中包含一个或多个参数标志时,在EXECUTE语句必须为每一个参数提供值 。这样的话,EXECUTE语句用宿主变量值逐一代替准备语句中的参数标志(“?”或其他占位符),从而,为动态执行语句提供了输入值 。
使用主变量提供值,USING子句中的主变量数必须同动态语句中的参数标志数一致,而且每一个主变量的数据类型必须同相应参数所需的数据类型相一致 。各主变量也可以有一个伴随主变量的指示符变量 。当处理EXECUTE语句时,如果指示符变量包含一个负值,就把NULL值赋予相应的参数标志 。除了使用主变量为参数提供值,也可以通过SQLDA提供值 。
推荐阅读
- kha苹果是什么版本
- 荒野乱斗九游版激活码在哪
- HTC U11国行版系统更新了什么?HTC U11国行版系统更新内容
- 小米MIX2黑色陶瓷版和全陶瓷尊享版哪个好?哪个更划算?
- 增补版 SCO UNIX快速入门
- 小米MIX2黑色陶瓷版上手怎么样?小米黑色陶瓷版多少钱?
- 小米全陶瓷尊享版有哪些颜色?小米全陶瓷尊享版哪个颜色更好看?
- K700新版软件R2AY004试用手记
- 小米Note3吴亦凡限量版什么时候发布?
- ESQL编程使用说明
