Расщепление строки в оракуле пл sql - PullRequest
0 голосов
/ 07 декабря 2011

У меня есть строка, разделенная запятыми, которая передается в хранимую процедуру из кода Java.

Например

Администратор, роль, пользователь

Теперь, как мне разбить эту строку и заполнить ее массивом в oracle PL / SQL

Второй вопрос: будет ли эта функция действительной, когда мы запустим ее на SQL-сервере?

Ответы [ 4 ]

2 голосов
/ 07 декабря 2011
function str2tbl      (p_str in varchar2,p_delim in varchar2 default '.') return myTableType
  is
      l_str        long default p_str || p_delim;
       l_n        number;
       l_data     myTableType := myTabletype();
  begin
       loop
           l_n := instr( l_str, p_delim );
           exit when (nvl(l_n,0) = 0);
          l_data.extend;
           l_data( l_data.count ) := ltrim(rtrim(substr(l_str,1,l_n-1)));
           l_str := substr( l_str, l_n+length(p_delim) );
     end loop;
     return l_data;
  end str2tbl;

Пример использования:

TYPE myTableType is table of varchar2(100);
v_array mytabletype;
v_array := str2tbl (string, ',');
1 голос
/ 07 декабря 2011

Хотя вы можете писать функции в каждой базе данных для анализа вашей строки, вы рискуете нарушить правила синтаксического анализа, если новые значения будут добавлены в будущем (в вашем случае, представьте себе, что некоторые решают добавить «Admin, Super» в качестве пользователя.лучший способ сделать это - использовать структуру, разработанную для этой цели.

В Oracle вы можете сделать следующее:

create type Varchar10List as table of varchar(10);

create function YourFunction (pRoles Varchar10List) as
...

Это не будет работать для SQL Server. SQLУ сервера есть параметры табличного типа, которые похожи, но они еще не поддерживаются Java.

Если вы хотите сделать это более обобщенно, вы можете передать список в виде очень простого XML. Почти вся база данныхНа этом этапе серверы интегрировали парсеры XML, поэтому преобразование XML в нечто более полезное было бы тривиально, независимо от того, используете ли вы Oracle или SQL Server.

0 голосов
/ 07 декабря 2011

Пожалуйста, попробуйте следующий запрос:

--Creating function
CREATE FUNCTION GetSplittedData( @dataToSplit VARCHAR(500) )
RETURNS VARCHAR(500)
AS
BEGIN
    RETURN (''''+REPLACE(@dataToSplit, ',', ''',''')+'''')
END

--Calling function with data
SELECT DBO.GetSplittedData('admin,role,user')

Обновление: это в соответствии с SQL Server

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...