网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.解決 Export error ORA-31600.
.检查点.
.9i新特性之二安全篇.
.细化解析:Oracle数据库后台进程.
.oracle8i-系统结构的组件(入门篇.
.通过使用Oracle商务智能保持住了.
.Oracle数据库技术(7).
.Oracle客户穿越防火墙难题.
.Weblogic8配置Oracle数据库连接池.
.在Oracle 10g中创建Report Server.
.Oracle简化企业网格运算环境管理.
.Oracle9i Data Guard的灾难防护 .
.使用 SQL Server 时需要经常用到.
.数据库手册:速查Oracle函数列表.
.Oracle DBA 回滚段管理试题选.
.ORACLE *Graphics中不同类型图形.
.构建实用程序验证代码质量的内部.
.ORACLE中LONG类型字段的存取.
.linux显卡的配置(2).
.Oracle中怎样用自治事务保存日志.

PL/SQL中如何传递字符串变量给in

发表日期:2008-2-9


    一个简单的存储过程,传递字符串变量作为参数,传递给过程中的in 子句;但似乎不起作用 。 代码如下 CREATE OR REPLACE PROCEDURE WSREVSECT_5
pSectNos varchar2,
pRetCode OUT varchar2
) AS
nCount number;
BEGIN
SELECT count(fksrev) into nCount FROM SREVSECT
WHERE sectno IN (pSectNos ) /* as in 'abc', 'xyz', '012' */;
pRetCode:=to_char(ncount);
End it works -- the above is the same as where sectno = pSectNos though, not what you want. You want it to be: where sectno in ( 'abc', 'xyz', '012' ) NOT: where sectno in ( '''abc'', ''xyz'', ''012''' )     当直接使用select count(*) into .. from .. where sectno in (pSectNos) 的时候,相当于where sectno = pSectNos which is effectively is (else you could never search on a string with commas and
quotes and so on -- it is doing the only logical thing right now). You can do this: SQL> create or replace type myTableType as table
of varchar2 (255);
2 / Type created. ops$tkyte@dev8i> create or replace
function in_list( p_string in varchar2 ) return myTableType
2 as
3 l_string long default p_string ',';
4 l_data myTableType := myTableType();
5 n number;
6 begin
7 loop
8 exit when l_string is null;
9 n := instr( l_string, ',' );
10 l_data.extend;
11 l_data(l_data.count) :=
ltrim( rtrim( substr( l_string, 1, n-1 ) ) );
12 l_string := substr( l_string, n+1 );
13 end loop;
14
15 return l_data;
16 end;
17 / Function created. ops$tkyte@dev8i> select *
2 from THE
( select cast( in_list('abc, xyz, 012') as
mytableType ) from dual ) a
3 / COLUMN_VALUE
------------------------
abc
xyz
012 ops$tkyte@dev8i> select * from all_users where username in
2 ( select *
3 from THE ( select cast( in_list('OPS$TKYTE, SYS, SYSTEM')
as mytableType ) from dual ) )
4 / USERNAME USER_ID CREATED
------------------------------ ---------- ---------
OPS$TKYTE 23761 02-MAY-00
SYS 0 20-APR-99
SYSTEM 5 20-APR-99     使用array如上绑定变量in-list的时候,要注重sql语句的执行计划;因为在有的版本下,cbo无法估计in-list virtual table的行数,产生不正确的执行计划。
上一篇:精妙SQL语句介绍 人气:664
下一篇:SQL优化之操作符篇 人气:1094
浏览全部Oracle教程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐