在Oracle存储过程中使用string

时间:2014-11-10 06:14:50

标签: oracle

当我只编写一个像

这样的代码的查询时
Select * from ..
where ...
AND    gfcid in ( select regexp_substr('1005771621,1001035181'||',','\d+',1,level)
        from dual
      connect by level <= (select max(length('1005771621,1001035181')-length(replace('1005771621,1001035181',',')))+1
                             from dual) )

有效。

但我想在oracle存储过程中进行动态查询。我确实喜欢这个:

GDFCID_STRING := ' select regexp_substr('
           || '1005771621,1001035181'
           || ','
           || ','
           || '\d+'
           || ',1,level) from dual connect by level <= (select max(length('
           || '1005771621,1001035181'
           || ')-length(replace('
           || '1005771621,1001035181'
           || ','
           || ','
           || ')))+1 from dual)';

Select * from ..  
where ...
AND    gfcid in (GDFCID_STRING)

但现在确实有效。

2 个答案:

答案 0 :(得分:2)

据我所知,你需要一个方法来接受以逗号分隔的字符串作为输入,将其分解为整数集合,然后将数字(读取:整数)与此集合中的值进行比较。

Oracle主要提供三种类型的collections - varraysnested tablesassociative arrays。我将解释如何将逗号分隔的字符串转换为嵌套表,并使用它来查询或比较。

首先,您需要在架构中定义对象类型。只有在架构级别定义查询时,才能使用此类型编写查询。

CREATE OR REPLACE TYPE entity_id AS OBJECT (id_val NUMBER(28));
/

CREATE OR REPLACE TYPE entity_id_set IS TABLE OF entity_id;
/

接下来,定义一个这样的函数:

FUNCTION comma_to_nt_integer (p_comma_delimited_str IN VARCHAR)
    RETURN entity_id_set IS
    v_table     entity_id_set;
BEGIN
    WITH temp AS (SELECT TRIM(BOTH ',' FROM p_comma_delimited_str) AS str FROM DUAL)
        SELECT ENTITY_ID(TRIM (REGEXP_SUBSTR (t.str,
                                    '[^,]+',
                                    1,
                                    LEVEL)))
                   str
          BULK COLLECT INTO v_table
          FROM temp t
    CONNECT BY INSTR (str,
                      ',',
                      1,
                      LEVEL - 1) > 0;

    RETURN v_table;
END comma_to_nt_integer;

您已完成此任务所需的DDL。现在,您只需将查询编写为:

SELECT *
  FROM ..  
 WHERE ...
       AND gfcid in (table(comma_to_nt_integer(GDFCID_STRING)));

答案 1 :(得分:1)

一般情况下,您可以使用

execute immediate v_your_sql_code;

在PL / SQL中执行动态SQL,但是根据你的问题,我真的不知道你想做什么。

编辑:

y_your_sql_code := 'Select yourColumn from ..  where ...AND  gfcid in ('||GDFCID_STRING||')';

execute immediate v_your_sql_code into v_result;

您必须在正确的数据类型中定义v_result,如果需要更多结果列,可以使用多个结果变量,如果可以检索多行,则需要复杂类型