Динамический запрос PostgreSQL

1. user884224 23.05.22 07:47 Сейчас в теме
Товарищи, научите плиз.
Я пытаюсь написать запрос (динамический), который бы выводил существующую таблицу, но исключая из неё некоторые столбцы. Я нашёл подсказку здесь, однако, следуя указаниям, не получаю нужного результата.
Вот так выглядит мой запрос:
SEL ECT 'SELECT ' ||
ARRAY_TO_STRING(ARRAY(
    SELECT COLUMN_NAME::VARCHAR(50)
        FR OM INFORMATION_SCHEMA.COLUMNS
        WH ERE TABLE_NAME='employee' AND
            COLUMN_NAME NOT IN ('first_name') ORDER BY ORDINAL_POSITION
), ', ') || ' FR OM employee;';


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

Моя таблица сформирована вот так:
-- Table: public.employee
 
-- DR OP   TABLE IF EXISTS public.employee;
 
CRE ATE   TABLE IF NOT EXISTS public.employee
(
    id BIGINT NOT NULL DEFAULT NEXTVAL('employee_id_seq'::regclass),
    first_name CHARACTER VARYING(50) COLLATE pg_catalog."default" NOT NULL,
    last_name CHARACTER VARYING(50) COLLATE pg_catalog."default" NOT NULL,
    gender CHARACTER VARYING(6) COLLATE pg_catalog."default" NOT NULL,
    email CHARACTER VARYING(150) COLLATE pg_catalog."default",
    date_of_birth DATE NOT NULL,
    country_of_birth CHARACTER VARYING(50) COLLATE pg_catalog."default" NOT NULL,
    CONSTRAINT employee_pkey PRIMARY KEY (id)
)
 
TABLESPACE pg_default;
Показать


Данные также прикрепил...
Прикрепленные файлы:
employee.doc
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. starik-2005 3037 23.05.22 09:17 Сейчас в теме
(1)
ARRAY_TO_STRING
ИМХО, эта конструкция просто строку с запросов покажет.

EXEC SQL BEGIN DECLARE SECTION;
const char *stmt = 'SELECT ' ||
ARRAY_TO_STRING(ARRAY(
    SELECT COLUMN_NAME::VARCHAR(50)
        FR OM INFORMATION_SCHEMA.COLUMNS
        WH ERE TABLE_NAME='employee' AND
            COLUMN_NAME NOT IN ('first_name') ORDER BY ORDINAL_POSITION
), ', ') || ' FR OM employee;';
EXEC SQL END DECLARE SECTION;

EXEC SQL EXECUTE IMMEDIATE :stmt;
Показать
Как-т так...
3. user884224 23.05.22 09:19 Сейчас в теме
(2)
EXEC SQL BEGIN DECLARE SECTION;
const char *stmt = 'SELECT ' ||
ARRAY_TO_STRING(ARRAY(
SELECT COLUMN_NAME::VARCHAR(50)
FR OM INFORMATION_SCHEMA.COLUMNS
WH ERE TABLE_NAME='employee' AND
COLUMN_NAME NOT IN ('first_name') ORDER BY ORDINAL_POSITION
), ', ') || ' FR OM employee;';
EXEC SQL END DECLARE SECTION;

EXEC SQL EXECUTE IMMEDIATE :stmt;


Я может что-то не так делаю... этот запрос пишу в консоли... а ответ получаю такой:

avcoders=# EXEC SQL BEGIN DECLARE SECTION;
ОШИБКА:  ошибка синтаксиса (примерное положение: "EXEC")
СТРОКА 1: EXEC SQL BEGIN DECLARE SECTION;
          ^
avcoders=# const char *stmt = 'SELECT ' ||
avcoders-# ARRAY_TO_STRING(ARRAY(
avcoders(#     SELECT COLUMN_NAME::VARCHAR(50)
avcoders(#         FR OM INFORMATION_SCHEMA.COLUMNS
avcoders(#         WH ERE TABLE_NAME='employee' AND
avcoders(#             COLUMN_NAME NOT IN ('first_name') ORDER BY ORDINAL_POSITION
avcoders(# ), ', ') || ' FR OM employee;';
ОШИБКА:  ошибка синтаксиса (примерное положение: "const")
СТРОКА 1: const char *stmt = 'SELECT ' ||
          ^
avcoders=# EXEC SQL END DECLARE SECTION;
ОШИБКА:  ошибка синтаксиса (примерное положение: "EXEC")
СТРОКА 1: EXEC SQL END DECLARE SECTION;
          ^
avcoders=#
avcoders=# EXEC SQL EXECUTE IMMEDIATE :stmt;
ОШИБКА:  ошибка синтаксиса (примерное положение: "EXEC")
СТРОКА 1: EXEC SQL EXECUTE IMMEDIATE :stmt;
          ^
Показать


Куча ошибок про неизвестную команду!
5. user884224 23.05.22 09:36 Сейчас в теме
(4) Да, я это читал. Видимо выполнить просто динамический запрос не представляется возможным (как я понял).
Ситуация безвыходная ))
6. starik-2005 3037 23.05.22 10:15 Сейчас в теме
(5) видимо из соображений безопасности все позакрывали. Можно получить тест запроса, собрать его и выполнить из какого-нить скрипта.
7. user884224 23.05.22 12:30 Сейчас в теме
9. user884224 23.05.22 13:54 Сейчас в теме
(8) Я попробовал сделать так:
avcoders=# EXECUTE ('sel ect count(*) from public.employee') INTO c;
ОШИБКА: ошибка синтаксиса (примерное положение: "(")
СТРОКА 1: EXECUTE ('select count(*) fr om public.employee') INTO c;

Как видно - ошибка!
10. XAKEP 23.05.22 14:07 Сейчас в теме
11. user884224 23.05.22 14:44 Сейчас в теме
(10)Это просто так скопировалось.... целиком слово написано было (
12. XAKEP 23.05.22 16:13 Сейчас в теме
(11)
https://postgrespro.ru/docs/postgrespro/10/xfunc-sql
ошибка синтаксиса (примерное положение: "(")
13. user884224 23.05.22 16:49 Сейчас в теме
(12)
ошибка синтаксиса

Вроде ничего нет полезного по этой ссылке
14. XAKEP 23.05.22 16:52 Сейчас в теме
(13)
Дополнительные скобки необходимы во избежание неоднозначности при разборе запроса.


ошибка синтаксиса (!) - синтаксис SQL наверное ;)
15. XAKEP 24.05.22 07:55 Сейчас в теме
код вставлять из SQL здесь не раельно :)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот