powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как это переписать с Оракла на PostgreSQL?
18 сообщений из 18, страница 1 из 1
Как это переписать с Оракла на PostgreSQL?
    #34345927
alosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
function()
...
v_Operations.extend();
v_Operations(v_Operations.count) := v_CurrentOperation;

...
end;
...
Рейтинг: 0 / 0
Как это переписать с Оракла на PostgreSQL?
    #34345996
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aloshafunction()
...
v_Operations.extend();
v_Operations(v_Operations.count) := v_CurrentOperation;

...
end;Ну ты тогда расскажи местному сообществу, что в Оракле делает эта конструкция.
Тебя вообще учили тому, что программный код нужно анализировать в целом, а не построчно переводить его с одного языка на другой? Или не учили?
Приведенный тобой кусок - скорее всего, вырезка из цикла по заполнению данными PL/SQL-коллекции .
Скажи, многие ли программисты, работающие только с PostgreSQL знают о том, что есть такое "коллекция" в Оракле и как с ней работать в том же оракле, чтобы рассказать тебе, как переписать сей код с PL/SQL на PG/SQL? я думаю, что таких не найдется.
...
Рейтинг: 0 / 0
Как это переписать с Оракла на PostgreSQL?
    #34346044
alosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бабичев Сергей aloshafunction()
...
v_Operations.extend();
v_Operations(v_Operations.count) := v_CurrentOperation;

...
end;Ну ты тогда расскажи местному сообществу, что в Оракле делает эта конструкция.
Тебя вообще учили тому, что программный код нужно анализировать в целом, а не построчно переводить его с одного языка на другой? Или не учили?
Приведенный тобой кусок - скорее всего, вырезка из цикла по заполнению данными PL/SQL-коллекции .
Скажи, многие ли программисты, работающие только с PostgreSQL знают о том, что есть такое "коллекция" в Оракле и как с ней работать в том же оракле, чтобы рассказать тебе, как переписать сей код с PL/SQL на PG/SQL? я думаю, что таких не найдется.

Массив v_Operations поначалу пустой, поэтому мы не можем ему что то присвоить, поэтому в Оракле мы делаем так, что увеличиваем массив на еденицу. Затем мы еже непустому массиву можем сделать это присвоение v_Operations(v_Operations.count) := v_CurrentOperation, где v_CurrentOperation - это тоже массив.
...
Рейтинг: 0 / 0
Как это переписать с Оракла на PostgreSQL?
    #34346088
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aloshaМассив v_Operations поначалу пустой, поэтому мы не можем ему что то присвоить, поэтому в Оракле мы делаем так, что увеличиваем массив на еденицу. Затем мы еже непустому массиву можем сделать это присвоение v_Operations(v_Operations.count) := v_CurrentOperation, где v_CurrentOperation - это тоже массив.Вот я тебе и говорю - построчно переводить код нельзя. Нужно привести, как минимум, кусок с объявлением и инициализацией массива + тот кусок, что ты уже указал. Разъяснить на словах, что это именно работа с массивом, так же на словах рассказать, что именно за работа с массивом делается. Ведь не все же "многостаночники"
...
Рейтинг: 0 / 0
Как это переписать с Оракла на PostgreSQL?
    #34346108
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aloshaМассив v_Operations поначалу пустой, поэтому мы не можем ему что то присвоить, поэтому в Оракле мы делаем так, что увеличиваем массив на еденицу. Затем мы еже непустому массиву можем сделать это присвоение v_Operations(v_Operations.count) := v_CurrentOperation, где v_CurrentOperation - это тоже массив.насколько я помню, массиву постгрёвому размер не нужно предопределять. Т.ч. обозвав переменную массива можно пихать в нее скоко угодно членов. А вот с Null в постгре-массивах были сложности (попросту раньше не допускались) но кажецца с какой-то 8-ки должны быть допустимы.
...
Рейтинг: 0 / 0
Как это переписать с Оракла на PostgreSQL?
    #34346124
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теперь вопрос, у автора топика, в качестве элемента коллекции используется объектный тип или простой? (/topic/254078&hl=array)
...
Рейтинг: 0 / 0
Как это переписать с Оракла на PostgreSQL?
    #34346274
alosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
st_sergтеперь вопрос, у автора топика, в качестве элемента коллекции используется объектный тип или простой? (/topic/254078&hl=array)

привожу целиком функцию с Оракла:
function getOperations(
pStartID OPERATION.ID%TYPE,
pLIMIT NUMBER,
pNUMBER NUMBER
) return TYPES_PKG.REFCURSOR is
v_Operations T_OPERATION_TABLE := T_OPERATION_TABLE();
v_ReturnedOperations T_OPERATION_TABLE := T_OPERATION_TABLE();
c_Operation TYPES_PKG.REFCURSOR;
v_StartOpNumber NUMBER := 0;
i NUMBER;
cursor c_Operations is
select ID, OPERATION_TYPE_CODE, OP_NUMBER, AMOUNT, OP_CREATE_DATE
from OPERATION
where OP_NUMBER > v_startOpNumber
and (OP_NUMBER < pNUMBER or pNUMBER is NULL);
r_Operations OPERATION%ROWTYPE;
v_CurrentOperation T_OPERATION := T_OPERATION(NULL, NULL, NULL, NULL, NULL);
begin
if pStartID is not NULL then
select OP_NUMBER
into v_startOpNumber
from OPERATION
where ID = pStartID;
end if;
open c_Operations;
fetch c_Operations into r_Operations;
while (c_Operations%FOUND) loop
v_CurrentOperation.ID := r_Operations.ID;
v_CurrentOperation.OPERATION_TYPE_CODE := r_Operations.OPERATION_TYPE_CODE;
v_CurrentOperation.OP_NUMBER := r_Operations.OP_NUMBER;
v_CurrentOperation.AMOUNT := r_Operations.AMOUNT;
v_CurrentOperation.OP_CREATE_DATE := r_Operations.OP_CREATE_DATE;
v_Operations.extend();
v_Operations(v_Operations.count) := v_CurrentOperation;
fetch c_Operations into r_Operations;
end loop;
close c_Operations;
for i in 1..v_Operations.count loop
if (i <= pLIMIT) then
v_ReturnedOperations.extend;
v_ReturnedOperations(v_ReturnedOperations.count) := v_Operations(i);
end if;
end loop;

open c_Operation for
select ID, OPERATION_TYPE_CODE, OP_NUMBER,
OP_CREATE_DATE, AMOUNT AMOUNT_VALUE, NULL AMOUNT_CURRENCY
from TABLE(cast(v_ReturnedOperations as T_OPERATION_TABLE))
order by OP_NUMBER;
return c_Operation;
end;
...
Рейтинг: 0 / 0
Как это переписать с Оракла на PostgreSQL?
    #34346350
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо эту функцию надо переделать как setof (либо разделить на две, одна возвращает setof другая refcursor), никакие массивы вам не нужны. да и вобще вроде бы ее можно переписать в простой запрос

для интереса, вам самому удобно читать код отформатированный таким образом?
...
Рейтинг: 0 / 0
Как это переписать с Оракла на PostgreSQL?
    #34346362
alosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
st_serg для интереса, вам самому удобно читать код отформатированный таким образом?

как отформатировать нормально здесь его?
...
Рейтинг: 0 / 0
Как это переписать с Оракла на PostgreSQL?
    #34346370
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alosha st_serg для интереса, вам самому удобно читать код отформатированный таким образом?

как отформатировать нормально здесь его?
когда вы постите в форум, вверху над полем ввода, есть кнопка SRC
...
Рейтинг: 0 / 0
Как это переписать с Оракла на PostgreSQL?
    #34346378
alosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
st_serg alosha st_serg для интереса, вам самому удобно читать код отформатированный таким образом?

как отформатировать нормально здесь его?
когда вы постите в форум, вверху над полем ввода, есть кнопка SRC

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
function getOperations(
  pStartID  OPERATION.ID%TYPE,
  pLIMIT    NUMBER,
  pNUMBER   NUMBER
) return TYPES_PKG.REFCURSOR is
  v_Operations            T_OPERATION_TABLE := T_OPERATION_TABLE();
  v_ReturnedOperations    T_OPERATION_TABLE := T_OPERATION_TABLE();
  c_Operation             TYPES_PKG.REFCURSOR;
  v_StartOpNumber         NUMBER :=  0 ;
  i                       NUMBER; 
  cursor c_Operations is
    select ID, OPERATION_TYPE_CODE, OP_NUMBER, AMOUNT, OP_CREATE_DATE
      from OPERATION
     where OP_NUMBER > v_startOpNumber
       and (OP_NUMBER < pNUMBER or pNUMBER is NULL);
  r_Operations            OPERATION%ROWTYPE;
  v_CurrentOperation      T_OPERATION := T_OPERATION(NULL, NULL, NULL, NULL, NULL);
begin
  if pStartID is not NULL then
     select OP_NUMBER
       into v_startOpNumber
       from OPERATION
      where ID = pStartID;
  end if;
  open c_Operations;
  fetch c_Operations into r_Operations;
  while (c_Operations%FOUND) loop
    v_CurrentOperation.ID := r_Operations.ID;
    v_CurrentOperation.OPERATION_TYPE_CODE := r_Operations.OPERATION_TYPE_CODE; 
    v_CurrentOperation.OP_NUMBER := r_Operations.OP_NUMBER;
    v_CurrentOperation.AMOUNT := r_Operations.AMOUNT;
    v_CurrentOperation.OP_CREATE_DATE := r_Operations.OP_CREATE_DATE;
    v_Operations.extend();
    v_Operations(v_Operations.count) := v_CurrentOperation;
    fetch c_Operations into r_Operations;
  end loop;
  close c_Operations;
  for i in  1 ..v_Operations.count loop
    if (i <= pLIMIT) then
      v_ReturnedOperations.extend;
      v_ReturnedOperations(v_ReturnedOperations.count) := v_Operations(i);
    end if;  
  end loop; 

  open c_Operation for
    select ID, OPERATION_TYPE_CODE, OP_NUMBER,
           OP_CREATE_DATE, AMOUNT AMOUNT_VALUE, NULL AMOUNT_CURRENCY
      from TABLE(cast(v_ReturnedOperations as T_OPERATION_TABLE))
      order by OP_NUMBER;
  return c_Operation;
end;
...
Рейтинг: 0 / 0
Как это переписать с Оракла на PostgreSQL?
    #34346390
alosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
st_sergимхо эту функцию надо переделать как setof (либо разделить на две, одна возвращает setof другая refcursor), никакие массивы вам не нужны. да и вобще вроде бы ее можно переписать в простой запрос

для интереса, вам самому удобно читать код отформатированный таким образом?

так все же, как бы переписали эту функцию?
...
Рейтинг: 0 / 0
Как это переписать с Оракла на PostgreSQL?
    #34346430
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
function getOperations(
   pStartID OPERATION.ID%TYPE,
   pLIMIT NUMBER,
   pNUMBER NUMBER
) return sys_refcursor
is
   v_StartOpNumber NUMBER :=  0 ;   
   c_Operation sys_refcursor;
begin
   if pStartID is not NULL then
      select OP_NUMBER into v_startOpNumber
      from OPERATION
      where ID = pStartID;
   end if;
   
   open c_Operation for
      select ID, OPERATION_TYPE_CODE, OP_NUMBER, AMOUNT, OP_CREATE_DATE
      from OPERATION
      where OP_NUMBER > v_startOpNumber
         and (OP_NUMBER < pNUMBER or pNUMBER is NULL)
         and rownum <= pLIMIT;

   return c_Operation;
end;
но, тут косяк, набор записей от вызова к вызому может отличаться
Этот вариант выглядит вроде более правильным
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
function getOperations(
   pStartID OPERATION.ID%TYPE,
   pLIMIT NUMBER,
   pNUMBER NUMBER
) return sys_refcursor
is
   v_StartOpNumber NUMBER :=  0 ;   
   c_Operation sys_refcursor;
begin
   if pStartID is not NULL then
      select OP_NUMBER into v_startOpNumber
      from OPERATION
      where ID = pStartID;
   end if;
   
   open c_Operation for
      select *
      from (
         select ID, OPERATION_TYPE_CODE, OP_NUMBER, AMOUNT, OP_CREATE_DATE
         from OPERATION
         where OP_NUMBER > v_startOpNumber
            and (OP_NUMBER < pNUMBER or pNUMBER is NULL)
         order by OP_NUMBER;
      )
      where rownum <= pLIMIT;

   return c_Operation;
end;
для пг, почти тоже самое, разве что, вместо rownum используем limit
гдето так
...
Рейтинг: 0 / 0
Как это переписать с Оракла на PostgreSQL?
    #34346481
alosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
st_serg


Спасибо большое, буду разбираться сидеть.
...
Рейтинг: 0 / 0
Как это переписать с Оракла на PostgreSQL?
    #34346726
alosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
st_serg


Послушай, а не так ли будет правильнее, ведь мы сначала ограничиваем число записей, только потом делаем order by (смотри исходный код)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
function getOperations(
   pStartID OPERATION.ID%TYPE,
   pLIMIT NUMBER,
   pNUMBER NUMBER
) return sys_refcursor
is
   v_StartOpNumber NUMBER :=  0 ;   
   c_Operation sys_refcursor;
begin
   if pStartID is not NULL then
      select OP_NUMBER into v_startOpNumber
      from OPERATION
      where ID = pStartID;
   end if;
   
   open c_Operation for
         select ID, OPERATION_TYPE_CODE, OP_NUMBER, AMOUNT, OP_CREATE_DATE
         from OPERATION
         where OP_NUMBER > v_startOpNumber
            and (OP_NUMBER < pNUMBER or pNUMBER is NULL)
            and rownum <= pLIMIT;
         order by OP_NUMBER;
   return c_Operation;
end;

...
Рейтинг: 0 / 0
Как это переписать с Оракла на PostgreSQL?
    #34346759
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и тогда, в общем случае, у тебя будет всегда непредсказуемый ограниченный набор записей. если ли в этом смысл зависит от логики
...
Рейтинг: 0 / 0
Как это переписать с Оракла на PostgreSQL?
    #34346771
alosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
st_sergи тогда, в общем случае, у тебя будет всегда непредсказуемый ограниченный набор записей. если ли в этом смысл зависит от логики

в исходной функции мы ведь так и делаем, сначала ограничиваем число записей, а ведт только потом делаем oreder by? Или я не прав?
...
Рейтинг: 0 / 0
Как это переписать с Оракла на PostgreSQL?
    #34346807
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alosha st_sergи тогда, в общем случае, у тебя будет всегда непредсказуемый ограниченный набор записей. если ли в этом смысл зависит от логики

в исходной функции мы ведь так и делаем, сначала ограничиваем число записей, а ведт только потом делаем oreder by? Или я не прав?
прав, но я ж откуда знаю должна она так работать или нет? возможно это баг
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как это переписать с Оракла на PostgreSQL?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]