psql , создание хранимой процедуры — преобразование строки в тип схемы

#postgresql

Вопрос:

У меня есть сохраненная программа, которая делает это, my_schema — это имя текущей схемы, которую я использую в своей БД.

 CREATE OR REPLACE myprocedure(data TEXT) LANGUAGE plpgsql AS $
   DECLARE
      my_variable my_schema.my_table%ROWTYPE;
      BEGIN
          SELECT * FROM my_schema.my_table WHERE oid=3;
      END;
$;  
 

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

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

 CREATE OR REPLACE myprocedure(data TEXT, my_schema_name <SOME_TYPE>) LANGUAGE plpgsql AS $
  DECLARE
          my_variable <my_schema_name>.my_table%ROWTYPE;
          BEGIN
              SELECT * FROM <my_schema_name>.my_table WHERE oid=3;
          END;
    $;    
 

а потом назови это так:

 CALL myprocedure('SOMETHIGN', <MY_SCHEMA_NAME>);
 

каков правильный синтаксис для этого?

Ответ №1:

Вы можете использовать record тип для общей записи, а для запроса использовать динамический SQL. Вот пример:

 CREATE PROCEDURE x(schema_name text) LANGUAGE plpgsql AS
$DECLARE
   q record;
BEGIN
   EXECUTE format(
              'SELECT * FROM %I.data WHERE id = 1',
              schema_name
           ) INTO q;

   RAISE NOTICE '%', q.id;
END;$;