Как разделить значение аргумента, переданное процедуре pl sql

Мое требование: пользователь передаст значение одному из входных параметров моей процедуры, и формат будет таким, как показано ниже.

"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? Может ли кто-нибудь помочь мне в этом?

Спасибо


person user2967784    schedule 06.05.2015    source источник


Ответы (3)


Подобный запрос сделает свое дело:

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))))

Идея состоит в том, чтобы извлечь каждое вхождение параметра для каждого уровня иерархического запроса.

person pablomatico    schedule 06.05.2015
comment
Это прерывается, если передается нулевой параметр (). В случае, если это может случиться. - person Gary_W; 06.05.2015

попробуй это

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;
person Nancy Guruswamy    schedule 06.05.2015
comment
Возможно, редактирование сломало это? Не возвращает желаемых результатов, как сейчас. Он не работает во встроенном пространстве. - person Gary_W; 06.05.2015

Делает подсчет, допуская возможный нулевой параметр. Не знаю, беспокоит это или нет:

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;
person Gary_W    schedule 06.05.2015
comment
Внесены изменения, чтобы показать, как можно сохранить двойные кавычки, включив их в группу. - person Gary_W; 07.05.2015