如何拆分传递给pl sql过程的参数值

时间:2015-05-06 04:22:28

标签: plsql split arguments procedure

我的要求是,用户将值传递给我的一个程序输入参数,格式如下所示。

“XXX_Test,AL LDG,Test,Test,false,2,2”“XXX_Feps,IN LDG,Test1,Test1,false,3,2”“XXX_GPP,IN LDG,Test2,Test2,false,3,4 “”XXX_FGP,IN LDG,Test3,Test3,false,4,4“等等

这是单参数值,这里每个字符串值用空格分隔 [以上输入值将从CA Tool(调度工具)传递到我的pl sql过程的输入参数]

在pl sql过程中,我需要处理这个值,需要找出传递了多少个参数(用空格分隔的字符串)以及需要将属性值拆分成单独的字符串,如下所示

PARAM1 ="XXX_Test,AL LDG,Test,Test,false,2,2"  
PARAM2 ="XXX_Feps,IN LDG,Test1,Test1,false,3,2"  
PARAM3 ="XXX_GPP,IN LDG,Test2,Test2,false,3,4"  
PARAM4 ="XXX_FGP,IN LDG,Test3,Test3,false,4,4" 

在这种情况下,计数将为4(因为传递了4个字符串)

我们怎样才能在pl sql编程中实现这个要求?有人可以帮我这个吗?

由于

3 个答案:

答案 0 :(得分:1)

像这样的查询可以解决这个问题:

WITH params AS (
   SELECT '"XXX_Test,AL LDG,Test,Test,false,2,2" "XXX_Feps,IN  LDG,Test1,Test1,false,3,2" "XXX_GPP,IN LDG,Test2,Test2,false,3,4" "XXX_FGP,IN LDG,Test3,Test3,false,4,4"' param FROM DUAL
)
SELECT REGEXP_SUBSTR(param,'(".+?")',1,LEVEL)
FROM params
CONNECT BY  LENGTH(SUBSTR(param,DECODE(REGEXP_INSTR(param,'(".+?")',1,LEVEL),0,NULL,REGEXP_INSTR(param,'(".+?")',1,LEVEL)))) <= LENGTH(SUBSTR(param,DECODE(REGEXP_INSTR(param,'(".+?")',1,LEVEL),0,NULL,REGEXP_INSTR(param,'(".+?")',1,LEVEL))))

我们的想法是为层次结构查询的每个级别提取参数的每次出现

答案 1 :(得分:0)

试试这个

SELECT REGEXP_SUBSTR('"XXX_Test,AL LDG,Test,Test,false,2,2" "XXX_Feps,IN LDG,Test1,Test1,false,3,2" "XXX_GPP,IN LDG,Test2,Test2,false,3,4" "XXX_FGP,IN LDG,Test3,Test3,false,4,4"','[^ "" ]+', 1, level) 
FROM DUAL
CONNECT BY REGEXP_SUBSTR('"XXX_Test,AL LDG,Test,Test,false,2,2" "XXX_Feps,IN LDG,Test1,Test1,false,3,2" "XXX_GPP,IN LDG,Test2,Test2,false,3,4" "XXX_FGP,IN LDG,Test3,Test3,false,4,4" ', '[^ "" ]+', 1, level) is not null;

答案 2 :(得分:0)

是否计数,允许可能的空参数。不知道这是否是一个问题:

WITH params AS (
   SELECT '"XXX_Test,AL LDG,Test,Test,false,2,2" "" "XXX_GPP,IN LDG,Test2,Test2,false,3,4" "XXX_FGP,IN LDG,Test3,Test3,false,4,4"' param FROM DUAL
)
SELECT REGEXP_COUNT(param, '".*?"')
FROM params;

应用于拆分值,同时剥离双引号并保留NULL参数(假设你继续处理以逗号分隔的列表):

WITH params AS (
   SELECT '"XXX_Test,AL LDG,Test,Test,false,2,2" "" "XXX_GPP,IN LDG,Test2,Test2,false,3,4" "XXX_FGP,IN LDG,Test3,Test3,false,4,4"' param FROM DUAL
)
SELECT REGEXP_SUBSTR(param, '"(.*?)"', 1, LEVEL, NULL, 1)
FROM params
CONNECT BY  LEVEL <= REGEXP_COUNT(param, '".*?"');

编辑:我从你发布的另一个问题看到你需要保留双引号。在这种情况下,匹配模式应该是&#39;(&#34;。*?&#34;)&#39;

然后,在你有了param列表之后,如果你想解析它(也允许NULLS);这得到第五项例如:

SELECT REGEXP_SUBSTR('XXX_Test,,Test,Test,false,2,2', '([^,]*)(,|$)', 1, 5, NULL, 1)  from dual;