2016-10-03 2 views
0

Мне нужно перенести хранимую процедуру 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; 
+0

Я думаю, что расщепление линии можно сделать намного проще в Postgres с помощью простой 'tabline: = string_to_array (strline, ';')'. Если вы ищете эквивалент 'utl_file', вы можете использовать расширение orafce: https://github.com/orafce/orafce –

ответ

0

Кажется довольно просто.

  • Определите функцию с RETURNS void, если вам не нужно ничего возвращать.
  • Объявление tabline как text[] (массив text). См. Документацию how to handle arrays.
  • Используйте функции из модуля adminpack contrib для записи в файл на сервере базы данных.

The documentation поможет вам решить возникающие вопросы.

+0

спасибо за ваш ответ. я сделал это, но все еще имею проблему с синтаксисом табуляции «tabline (intsize)» .. – Kamfasage

+0

Вы должны «DECLARE tabline text [];'. Я немного расширил ответ. Вам нужно будет изменить код на синтаксис массива PostgreSQL. –

+0

да, я выяснил, в чем была проблема. Tabline должен быть массивом. поэтому я сделал это: tabline [intsize]: = trim (подстрока (strLine из intp1 для intp2-intp1)); У меня больше нет синтаксической ошибки. спасибо – Kamfasage