IN运算符不同类型的参数

时间:2015-01-28 17:52:40

标签: sql oracle

我有这张桌子:

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。

2 个答案:

答案 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;