Мой вопрос в два раза. Во-первых, я должен оценить версию PostgreSQL, чтобы запустить правильный запрос. У меня есть несколько серверов, на которых запущен PostgreSQL 8. * и у меня есть проблемы с использованием DO
в моем запросе ниже. У серверов, на которых я запущен 9. * (в основном я использую сервер 9.2), выдает мне сообщение об ошибке: «запрос не имеет назначения для данных результата», когда все, что я хочу, является печатью из инструкции select.В запросе нет адресата для данных результата
Мой запрос:
DO
$BODY$
BEGIN
IF (SELECT setting from pg_settings where name = 'server_version') >= '9.2' THEN
SELECT pg_database.datname AS Database_Name, pg_authid.rolname AS Database_Owner,
pg_authid.rolsuper AS IsSuperUser, pg_tablespace.spcname AS TableSpaceName,
pg_catalog.pg_tablespace_location(pg_tablespace.oid) AS TableSpaceLocation
FROM pg_database
JOIN pg_authid on pg_database.datdba = pg_authid.oid
CROSS JOIN pg_tablespace
WHERE datistemplate = false
AND pg_database.dattablespace = pg_tablespace.oid;
ELSE
SELECT pg_database.datname AS Database_Name, pg_authid.rolname AS Database_Owner,
pg_authid.rolsuper AS IsSuperUser, pg_tablespace.spcname AS TableSpaceName, pg_tablespace.spclocation AS TableSpaceLocation
FROM pg_database
JOIN pg_authid on pg_database.datdba = pg_authid.oid
CROSS JOIN pg_tablespace
WHERE datistemplate = false
AND pg_database.dattablespace = pg_tablespace.oid;
END IF;
END;
$BODY$
Так что, если DO
не работает предварительный 9.0, и я получаю ошибку после 9.0 я вроде застрял на том, что я могу сделать, чтобы удовлетворить обоим условиям.
Используйте PERFORM вместо SELECT –
Вы можете либо проверить версию сервера на клиенте перед отправкой запроса (таким образом, избегая конструкцию 'DO'), либо создать собственную функцию' pg_tablespace_location' на серверах 8.x таким образом что тот же запрос будет работать на всех версиях сервера. –