使用数字的字符串(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中的多少