当我只编写一个像
这样的代码的查询时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)
但现在确实有效。
答案 0 :(得分:2)
据我所知,你需要一个方法来接受以逗号分隔的字符串作为输入,将其分解为整数集合,然后将数字(读取:整数)与此集合中的值进行比较。
Oracle主要提供三种类型的collections - varrays,nested tables和associative 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
,如果需要更多结果列,可以使用多个结果变量,如果可以检索多行,则需要复杂类型