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

Posted

技术标签:

【中文标题】如何拆分传递给pl sql过程的参数值【英文标题】:How to split argument value passed to pl sql procedure 【发布时间】:2015-05-06 04:22:27 【问题描述】:

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

"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编程中如何实现这个需求呢?有人可以帮我解决这个问题吗?

谢谢

【问题讨论】:

【参考方案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))))

这个想法是为层次查询的每个级别提取参数的每次出现

【讨论】:

如果传递了一个空参数 (""),则会中断。以防万一。【参考方案2】:

试试这个

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;

【讨论】:

也许编辑破坏了这个?不会像现在一样返回所需的结果。它在嵌入空间上失败。【参考方案3】:

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

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, '".*?"');

编辑:我从您发布的另一个问题中看到您需要保留双引号。在这种情况下,匹配模式应该是 '(".*?")'

然后,在你得到你的参数列表之后,如果你想解析它(也允许 NULLS);例如,这将获得第 5 项:

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

【讨论】:

进行了编辑以显示如何通过将双引号包含在组中来保留它们。

以上是关于如何拆分传递给pl sql过程的参数值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JDBC 将表值参数(类数组参数)传递给 Microsoft SQL Server 2008 R2 中的存储过程? [复制]

pl/sql 循环遍历表并将行的每个条目传递给存储过程

如何根据 PL/SQL 变量值检查输入参数值是不是存在作为列表?

将值列表作为输入参数传递给 PL/SQL 过程

odp.net 可以将参数传递给布尔 pl/sql 参数吗?

在 PL/SQL 存储过程中将多个变量传递给 WHERE 条件