Товарищи, научите плиз.
Я пытаюсь написать запрос (динамический), который бы выводил существующую таблицу, но исключая из неё некоторые столбцы. Я нашёл подсказку здесь, однако, следуя указаниям, не получаю нужного результата.
Вот так выглядит мой запрос:
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;
ИМХО, эта конструкция просто строку с запросов покажет.
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;
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;
^
(8) Я попробовал сделать так:
avcoders=# EXECUTE ('sel ect count(*) from public.employee') INTO c;
ОШИБКА: ошибка синтаксиса (примерное положение: "(")
СТРОКА 1: EXECUTE ('select count(*) fr om public.employee') INTO c;