Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Перенос процедуры из Оракла, что не так?  [new]
Sheriffua
Member

Откуда: г. Киев
Сообщений: 1187
Добрый день.
Есть такая процедурка в Оракле:
+

CREATE OR REPLACE procedure IKIS_CIS.err_imp_docs_param2(dt_from in date, dt_to in date) is
dt_part date;
num number;
i number :=0;
begin
  EXECUTE IMMEDIATE 'alter session set nls_date_format="dd.mm.yyyy hh24:mi:ss"';
--  if dt_to = dt_from then
  num := to_number(dt_to - dt_from + 1)*24;
 -- else 
--  num := to_number(dt_to - dt_from)*24;
--  end if;
  dt_part := dt_from -1/24;
  
  loop
  i := i + 1;
  dt_part := dt_part +1/24;
  if i <= num then
  insert into ikis_cis.err_docs_param2(date_month,
                              crt_crt_id,
                              DOC_ID,DELAY_PUBLICATION_TERM, IS_BLOCKED) 
SELECT DISTINCT TO_CHAR(d.dt_import, 'mm.yyyy') ,d.crt_crt_id, D.DOC_ID, d.DELAY_PUBLICATION_TERM, D.IS_BLOCKED
  --D.REG_NUMB, D.DT_IMPORT
  FROM ICC_RSR.DOCUMENTS d,
       ICC_RSR.DOC_TEXTS dt                      --, ICC_RSR.DOC_IMAGES di
 WHERE                                                      --D.CRT_CRT_ID=809
      DT.DOC_DOC_ID = D.DOC_ID
       AND (upper(dt.text) like upper('?0=40=') 
       or upper(dt.text) like upper('%:>@8ABL%') 
       or upper(dt.text) like upper('%?@>4>265==O%') 
       or upper(dt.text) like upper('%@57C;LB0BV%') 
       or upper(dt.text) like upper('%@>;V%') 
       or upper(dt.text) like upper('%A8;C%') 
       or upper(dt.text) like upper('%@07V%') 
       or upper(dt.text) like upper('%?@>BO3><%') 
       or upper(dt.text) like upper('%FV;OE%')) 
       AND D.ST_ST_ID not in (7)
       AND DT.IS_ROW_DELETE <> 1
       AND DT.IS_IMPERSONAL <> 0
       AND D.IMP_ST_ST_ID in (15,20)
       and D.ST_ST_ID=6
       AND D.DT_IMPORT >= TO_DATE (dt_part, 'dd.mm.yyyy HH24:MI:SS') 
       and D.DT_IMPORT <= TO_DATE (dt_part, 'dd.mm.yyyy HH24:MI:SS')+1/24;
      commit;
      else return;
  end if;
end loop;

end err_imp_docs_param2;
/


Хочу ее перенсти в постгрес:
+

--------------- SQL ---------------

CREATE FUNCTION public.test (
  dt_from date,
  dt_to date,
  i integer = 0
)
RETURNS void AS
$body$
DECLARE
  dt_part timestamp;
  num INTEGER;
  begin
  --EXECUTE IMMEDIATE 'alter session set nls_date_format="dd.mm.yyyy hh24:mi:ss"';
  --  if dt_to = dt_from then
  --i   : = NULL;
  num := to_number(dt_to - dt_from + 1)*24;
  -- else 
  --  num := to_number(dt_to - dt_from)*24;
  --  end if;
  dt_part := dt_from -1/24;
  loop
    i := i + 1;
    dt_part := dt_part +1/24;
    if i <= num then
      insert into
        err_docs_param2(date_month, crt_crt_id, DOC_ID, DELAY_PUBLICATION_TERM, IS_BLOCKED)
      SELECT
        DISTINCT TO_CHAR(d.dt_import, 'mm.yyyy'),
        d.crt_crt_id,
        D.DOC_ID,
        d.DELAY_PUBLICATION_TERM,
        D.IS_BLOCKED
      FROM
        DOCUMENTS d,
        doc_texts dt
      WHERE
        DT.DOC_DOC_ID = D.DOC_ID AND
        (upper(dt.tekst) like upper('?0=40=') or
        upper(dt.tekst) like upper('%:>@8ABL%') or
        upper(dt.tekst) like upper('%?@>4>265==O%') or
        upper(dt.tekst) like upper('%@57C;LB0BV%') or
        upper(dt.tekst) like upper('%@>;V%') or
        upper(dt.tekst) like upper('%A8;C%') or
        upper(dt.tekst) like upper('%@07V%') or
        upper(dt.tekst) like upper('%?@>BO3><%') or
        upper(dt.tekst) like upper('%FV;OE%')) AND
        D.ST_ST_ID not in (7) AND
        DT.IS_ROW_DELETE <> 1 AND
        DT.IS_IMPERSONAL <> 0 AND
        D.IMP_ST_ST_ID in (15, 20) and
        D.ST_ST_ID = 6 AND
        D.DT_IMPORT >= to_timestamp(dt_part, 'dd.mm.yyyy HH24:MI:SS') and
        D.DT_IMPORT <= to_timestamp(dt_part, 'dd.mm.yyyy HH24:MI:SS')+1/24;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER;


вылазит сообщение об ошибке:
ERROR:  syntax error at end of input
LINE 47: $body$ LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECU...
         ^


Что я делаю не так?
19 сен 17, 14:32    [20806165]     Ответить | Цитировать Сообщить модератору
 Re: Перенос процедуры из Оракла, что не так?  [new]
vyegorov
Member

Откуда: Рига
Сообщений: 971
Sheriffua,

Текст функции в общем виде таков:
CREATE FUNCTIONAS $body$
DECLAREBEGINEND;
$body$ LANGUAGE plpgsql;

У вас функция не “закончена”, `IF` не закрыт, `LOOP` не закрыт (в обратном порядке).
19 сен 17, 14:41    [20806208]     Ответить | Цитировать Сообщить модератору
 Re: Перенос процедуры из Оракла, что не так?  [new]
Ы2
Member

Откуда:
Сообщений: 20
Sheriffua,

Нужен END, чтобы завершить определение функции.
19 сен 17, 14:45    [20806221]     Ответить | Цитировать Сообщить модератору
 Re: Перенос процедуры из Оракла, что не так?  [new]
Sheriffua
Member

Откуда: г. Киев
Сообщений: 1187
Спасибо за подсказки. Переписал так:
+

CREATE OR REPLACE FUNCTION public.test (
  dt_from date,
  dt_to date,
  i integer = 0
)
RETURNS void AS
$body$
DECLARE
  dt_part date;
  num INTEGER;
  begin
  num := (dt_to - dt_from + 1)*24;
  dt_part := dt_from -1/24;
  loop
    i := i + 1;
    dt_part := dt_part+1/24;
    if i <= num then
      insert into
        err_docs_param2(date_month, crt_crt_id, DOC_ID, DELAY_PUBLICATION_TERM, IS_BLOCKED)
      SELECT
        DISTINCT TO_CHAR(d.dt_import, 'mm.yyyy'),
        d.crt_crt_id,
        D.DOC_ID,
        d.DELAY_PUBLICATION_TERM,
        D.IS_BLOCKED
      FROM
        DOCUMENTS d,
        doc_texts dt
      WHERE
        DT.DOC_DOC_ID = D.DOC_ID AND
        (upper(dt.tekst) like upper('?0=40=') or
        upper(dt.tekst) like upper('%:>@8ABL%') or
        upper(dt.tekst) like upper('%?@>4>265==O%') or
        upper(dt.tekst) like upper('%@57C;LB0BV%') or
        upper(dt.tekst) like upper('%@>;V%') or
        upper(dt.tekst) like upper('%A8;C%') or
        upper(dt.tekst) like upper('%@07V%') or
        upper(dt.tekst) like upper('%?@>BO3><%') or
        upper(dt.tekst) like upper('%FV;OE%')) AND
        D.ST_ST_ID not in (7) AND
        DT.IS_ROW_DELETE <> 1 AND
        DT.IS_IMPERSONAL <> 0 AND
        D.IMP_ST_ST_ID in (15, 20) and
        D.ST_ST_ID = 6 AND
        D.DT_IMPORT >= (dt_part) and
        D.DT_IMPORT <= (dt_part)+1/24;
        else return;
  end if;
end loop;
end;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;


но при этом у меня почему-то в таблицу err_docs_param2 инсертится 48 записей дублей одного и того же DOC_ID, почему так? По идее должна быть одна запись.
19 сен 17, 15:34    [20806425]     Ответить | Цитировать Сообщить модератору
 Re: Перенос процедуры из Оракла, что не так?  [new]
vyegorov
Member

Откуда: Рига
Сообщений: 971
Sheriffua,

Мне думается, что вы начали заниматься теми же извращёнными манипуляциями с датами, которые характерны для ORACLE-а:
num := (dt_to - dt_from + 1)*24;
dt_part := dt_from -1/24;

В Postgres'е иначе всё работает, и в типе `date` нету временной составляющей. Вам следует использовать тип `timestamptz` и для манипуляций пользоваться интервалами.

Что там происходит — не знаю. Добавьте отладку через конструкцию `RAISE NOTICE`. Скорее всего в этом выражении
num := (dt_to - dt_from + 1)*24;
получается не `1`, а 48 — очень похоже.
19 сен 17, 20:54    [20807305]     Ответить | Цитировать Сообщить модератору
 Re: Перенос процедуры из Оракла, что не так?  [new]
Sheriffua
Member

Откуда: г. Киев
Сообщений: 1187
vyegorov,

Спасибо за разъяснения. Хотелось бы еще уточнить следующее:

у меня колонка dt_import в таблице DOCUMENTS имеет тип - timestamp, как правильно нужно указать диапазон в постгресе
для такого типа?
dt_part timestamp; --то вываливается ошикба

если указал как в приведенном своем примере, то данная айдишка не выбирается, диапазон задаю в виде:
01.06.2017
и
02.06.2017
но при этом сам атрибут dt_import имеет вид 01.06.2017 16:20:35
когда же убираю время и оставляю только дату для этой айдишки, то она выбирается как я уже озвучивал - 48 раз!, но вы это уже пояснили и я понял, осталось разобраться как привести правильно атрибут со временем.
19 сен 17, 21:42    [20807393]     Ответить | Цитировать Сообщить модератору
 Re: Перенос процедуры из Оракла, что не так?  [new]
Lonepsycho
Member

Откуда: Siauliai, Литва
Сообщений: 484
Sheriffua,

Range types...
19 сен 17, 22:18    [20807488]     Ответить | Цитировать Сообщить модератору
 Re: Перенос процедуры из Оракла, что не так?  [new]
vyegorov
Member

Откуда: Рига
Сообщений: 971
Sheriffua,

Хм, не совсем понял что у вас не работает.

...
D.DT_IMPORT >= (dt_part) and
D.DT_IMPORT <= (dt_part)+1/24;

Вам нужно поступить так:
  • все переменные в теле функции привести к тем же типам, что и соответствующие им колонки. Postgres очень требователен к типам;
  • при работе с датами я предпочитаю использовать YYYY-MM-DD HH24:MI:SS нотацию (ISO8601), т.к. ПЖ “понимает” её легко в виде строковых констант, с другими форматами можно нарваться;
  • если типу `timestamp`/`timestamptz` вы присваиваете дату, то время берётся по полуночи 00:00;
  • в данном случае я бы использовал что-то такое: `d.dt_import >= dt_part AND d.dt_import < dt_part + INTERVAL '1day'` — обращаю внимание на открытую верхнюю границу диапазона

    Рекомендации общие:
  • Postgres запросы приводит к нижнему регистру (в отличии от ORACLE и от стандарта), так что шифт можно не зажимать Картинка с другого сайта.
  • если вы получаете ошибку, то очень полезно приводить её целиком — сообщения более информативны, чем у ORACLE;
  • в Postgres-е есть Set-Returning-Functions, они полезны для генерации последовательностей;
  • у вас очень ”процедурный” код. рекомендую посмотреть на конструкции вида `FOR var IN query LOOP ... END LOOP`, очень удобно.
  • 19 сен 17, 23:12    [20807612]     Ответить | Цитировать Сообщить модератору
     Re: Перенос процедуры из Оракла, что не так?  [new]
    Sheriffua
    Member

    Откуда: г. Киев
    Сообщений: 1187
    vyegorov,
    Спасибо за подробное описание. В продолжение вопроса, привожу формат таблицы документов.
    +

    "doc_id""case_numb""crt_crt_id""st_st_id""dt_case""dt_registration""row_version""is_row_delete""pkg_pkg_id""prev_case_numb""prev_dt_case""rc_doc_vr_type""rc_doc_cs_type""csc_csc_id""rc_doc_ins_type""old_case_numb""old_dt_case""prev_crt_crt_id""prev_dt_registration""is_ph_present""is_gov_present""is_session_public""full_st_st_id""imp_st_st_id""dt_created""is_blocked""is_archiv""file_name""dt_import""rc_doc_src_type""is_err_letter_exists""usr_usr_id""reg_numb""crt_name""crt_prev_uid""crt_prev_name""doc_prev_uid""dt_notice""dt_law""judge_fio""binary_image_count""crt_crt_tag_id""tag_numb""dt_tag""crt_uid""doc_uid""is_signature_present""dt_notice_impersonal""is_return_on_dep""is_return_on_dest""dt_disabled""is_jur_present""rc_doc_process_type""usr_usr_dest_id""usr_usr_dep_id""dt_operation_dest""dt_operation_dep""is_temp_block_public""is_problem""delay_publication_term""dnzs_id""date_doc_send_from_court""dt_doc_sign_send_from_court""dt_doc_text_send_from_court""dt_zvit""hearingclosed"
    66 825 571"326/630/17"  465  622.05.201730.05.2017  20null"null"null  5  1 1 078  1"null"nullnullnull101  8  1501.06.2017 0:00:0000"0822_1323284.html"01.06.2017 16:08:18  40  1"66825571""Приморський районний суд Запорізької області""null""null""null"01.06.2017 0:00:0005.06.2017"Стріжакова Т. В."  0  465"null"null"819""1323284"106.06.2017 0:00:00nullnullnull0  1  1nullnullnullnull0null30 698 84331.05.2017 0:00:0031.05.2017 0:00:0031.05.201731.05.2017null


    Теперь привожу решение функции, которую перенес из Оракла:
    +

    CREATE OR REPLACE FUNCTION public.test (
      dt_from date,
      dt_to date,
      i integer = 0
    )
    RETURNS void AS
    $body$
    DECLARE
      dt_part date;
      num INTEGER;
      begin
      set timezone = 'Europe/Kiev';
      num := (dt_to - dt_from + 1)*24;
      dt_part := dt_from -1/24;
      loop
        i := i + 1;
        dt_part := (dt_part)+1/24;
        if i <= num then
          insert into
            err_docs_param2(date_month, crt_crt_id, DOC_ID, DELAY_PUBLICATION_TERM, IS_BLOCKED)
          SELECT
            DISTINCT TO_CHAR(d.dt_import, 'mm.yyyy'),
            d.crt_crt_id,
            D.DOC_ID,
            d.DELAY_PUBLICATION_TERM,
            D.IS_BLOCKED
          FROM
            DOCUMENTS d,
            doc_texts dt
          WHERE
            DT.DOC_DOC_ID = D.DOC_ID AND
            ((dt.tekst) like ('?0=40=') or
            (dt.tekst) like ('%:>@8ABL%') or
            (dt.tekst) like ('%?@>4>265==O%') or
            (dt.tekst) like ('%@57C;LB0BV%') or
            (dt.tekst) like ('%@>;V%') or
            (dt.tekst) like ('%A8;C%') or
            (dt.tekst) like ('%@07V%') or
            (dt.tekst) like ('%?@>BO3><%') or
            (dt.tekst) like ('%FV;OE%')) AND
            D.ST_ST_ID not in (7) AND
            DT.IS_ROW_DELETE <> 1 AND
            DT.IS_IMPERSONAL <> 0 AND
            d.doc_id=66825571 AND
            D.IMP_ST_ST_ID in (15, 20) and
            D.ST_ST_ID = 6 AND
            D.DT_IMPORT >= (dt_part) and
            D.DT_IMPORT <= (dt_part)+1/24;
            else return;
      end if;
    end loop;
    end;
    $body$
    LANGUAGE 'plpgsql'
    VOLATILE
    CALLED ON NULL INPUT
    SECURITY INVOKER
    COST 100;
    


    при таком раскладе функция не находит данный документ, но если я из даты уберу время, то поиск проходит, но при этом кол-во записей в таблицу ошибок дублируются 48 раз (с этим вопросом понятно, т.к. задается период 2 суток, 01-02/06/2017 и он по формуле разбивается на цикл в 48 проходов).
    Как привести данные в функции к формату даты - dd.mm.yyyy h24:mm:ss
    20 сен 17, 09:14    [20807881]     Ответить | Цитировать Сообщить модератору
     Re: Перенос процедуры из Оракла, что не так?  [new]
    Sheriffua
    Member

    Откуда: г. Киев
    Сообщений: 1187
    vyegorov,

    для чего нужно именно так - расчет должен производиться не по дням, а по часам, поэтому и надо построить цикл, чтобы опрос по таблице документов проходил 24 раза за сутки.
    20 сен 17, 09:24    [20807895]     Ответить | Цитировать Сообщить модератору
     Re: Перенос процедуры из Оракла, что не так?  [new]
    vyegorov
    Member

    Откуда: Рига
    Сообщений: 971
    Sheriffua,

  • а приведите DDL для таблицы, пожалуйста, я с картинками не очень;
  • а вот так вот делать не очень хорошо `set timezone = 'Europe/Kiev';`, потом искать все такие “нычки” по коду очень грустно. полагайтесь на настройки сессии;
  • вы в коде ничего не поменяли в местах работы с датами. зачем там везде пляски с 24 часами?

    Если вы хотите помощи в логике, то поясните что означают входные параметры функции, особенно `i`.
  • 20 сен 17, 09:58    [20807969]     Ответить | Цитировать Сообщить модератору
     Re: Перенос процедуры из Оракла, что не так?  [new]
    Sheriffua
    Member

    Откуда: г. Киев
    Сообщений: 1187
    vyegorov,
    Передалал так и процес пошел:
    +

    CREATE OR REPLACE FUNCTION public.test (
      dt_from date,
      dt_to date,
      i integer = 0
    )
    RETURNS void AS
    $body$
    DECLARE
      dt_part TIMESTAMP;
      num INTEGER;
      begin
      set timezone = 'Europe/Kiev';
      num := (dt_to - dt_from + 1)*24;
      dt_part := dt_from - INTERVAL'1 HOUR';
      loop
        i := i + 1;
        dt_part := (dt_part)+ INTERVAL'1 HOUR';
        if i <= num then
          insert into
            err_docs_param2(date_month, crt_crt_id, DOC_ID, DELAY_PUBLICATION_TERM, IS_BLOCKED)
          SELECT
            DISTINCT TO_CHAR(d.dt_import, 'mm.yyyy'),
            d.crt_crt_id,
            D.DOC_ID,
            d.DELAY_PUBLICATION_TERM,
            D.IS_BLOCKED
          FROM
            DOCUMENTS d,
            doc_texts dt
          WHERE
            DT.DOC_DOC_ID = D.DOC_ID AND
            ((dt.tekst) like ('?0=40=') or
            (dt.tekst) like ('%:>@8ABL%') or
            (dt.tekst) like ('%?@>4>265==O%') or
            (dt.tekst) like ('%@57C;LB0BV%') or
            (dt.tekst) like ('%@>;V%') or
            (dt.tekst) like ('%A8;C%') or
            (dt.tekst) like ('%@07V%') or
            (dt.tekst) like ('%?@>BO3><%') or
            (dt.tekst) like ('%FV;OE%')) AND
            D.ST_ST_ID not in (7) AND
            DT.IS_ROW_DELETE <> 1 AND
            DT.IS_IMPERSONAL <> 0 AND
            --d.doc_id=66825571 AND
            D.IMP_ST_ST_ID in (15, 20) and
            D.ST_ST_ID = 6 AND
            D.DT_IMPORT >= (dt_part) and
            D.DT_IMPORT <= (dt_part) + INTERVAL'1 HOUR';
            else return;
      end if;
    end loop;
    end;
    $body$
    LANGUAGE 'plpgsql'
    VOLATILE
    CALLED ON NULL INPUT
    SECURITY INVOKER
    COST 100;
    


    возможно как-то можно упростить данную функцию с использованием фич ПЖ...но пока как говорится только начал его изучение.
    а DDL таблицы таков:
    +

    CREATE TABLE public.documents (
      doc_id INTEGER NOT NULL,
      case_numb VARCHAR(70),
      crt_crt_id INTEGER,
      st_st_id INTEGER NOT NULL,
      dt_case DATE,
      dt_registration DATE,
      row_version INTEGER NOT NULL,
      is_row_delete NUMERIC(1,0) NOT NULL,
      pkg_pkg_id INTEGER,
      prev_case_numb VARCHAR(70),
      prev_dt_case DATE,
      rc_doc_vr_type INTEGER,
      rc_doc_cs_type INTEGER,
      csc_csc_id INTEGER,
      rc_doc_ins_type INTEGER,
      old_case_numb VARCHAR(70),
      old_dt_case DATE,
      prev_crt_crt_id INTEGER,
      prev_dt_registration DATE,
      is_ph_present NUMERIC(1,0),
      is_gov_present NUMERIC(1,0),
      is_session_public NUMERIC(1,0),
      full_st_st_id INTEGER NOT NULL,
      imp_st_st_id INTEGER,
      dt_created TIMESTAMP WITHOUT TIME ZONE,
      is_blocked NUMERIC(1,0) NOT NULL,
      is_archiv NUMERIC(1,0),
      file_name VARCHAR(255),
      dt_import TIMESTAMP WITHOUT TIME ZONE,
      rc_doc_src_type INTEGER,
      is_err_letter_exists NUMERIC(1,0),
      usr_usr_id INTEGER NOT NULL,
      reg_numb VARCHAR(15) NOT NULL,
      crt_name VARCHAR(255),
      crt_prev_uid VARCHAR(12),
      crt_prev_name VARCHAR(255),
      doc_prev_uid VARCHAR(64),
      dt_notice TIMESTAMP WITHOUT TIME ZONE,
      dt_law DATE,
      judge_fio VARCHAR(90),
      binary_image_count INTEGER NOT NULL,
      crt_crt_tag_id INTEGER,
      tag_numb VARCHAR(30),
      dt_tag DATE,
      crt_uid VARCHAR(12),
      doc_uid VARCHAR(64),
      is_signature_present NUMERIC(1,0) NOT NULL,
      dt_notice_impersonal TIMESTAMP WITHOUT TIME ZONE,
      is_return_on_dep NUMERIC(1,0),
      is_return_on_dest NUMERIC(1,0),
      dt_disabled TIMESTAMP WITHOUT TIME ZONE,
      is_jur_present NUMERIC(1,0),
      rc_doc_process_type INTEGER,
      usr_usr_dest_id INTEGER,
      usr_usr_dep_id INTEGER,
      dt_operation_dest TIMESTAMP WITHOUT TIME ZONE,
      dt_operation_dep TIMESTAMP WITHOUT TIME ZONE,
      is_temp_block_public INTEGER,
      is_problem NUMERIC(1,0) DEFAULT 0,
      delay_publication_term INTEGER,
      dnzs_id BIGINT,
      date_doc_send_from_court TIMESTAMP WITHOUT TIME ZONE,
      dt_doc_sign_send_from_court TIMESTAMP WITHOUT TIME ZONE,
      dt_doc_text_send_from_court DATE,
      dt_zvit DATE,
      hearingclosed INTEGER,
      CONSTRAINT documents_pkey PRIMARY KEY(doc_id),
      CONSTRAINT doc_csc_fk FOREIGN KEY (csc_csc_id)
        REFERENCES public.dict_case_categories(csc_id)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION
        NOT DEFERRABLE,
      CONSTRAINT doc_pkg_fk FOREIGN KEY (pkg_pkg_id)
        REFERENCES public.packs(pkg_id)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION
        NOT DEFERRABLE,
      CONSTRAINT documents_crt_fk FOREIGN KEY (crt_crt_id)
        REFERENCES public.dict_courts(crt_id)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION
        NOT DEFERRABLE,
      CONSTRAINT documents_full_st_fk FOREIGN KEY (full_st_st_id)
        REFERENCES public.dict_statuses(st_id)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION
        NOT DEFERRABLE,
      CONSTRAINT documents_imp_st_fk FOREIGN KEY (imp_st_st_id)
        REFERENCES public.dict_statuses(st_id)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION
        NOT DEFERRABLE,
      CONSTRAINT documents_st_fk FOREIGN KEY (st_st_id)
        REFERENCES public.dict_statuses(st_id)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION
        NOT DEFERRABLE
    ) 
    WITH (oids = false);
    


    и спасибо за помощь.
    20 сен 17, 10:50    [20808189]     Ответить | Цитировать Сообщить модератору
    Все форумы / PostgreSQL Ответить