Мне нужно перенести хранимую процедуру Oracle (PL/SQL) в PostgreSQL (pl/pgsql). Я не могу понять, как это сделать.Как перенести процедуру Oracle PL/SQL в PostgreSQL
Procedure Check_File (strLine in varchar2 , lngRecord in number) is
type tab_str is table of varchar2(500) index by binary_integer;
tabline tab_str;
intp1 integer;
intp2 integer;
intsize integer;
begin
-- Split line into table
intp1 := 1 ;
intp2 := instr (strline , ';' , intp1) ;
intsize := 0;
while intp2 != 0 loop
intsize := intsize + 1 ;
tabline(intsize) := trim(substr (strLine , intp1 , intp2-intp1));
intp1 := intp2 + 1 ;
intp2 := instr (strline , ';' , intp1) ;
end loop;
intsize := intsize + 1 ;
tabline(intsize) := trim(substr (strLine , intp1));
if intsize <> 23 then
utl_file.put_line (olog , 'Block - Record ' || lngRecord || ' - Incorrect number of fields') ;
raise oExcept;
end if;
end;
это то, что я сделал:
CREATE OR REPLACE FUNCTION Check_File (strLine in text , lngRecord in bigint) RETURNS VOID AS $body$
DECLARE
intp1 integer;
intp2 integer;
intsize integer;
-- CREATE TYPE tab_str AS (tab2 text[]);
tabline tab_str;
BEGIN
-- Split line into table
intp1 := 1 ;
intp2 := instr (strline , ';' , intp1) ;
intsize := 0;
while intp2 != 0 loop
intsize := intsize + 1 ;
tabline(intsize) := trim(substring(strLine from intp1 for intp2-intp1));
intp1 := intp2 + 1 ;
intp2 := instr (strline , ';' , intp1) ;
end loop;
intsize := intsize + 1 ;
tabline(intsize) := trim(substring(strLine from intp1));
if intsize <> 23 then
utl_file.put_line (olog , 'Block - Record ' || lngRecord || ' - Incorrect number of fields') ;
raise oExcept;
end if;
END;
$body$
LANGUAGE PLPGSQL;
Я думаю, что расщепление линии можно сделать намного проще в Postgres с помощью простой 'tabline: = string_to_array (strline, ';')'. Если вы ищете эквивалент 'utl_file', вы можете использовать расширение orafce: https://github.com/orafce/orafce –