#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;$;