我有这张桌子:
CREATE TABLE TEST
(
DEP_CODIGO_UNIDAD NUMBER(4),
XPTO NUMBER(4)
)
我想在pl:
上执行此操作select * from TEST where DEP_CODE in (4102, 3201, 8540,...,2010)
这可以使用SQL,但作为PL函数,我收到ora-01722无效数字
我的功能如下:
FUNCTION REL_TEST(vCeco IN VARCHAR2,
errorCode OUT NUMBER) RETURN CURSOR IS
OPEN CURSOR (bla bla) ...
for
select * from TEST where DEP_CODE in (vCeco)
有什么想法吗?我顺便使用Oracle 11g。
答案 0 :(得分:3)
当你这样做时:
select * from TEST where DEP_CODE in (vCeco)
你的变量vCeco是一个字符串,例如值为4102, 3201, 8540
,就像你写的那样:
select * from TEST where DEP_CODE in ('4102, 3201, 8540')
(只是字符串在绑定变量中。)
然后尝试将字符串值'4102, 3201, 8540'
隐式转换为一个号码,因为逗号是值的一部分 >,因此引发了例外。
执行动态IN
列表有很多选择。您可以在这里找到一系列方法:
http://oracle-base.com/articles/misc/dynamic-in-lists.php
选择最适合您设置的解决方案。
答案 1 :(得分:1)
如果你给自己发送一个以逗号分隔的值列表,可以试试动态sql吗? (我也会对一个也有OUT参数的函数提出问题,但那是另一个样式点)
FUNCTION rel_test( v_ceco IN VARCHAR2
,errorCode OUT NUMBER)
RETURN sys_refcursor
IS
l_cursor sys_refcursor;
BEGIN
OPEN l_cursor for 'SELECT * from TEST where dep_Code in ('||v_ceco||')';
RETURN l_Cursor;
END;