\ установить команду в EDB Postgresql - PullRequest
0 голосов
/ 06 января 2020

В EDB Postgres, команда \set используется для установки переменных, например, \set detpno 80, и при вставке мы можем использовать :deptno вместо фактического значения, например

insert into dept values (:deptno, 'SALES', 'HYD');

, это работает хорошо, но когда я использую его в процедуре или в анонимном блоке, возникает ошибка его выдачи.

простой анонимный блок

begin
insert into dept values (:deptno, 'SALES', 'LONDON');
end;

при выполнении этого блока я получаю ошибку ниже

ОШИБКА: синтаксическая ошибка в или около ":"
ЛИНИЯ 2: вставить в значения dept1 (: deptno, 'SALES', 'BAN');

Пожалуйста, помогите мне использовать \ set variable в процедурах или функциях.

Ответы [ 2 ]

0 голосов
/ 06 января 2020

Переменные psql нельзя использовать внутри кода на стороне сервера - анонимных блоков. Это просто не разрешено - подстановка блокируется внутри строки. Вы можете использовать обходной путь.

  1. установить пользовательскую переменную gu c (пользовательское значение конфигурации). Запрашивается префикс 'xx'.

    postgres=# \set myval AHOJ
    postgres=# select set_config('xx.myval', :'myval', false);
     ┌────────────┐
     │ set_config │
     ╞════════════╡
     │ AHOJ       │
     └────────────┘
    (1 row)
    
  2. Теперь вы можете прочитать значение по функции current_setting на стороне сервера

    postgres=# do $$
    begin
      raise notice '%', current_setting('xx.myval');
    end;
    $$;
    NOTICE:  AHOJ
    DO
    

В настоящее время нет другого способа сделать это. Это Postgres - но в этом случае EDB очень похож.

0 голосов
/ 06 января 2020

Замена: varname чем-то, что было ранее \ set, является особенностью конкретного клиента базы данных, а именно "psql" (хотя, возможно, другие клиенты эмулировали это поведение). Это не особенность самой базы данных. База данных не видит: varname, она видит только то, что было подставлено.

Когда вы используете блок анонимного кода, вы игнорируете поведение подстановки клиента.

Возможно Вы должны создать функцию, которая объявляет, какие параметры она принимает должным образом, а не использует оболочечную интерполяцию переменных.

...