版权声明:本文为博主原创文章,转载请标明出处(http://blog.csdn.net/wlwlwlwl015)Thanks.
前言
简单描述一下场景,在Oracle的一个存储过程中遍历一个Cursor,然后在循环中需要用到in查询语句,而in里面的条件正是游标当前行的一个的字段值类型为字符串,形如:
而存储过程中又自然而然的写了这样的语句(重点第四行):
select count(*) into current_hjnum from t_studentinfo
where kslbdm_ = 1
and hjstreet_ = everyrow.streetcode_
and hjdoornum_ in (everyrow.num_)
and areacode_ = everyrow.householdareaid_
and bmflag_>=5;
然而并查询不出结果,将上面的游标属性替换成具体值再查询的话就可以查出来,究竟是什么原因呢?下面具体研究一下。
字符串与结果集
首先打个断点调试一下(注意PLSQL调试断点是点step out,而且断点不能打在注释行):
鼠标放在everyrow.num_上查看发现并没有问题,那是什么原因导致查询不到数据呢?仔细想一下突然恍然大悟,in关键字后面如果是动态的条件通常需要一个类型匹配的结果集,而我这里从游标当前行取出的值是字符串,也就是说sql其实是这样的:
... and hjdoornum_ in ('2,3,4,6,8') and ...
而并非是预想的:
... and hjdoornum_ in (2,3,4,6,8) and ...
所以这个代码写的有点想当然了,需要把in中的条件返回一个字符串拆分后的结果集才行,然而Oracle中并没有直接的split函数(这一点postgresql做的很强大),所以我们必须想办法自定义一个过程或者函数来实现split(字符串分割),其实也很简单,下面看一下具体实现。
创建SPLIT函数
首先需要创建一个Oracle类型(Type):
CREATE OR REPLACE TYPE strsplit_type IS TABLE OF VARCHAR2 (4000);
接下来就是实现SPLIT函数:
CREATE OR REPLACE FUNCTION str_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
RETURN strsplit_type
IS
j INT := 0;
i INT := 1;
len INT := 0;
len1 INT := 0;
str VARCHAR2 (4000);
str_split1 strsplit_type := strsplit_type ();
BEGIN
len := LENGTH (p_str);
len1 := LENGTH (p_delimiter);
WHILE j < len
LOOP
j := INSTR (p_str, p_delimiter, i);
IF j = 0
THEN
j := len;
str := SUBSTR (p_str, i);
str_split1.EXTEND;
str_split1 (str_split1.COUNT) := str;
IF i >= len
THEN
EXIT;
END IF;
ELSE
str := SUBSTR (p_str, i, j - i);
i := j + len1;
str_split1.EXTEND;
str_split1 (str_split1.COUNT) := str;
END IF;
END LOOP;
RETURN str_split1;
END str_split;
最后验证一下:
可以看到已经正确的将字符串分割并返回了结果集,最后把存储过程中的语句修改一下即可
selectcount(*) into current_hjnum from t_studentinfo where kslbdm_ = 1and hjstreet_ = everyrow.streetcode_ and hjdoornum_ in (select * fromtable(strsplit(everyrow.num_))) and areacode_ = everyrow.householdareaid_ and bmflag_>=5;
总结
简单记录一下这个小坑,希望对遇到类似问题的朋友有所帮助,The End。
相关推荐
Oracle 自定义日期函数 Oracle 日期处理函数是数据库管理系统中非常重要的一部分,最近看到有人在做 T-SQL 与 PL/SQL 的转化,问了些有关时间函数的处理。在 PL/SQL 中,Oracle 提供了其他的方法来处理日期函数,...
Oracle 中实现 Split 函数功能 Oracle 中实现 Split 函数功能是指在 Oracle 数据库中实现类似于 C# 等编程语言中的 Split 函数,用于拆分字符的功能。下面是实现 Oracle 中 Split 函数功能的详细介绍。 首先,...
* 自定义聚合函数 wmsys.wm_concat 替换办法 * 超大字符串拼接,单个字符串4000、分隔符100,可拼出超4000的超长字符串 * 可自定义指定分隔符separator * 可自定义指定排序字段sequence,对于数字或日期类型的...
Oracle 自定义聚合函数-分析函数 Oracle 自定义聚合函数是一种强大且灵活的功能,允许用户根据自己的需求创建自定义的聚合函数。聚合函数是一种特殊的函数,它可以对一组数据进行处理和计算,并返回一个结果。 ...
在IT行业中,数据库管理系统(DBMS)如...总结来说,这个Oracle自定义函数是针对统一社会信用代码的效验工具,遵循国家的效验规则,确保在数据库中存储的USCC信息的准确无误,这对于在中国进行合规操作的企业至关重要。
oracle存储过程中入参是逗号分隔,并且参数要使用在in过滤语句中查询数据。处理的方法与实现
7、高效字段拆分:此函数能够迅速将字段中的多个值按逗号或其他自定义分隔符拆分成独立的行,极大地简化了对复合字段的操作过程。 使用场景: 商品分类管理:当您的商品分类信息存储在一个字段中时,此函数可以帮助...
Oracle没有提供split函数,但可以自己建立一个函数实现此功能。比如“abc defg hijkl nmopqr stuvw xyz”,分隔符是空格,但空格个数不定。 源代码: CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR...
在Oracle数据库中,并没有内置的split函数来处理字符串的分割操作。然而,在实际应用中,经常需要将一个包含多个值的字符串按照指定的分隔符进行拆分,转换为表格式的数据,以便进行进一步的处理或查询。为此,可以...
总的来说,通过自定义的`job_split`函数,我们不仅能够根据指定的分隔符拆分字符串,还可以根据工号查询关联表获取对应的员工姓名,如果工号不存在于关联表中,则返回原始的工号,实现了题目所要求的功能。这个函数...
ORACLE 用户自定义异常小例子 1.进入pl/sql测试窗口 2.执行语句 declare empname varchar2(255); customize_exp EXCEPTION; –自定义异常 begin FOR c IN (select d.* from scott.dept d) ...
1. **Oracle存储过程**: 存储过程是预编译的SQL语句集合,存储在数据库服务器上,可以被多次调用。它们允许开发人员封装复杂的业务逻辑,减少网络流量,提高执行速度。存储过程可以有输入、输出或 inout 参数,...
本文将详细讲解如何在C#中使用自定义列表(List)作为参数调用Oracle存储过程,以及实现这一功能的关键技术和注意事项。 首先,我们需要了解Oracle数据库中的PL/SQL类型,例如VARCAR2、NUMBER等,它们对应于C#中的...
CREATE PROCEDURE 语句是用来创建 Oracle 存储过程的语句,变量声明是用来声明变量的语句,控制语句是用来控制流程的语句,循环语句是用来循环执行的语句。 关于 Oracle 存储过程的若干问题备忘 在学习 Oracle ...
1、加密强度升级: 使用 DES 加密标准,确保数据在传输过程中的安全性,有效防止数据被窃取或篡改,敏感数据做到脱敏。 2、数据脱敏:通过加密处理,针对敏感字段进行智能化脱敏处理,既保护了数据隐私,又不影响...
通过学习和实践这些Oracle存储过程和函数的实例,你可以更好地理解和掌握如何在实际项目中应用它们。Oracle 存储过程详解.doc文档可能包含了更多详细的步骤和示例,建议详细阅读,以深化对这一主题的理解。
大数据量,返回值虽然是CLOB,依然会报错; CLOB变量需要dbms_lob.createtemporary,临时表空间中,建立临时LOB。 大数据量,返回值虽然是CLOB,依然会报错; CLOB变量需要dbms_lob.createtemporary,临时表空间中,...
1. 参数类型匹配:确保Java中的参数类型与Oracle存储过程或函数中的参数类型一致,否则可能导致转换异常。 2. 注意游标处理:有些存储过程可能返回游标,需要特别处理。 3. 事务管理:根据业务需求,可能需要手动...
### Oracle存储过程、游标、函数的详解 #### 一、概述 在Oracle数据库中,存储过程、游标和函数是非常重要的组成部分,它们为数据库管理提供了强大的编程能力。通过学习这些概念,我们可以更加灵活地管理和操作...
在Oracle数据库中,由于内置函数不直接支持像Java中的`split`那样拆分字符串并返回数组,因此开发者需要自定义函数来实现这一功能。这里提到的两种方法都是为了解决这个问题,即根据指定的分隔符将字符串拆分为一个...