Переписать часть кода с Oracle до PostgreSQL - PullRequest
0 голосов
/ 23 марта 2020

У меня есть скрипт для Oracle. Я не знаю, как эта часть скрипта должна быть перемещена в PostgreSQL.

Я переписываю функцию, генерирующую первичный ключ, в PostgreSQL. Можете ли вы помочь мне?

Oracle код:

cGet cursor(pTABLE_NAME NVARCHAR2) is
 select OBJECT_ID
   from SYS_OBJECT
 where OBJECT_NAME = lower(pTABLE_NAME);

Как написать это на PostgreSQL?

Полный код:

CREATE OR REPLACE function mySchema.genPrimKey(pTABLE_NAME NVARCHAR2) return NVARCHAR2 is


xResult   NVARCHAR2(10);
  xNextVal  NUMBER;
  xSQL      VARCHAR2(1000);

  lcRegistr1 NVARCHAR2(1);
  ...

  lnRegistr1 NUMBER;
  ...

   cursor cGet(pTABLE_NAME  NVARCHAR2) is
     select OBJECT_ID
       from SYS_OBJECT
      where OBJECT_NAME = lower(pTABLE_NAME);

   rGet        cGet%ROWTYPE;   

   TYPE tArray is table of NVARCHAR2(1) index by binary_integer;
   xArrayLV tArray;

begin
  open cGet(pTABLE_NAME);
  fetch cGet into rGet;
  close cGet;

  if (rGet.Object_Id is null) then
    raise eObjNull;
  end if;

  xSQL:='select SEQ$'||upper(replace(trim(pTABLE_NAME),'_'))||'.nextval from dual';

  execute immediate xSQL into xNextVal;

  if (xNextVal is null) then
    raise eNextVal;
  end if;

  if (62 * 62 * 62 * 62 * 62) < xNextVal then
   raise eExtend;
  end if;

  lcRegistr1:= '0';
 ...

  lnRegistr1:= 0;
 ...


  xArrayLV( 1):= '0';
  xArrayLV( 2):= '1';
  ...
  xArrayLV(61):= 'y';
  xArrayLV(62):= 'z';

  --look 5 registr
  IF (1 * 62 * 62 * 62 * 62) < xNextVal then
    FOR i in 1..62 loop
      IF (i * 62 * 62 * 62 * 62) < xNextVal  then
        lnRegistr1:= i * 62 * 62 * 62 * 62;
        lcRegistr1:= xArrayLV(i + 1);
      end if;
    end loop;
  END IF;

  xNextVal:= xNextVal - lnRegistr1; 

  ....

  xResult:= lcRegistr1 || lcRegistr2 || lcRegistr3 || lcRegistr4 || lcRegistr5;

  return rGet.Object_Id||'!'||xResult;

  exception
   ...
end genPrimKey;

Если вам нужно - я могу отправить вам скрипт по электронной почте. Это Oracle код, и я должен переписать его на PostgreSQL, но я не понял эту часть.

1 Ответ

0 голосов
/ 23 марта 2020

Курсор не нужен:

if not exists (select * from pg_tables where tablename = lower(ptable_name)) then
   raise 'Table % not found', lower(ptable_name);
end if;

(очень) грубый перевод кода PL / SQL, возможно, будет примерно таким.

CREATE OR REPLACE function mySchema.genPrimKey(pTABLE_NAME text) 
  returns text
  language plpgsql
as
$body$
declare
  xResult   VARCHAR(10);
  xNextVal  integer;

  lcRegistr1 char1(1);
  ...

  lnRegistr1 NUMBER;
  ...
  xArrayLV char(1)[];
begin
  if not exists select * from pg_tables where tablename = lower(ptable_name) then
    raise 'Table % not found', ptable_name;
  end if;

  xNextval := nextval('SEQ$'||upper(replace(trim(pTABLE_NAME),'_')))

  if (xNextVal is null) then
    raise 'Sequence % not found', 'SEQ$'||upper(replace(trim(pTABLE_NAME),'_';
  end if;

  if (62 * 62 * 62 * 62 * 62) < xNextVal then
   raise 'Value too large';
  end if;

  lnRegistr1:= 0;

  xarraylv := array['0','1','2', .... , 'z'];

  --look 5 registr
  IF (1 * 62 * 62 * 62 * 62) < xNextVal then
    FOR i in 1..62 loop
      IF (i * 62 * 62 * 62 * 62) < xNextVal  then
        lnRegistr1:= i * 62 * 62 * 62 * 62;
        lcRegistr1:= xArrayLV[i + 1];
      end if;
    end loop;
  END IF;

  xNextVal:= xNextVal - lnRegistr1; 

  ....

  xResult:= lcRegistr1 || lcRegistr2 || lcRegistr3 || lcRegistr4 || lcRegistr5;

  return rGet.Object_Id||'!'||xResult;

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