使用数字的字符串(Varchar2)作为数字

时间:2014-07-23 10:27:44

标签: oracle plsql

我有一个以varchar2形式接受输入的现有过程。 该输入字段实际上是一组以逗号分隔的数字,例如' 1,2,3'或者' 2,3'等

现在在程序中,想要在IN子句中使用这些数字,如:

PROCEDURE SAVE_SETTING (p_category_list   IN VARCHAR2)
IS

BEGIN


UPDATE my_table
SET status = 'ACTIVE'
  WHERE category_id IN ( p_category_list );

END;

现在my_table的category_id列是Number数据类型。 所以我必须将p_category_list转换为一组数字才能有效地进行查询:

 UPDATE my_table
    SET status = 'ACTIVE'
      WHERE category_id IN ( 1,2,3);

而不是

 UPDATE my_table
    SET status = 'ACTIVE'
      WHERE category_id IN ( '1,2,3');

我不想使用Dynamic sql(Execute Immediate)

有助于实现这一目标吗?

5 个答案:

答案 0 :(得分:0)

Dynamic SQL会在这里为您提供帮助:

PROCEDURE SAVE_SETTING (p_category_list   IN VARCHAR2)
IS

BEGIN

  EXECUTE IMMEDIATE 'UPDATE my_table
                       SET status = ''ACTIVE''
                         WHERE category_id IN ( ' || p_category_list || ' )';

END;

答案 1 :(得分:0)

您应该尝试以下方法: - (这有助于在存储过程中使用逗号分隔列表作为'in'子句。无需动态查询)

UPDATE my_table
  SET status = 'ACTIVE'
   WHERE category_id in 
   (select ltrim(rtrim(regexp_substr(p_category_list,'[^,]+', 1, level)))   
    from dual connect by ltrim(rtrim(regexp_substr(p_category_list, '[^,]+', 1, level)))    
  is not null)));

答案 2 :(得分:0)

Hi This is just an example how you can effectively use the update.

SET serveroutput ON;
DECLARE
  p_list VARCHAR2(100);
  my_list dbms_sql.number_table;
BEGIN
  p_list:=('1,2,3,4,5,6,7,8,9');             --Your Input
  SELECT regexp_substr(p_list,'[^,]+', 1, level) bulk collect -- used to collect each input as number
  INTO my_list
  FROM dual
    CONNECT BY regexp_substr(p_list, '[^,]+', 1, level) IS NOT NULL;
  forall i IN my_list.first..my_list.last
  UPDATE emp SET mgr = my_list(i) WHERE deptno = 10;--update statement
  dbms_output.put_line('working');
END;

答案 3 :(得分:0)

如果您不想使用动态SQL,可以使用like

UPDATE my_table
  SET status = 'ACTIVE'
  WHERE ',' || p_category_list || ',' like '%,' || category_id || ',%';

请注意每边的额外分隔符,以确保110不匹配。

答案 4 :(得分:0)

我会编写一个小函数,它通过p_category_list返回一个VARRAY,在函数单独的​​p_category_list中以你想要的方式返回,并在此过滤而不是在UPDATE中的p_category_list