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

Posted

技术标签:

【中文标题】使用数字的字符串(Varchar2)作为数字【英文标题】:Use a string(Varchar2) of number as number 【发布时间】:2014-07-23 10:27:44 【问题描述】:

我有一个接受 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');

我不想使用动态 sql(立即执行)

对实现这一点有什么帮助吗?

【问题讨论】:

您的 p_category_list 能否将输入值本身提供为 '1'、'2'、'3'? 我无法以任何方式更改输入。 【参考方案1】:
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;

【讨论】:

【参考方案2】:

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;

【讨论】:

我知道使用动态sql很容易,但我不想使用动态sql。【参考方案3】:

您应该尝试以下方法:- (这有助于在存储过程中使用逗号分隔的列表作为“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)));

【讨论】:

【参考方案4】:

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

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

注意每一边的额外分隔符,以确保1 不匹配10

【讨论】:

【参考方案5】:

我会编写一个小函数,它通过 p_category_list 返回一个 VARRAY,在函数中以您想要的方式分隔 p_category_list 并在 UPDATE 中通过这个而不是 p_category_list 过滤

【讨论】:

以上是关于使用数字的字符串(Varchar2)作为数字的主要内容,如果未能解决你的问题,请参考以下文章

varchar2存储汉字,英文字符,数字在oracle中的多少

varchar2存储汉字,英文字符,数字在oracle中的多少

如何在数字字段的条件下将逗号分隔的数字字符串传递给存储过程?

sql系列(基础篇)-前言 课前补充知识

varchar和varchar2的区别

mybatis jdbctype数据类型 有varchar2么