2012-12-28 16 views
2

这是他的问题desc。 我想通过逗号分隔的整数值(存储在一个Varchar变量)到一个IN条件。Oracle无效数字错误,同时传递逗号分隔数字

local_var VARCHAR2(20); 
local_var := 1,2; 
WHERE someid IN (local_var) --Just pasted the where clause where IN condition is being used 

someid是NUMBER类型,

而在光标在执行该语句,我得到一个无效号码错误。我假设这个问题是因为someid是NUMBER, 可能的解决方案是什么?我不能通过值说1,2直接IN子句,因为我需要根据一些条件来建一样,

我试图通过逗号分隔值引号也没有似乎工作 使用Oracle版本11.2

我一直在使用

local_var := '1,2'; 
local_var := '''1','2'''; etc.. 

没有试过似乎

迫切需要帮助的工作!在此先感谢

+0

版本是11.2 – KeenUser

回答

3

你得到这个错误,很明显,因为someid是数字数据类型,你传递一个逗号分隔的字符串,它被认为是字符串数据类型的一个值,而不是一个列表如您所期望的那样,可以使用IN子句。但是您可以使用regexp_substrregexp_count正则表达式函数将该字符串转换为表格行,然后在IN子句中使用它们。这里有一个例子:

SQL> declare 
    2 cursor your_cursor(c_str_value varchar2) is 
    3  with str_values as( 
    4  select regexp_substr(c_str_value, '[^,]+', 1, level) as value 
    5   from dual 
    6  connect by level <= regexp_count(c_str_value, '[^,]+') 
    7  ) 
    8  select first_name -- here goes your query 
    9  from employees e 
10  where e.department_id in (select to_number(value) 
11         from str_values); 
12 
13 l_local_var varchar2(20); 
14 begin 
15 l_local_var := '100,102,103';  -- your comma separated string 
16 for i in your_cursor(l_local_var) -- for the sake of demonstration 
17 loop 
18  dbms_output.put_line(i.first_name); 
19 end loop; 
20 end; 
21/

Nancy 
Daniel 
John 
Ismael 
Jose Manuel 
Luis 

PL/SQL procedure successfully completed 
1

您可以不是传递列表作为参数。

你可以使用动态PL/SQL块。喜欢的东西:

DECLARE 
    local_var VARCHAR2(20) := '1,2'; 
    req VARCHAR(1000); 
BEGIN 
    req := 'BEGIN 
     FOR c IN (SELECT someid FROM my_table WHERE someid IN (' || local_var || ')) 
     LOOP 
      DBMS_OUTPUT.PUT_LINE('someid ' || c.someid); 
     END LOOP; 
    END;'; 
    EXECUTE IMMEDIATE req; 
END; 

但是......要非常小心PL/SQL注射。

0

您的变量类型是VARCHAR2,并且您正在分配数字类型,您是否会收到该错误。请使用单引号。

例如#

local_var VARCHAR2(20); 
local_var := '1'; 
WHERE someid IN (local_var); 
+0

我怎么使用这上面的实现建立逗号分隔值? – KeenUser

-1

这是所使用的方式

create table a(local_var varchar2(10)) 

insert into a values('2'); 

select * from a; 

declare 
y varchar2(10); 
cursor c1(v_val varchar2) is select * from a; 
Begin 
y := '1,2'; 
for i in c1(y) 
loop 
dbms_output.put_line(i.local_var); 
end loop ; 
end; 
/
相关问题