powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как динамически подставить имя таблицы в DELETE внутри фунции
5 сообщений из 5, страница 1 из 1
как динамически подставить имя таблицы в DELETE внутри фунции
    #39707339
dburtsev1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Amazon Aurora PostgreSQL 9.6.8 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.9.3, 64-bit

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
CREATE OR REPLACE FUNCTION delete_staging_data()
RETURNS void
LANGUAGE plpgsql
AS 
'
DECLARE
  tableName varchar(63);
  staging_cursor CURSOR FOR SELECT table_name FROM information_schema.tables 
   WHERE table_type = ''BASE TABLE'' AND table_schema NOT IN (''pg_catalog'', ''information_schema'') AND table_name LIKE ''_\_%''; 

BEGIN
OPEN staging_cursor;

LOOP
FETCH NEXT FROM staging_cursor INTO tableName;

EXIT WHEN NOT FOUND;

EXECUTE ''DELETE FROM TABLE '' || tableName;
COMMIT;

END LOOP;

CLOSE staging_cursor;
END; 
'


ERROR: 42601: syntax error at or near "TABLE"
...
Рейтинг: 0 / 0
как динамически подставить имя таблицы в DELETE внутри фунции
    #39707345
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dburtsev1 FROM information_schema.tables
WHERE table_type = ''BASE TABLE'' AND table_schema NOT IN
ERROR: 42601: syntax error at or near "TABLE"
Нужно делать where tables.table_type = ''BASE TABLE'' и можно оставить and table_schema not in
И проверить, что не двойные кавычки, а две ординарные.
...
Рейтинг: 0 / 0
как динамически подставить имя таблицы в DELETE внутри фунции
    #39707612
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dburtsev1,

Ошибка в команде DELETE, слово TABLE лишнее.

Кроме этого:
1. Если удаляете все строки, то лучше выполнять TRUNCATE вместо DELETE.
2. Запрос предполагает выбор таблиц из разных схем, поэтому имя схемы лучше подставлять явно.
3. Цикл FOR с запросом выглядит проще чем цикл с предварительным объявлением курсора.
4. COMMIT внутри функции работать не будет.
4. Строку с телом функции лучше оформить через двойные знаки $: $$DECLARE ... END;$$
Это избавит от необходимости экранировать одинарные кавычки внутри.
...
Рейтинг: 0 / 0
как динамически подставить имя таблицы в DELETE внутри фунции
    #39707954
dburtsev1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо всем, заработало
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE OR REPLACE FUNCTION delete_staging_data()
RETURNS void
LANGUAGE plpgsql
AS 
$$
DECLARE
  staging_cursor CURSOR FOR SELECT table_name FROM information_schema.tables 
   WHERE table_type = 'BASE TABLE' AND table_schema = ('public') AND table_name LIKE '_\_%'; 

BEGIN
FOR stmt IN staging_cursor LOOP

  EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.table_name) || ';';

END LOOP;

END; 
$$
...
Рейтинг: 0 / 0
как динамически подставить имя таблицы в DELETE внутри фунции
    #39708229
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dburtsev1спасибо всем, заработало
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE OR REPLACE FUNCTION delete_staging_data()
RETURNS void
LANGUAGE plpgsql
AS 
$$
DECLARE
  staging_cursor CURSOR FOR SELECT table_name FROM information_schema.tables 
   WHERE table_type = 'BASE TABLE' AND table_schema = ('public') AND table_name LIKE '_\_%'; 

BEGIN
FOR stmt IN staging_cursor LOOP

  EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.table_name) || ';';

END LOOP;

END; 
$$



здесь пишут, в частности, такое:
https://stackoverflow.com/questions/11419536/postgresql-truncation-speed/11423886#11423886

авторDetailed explanation of TRUNCATE vs DELETE FROM:

While not an expert on the topic, my understanding is that TRUNCATE has a nearly fixed cost per table, while DELETE is at least O(n) for n rows; worse if there are any foreign keys referencing the table being deleted.

I always assumed that the fixed cost of a TRUNCATE was lower than the cost of a DELETE on a near-empty table, but this isn't true at all.

TRUNCATE table; does more than DELETE FROM table;

The state of the database after a TRUNCATE table is much the same as if you'd instead run:

DELETE FROM table;
VACCUUM (FULL, ANALYZE) table; (9.0+ only, see footnote)
... though of course TRUNCATE doesn't actually achieve its effects with a DELETE and a VACUUM.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как динамически подставить имя таблицы в DELETE внутри фунции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]