Динамический запрос 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 2899 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 2899 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 здесь не раельно :)
Оставьте свое сообщение
Вакансии
Программист
Санкт-Петербург
зарплата от 180 000 руб. до 240 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 150 000 руб. до 250 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Программист 1С
Екатеринбург
зарплата от 130 000 руб. до 170 000 руб.
Полный день

Программист 1C
Санкт-Петербург
зарплата от 140 000 руб. до 200 000 руб.
Полный день