ppgsql объявляет переменную из параметра

#sql #postgresql #pgadmin

#sql #postgresql #pgadmin

Вопрос:

Я запускаю SQL-запрос из командной строки, где я передаю значение с именем tablename:

 psql "hostname" -v tablename=$1 -a -q -f "filename.sql"
 

Затем я устанавливаю переменную следующим образом:

 set tablename :tablename
 

И затем у меня есть функция, в которой я хочу использовать переменную tablename следующим образом:

 DO $
BEGIN
    
    if (tablename = 'movie_table') then
     -- query goes in here 
    END if;
END;
$;
 

Я также попытался объявить переменную с несколькими вариантами этого:

 DECLARE tablename varchar := :tablename;
 

Пожалуйста, дайте мне знать, если у вас есть какие-либо предложения. Я получаю следующую ошибку:

 syntax error at or near ":"
 

Ответ №1:

Ваш код не может работать, потому что вы пытаетесь прочитать переменные на стороне клиента (psql) на стороне сервера (plpgsql). Вам нужно поместить значение в пользовательскую переменную на стороне сервера, и на следующем шаге вы сможете прочитать его из среды plpgsql:

 postgres=# set client_side_var Ahoj
postgres=# select set_config('my.client_side_var', :'client_side_var', false);
┌────────────┐
│ set_config │
╞════════════╡
│ Ahoj       │
└────────────┘
(1 row)

postgres=# do $
declare var text default current_setting('my.client_side_var');
begin
   raise notice '>>>%<<<', var;
end;
$;
NOTICE:  >>>Ahoj<<<
DO
 

Вы не можете использовать синтаксис psql :var внутри кода plpgsql.