欢迎来到天天文库
浏览记录
ID:37855587
大小:35.00 KB
页数:4页
时间:2019-06-01
《Oracle过程中执行动态SQL或DDL语句》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、·如果你用的是Oracle8i及以上的版本,那简单,在过程中用executeimmediatesql_str就行,sql_str是一个拼凑的SQL语句,但这个动态语句中带参数,或Select的结果要into到变量中时就要稍加留心一下了。而在8i以前的版本(谁还用这么古老的玩艺,总有些不得已的地方,老系统考虑升级成本遗留下来的,应用软件所伴随着的等),都没法用executeimmediate,就得使用DBMS_SQL包来实现了 何谓动态SQL和DDL语句呢?通常在过程中要操作的表名、字段名都必须是明确的,否则编译过程时就要
2、报错,但如果这两者也用变量名来表示就是动态的。DDL就是数据库对象定义的操作,如CREATETABLE/VIEW/INDEX/SYN/CLUSTER……,及这些对象的删除、修改操作等等。 比如在Oracle中有执行下面过程块的意图时,就要使用到executeimmediate或是DBMS_SQL包了。当然下面的语句块是通不过的。declare col_namevarchar2(30):='name';--假定表user存在name字段 col_val varchar2(30);begin selectcol_
3、nameintocol_val--按照惯常思维,可能就会这么写 fromuserwhereagebetween18and25; --编译时会提示列名不存在的 droptablet2; --不能直接执行DDL语句,后面查询t2编译器就无能为力了end; 现在我们提出对上面问题的解,针对第一个Select语句来说明,并假设查询中还带有参数。块中的DDL也是类似的解法。例子因力图涵盖更多内容,所以稍显复杂,如果不需要into(如update/delete语句),或者不带参数,会简单多了,应不难简化。有两种处理
4、方法,以8i 为分水岭。 1.Oracle8i及以上版本的过程中处理动态SQL语句的办法declare v_col_namevarchar2(30):='name';--字段名name用变量来表示 v_user_name varchar2(30);--用户名称 v_user_age integer; --用户年龄 v_sql_str varchar2(500); --动态SQL语句begin v_sql_str:='select'
5、
6、v_col_name
7、
8、',agefromusers--字
9、段名后面不能紧随into到变量了 whereagebetween:start_ageand:end_ageandrownum=1';--两个命名参数 --用executeimmediate动态执行SQL语句 --注意其后的into字段值到变量的写法,还有using来代入参数 executeimmediatev_sql_strintov_user_name,v_user_ageusing18,25; dbms_output.put_line('第一个符合条件的用户:'
10、
11、v_u
12、ser_name
13、
14、',年龄:'
15、
16、v_user_age);end; 除此之外,在Oracle8i及以上版本中,还能用DBMS_UTILITY.EXEC_DDL_STATEMENT(ddl_sql_str)执行DDL语句。 2.Oracle8i以下版本相应解决之道,用DBMS_SQL包,如Oracle8.0.5中 如果也用executeimmediate的话编译过程时就会报如下错误: Error:PLS-00103:出现符号"IMMEDIATE"在需要下列之一时: :=.(@%; 符号":=在"IMM
17、EDIATE"继续之前已插入。 Line:3declare v_col_namevarchar2(30):='name';--字段名name用变量来表示 v_user_name varchar2(30);--用户名称 v_user_age integer; --用户年龄 v_sql_str varchar2(500); --动态SQL语句 v_cursorid integer;--游标ID v_dummy integer;--定义一个哑元变量begin v_sql_str:='s
18、elect'
19、
20、v_col_name
21、
22、',agefromusers--字段名后面不能紧随into到变量了 whereagebetween:start_ageand:end_age';--两个命名参数 v_cursorid:=dbms_sql.open
此文档下载收益归作者所有