powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / СУБД Teradata
10 сообщений из 10, страница 1 из 1
СУБД Teradata
    #37775819
Andrey Eliseev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Необходимо написать хранимую процедуру, которая будет удалять таблицы, которые удовлетворяют определенному условию. Помогите разобраться. Написал, но не работает.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create procedure removet (DName VARCHAR(128))
  begin
declare DatabaseName varchar (128);
declare TableName varchar (128);
declare sql_stmt varchar (100);
declare cname cursor for
select t.DatabaseName,
       t.TableName
   	
  from	DBC.Tables t 
 where	DatabaseName like '%' || :DName || '%' 
   and  TableName like any ('%_BKP%','%_TMP%','%_BACKUP%')
   and  CreateTimeStamp < (current_date - interval '1' month);
open cname;
fetch cname into DatabaseName, Tablename;
set sql_stmt = 'drop table' || :DatabaseName || '.' || :TableName;
prepare stmt1 from sql_stmt;
execute stmt1;
deallocate prepare stmt1;
close cname;
end;
...
Рейтинг: 0 / 0
СУБД Teradata
    #37776378
Фотография Apex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А конкретнее можно? Не работает что?
В любом случае, мне кажется там цикл должен быть по курсору, он ведь не одну запись может вернуть.
...
Рейтинг: 0 / 0
СУБД Teradata
    #37778476
Павел Новокшонов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты забыл пробел поставить между drop table и закрывающей кавычкой. Должно быть 'drop table ', а иначе сливается. Еще я бы переписал DECLARE CURSOR, на FOR loop где open, fetch close идут не явно по умолчанию. Как-то так должно работать.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
replace procedure removet (IN DName VARCHAR(128), OUT Ret_Code  INTEGER)
begin
declare DatabaseName varchar (128);
declare TableName varchar (128);
declare sql_stmt varchar (100);

DECLARE EXIT HANDLER
FOR SQLEXCEPTION                  -- Exception Handling
begin
SET Ret_Code = SQLCODE;
end;

FOR cname AS TabTblCursor CURSOR FOR
select t.DatabaseName, t.TableName
from DBC.Tables t
where DatabaseName like '%' || :DName || '%' and TableName like any ('%_BKP%')
DO
set sql_stmt = 'drop table ' || cname.DatabaseName || '.' || cname.TableName;
CALL DBC.SysExecSQL (:sql_stmt);
END FOR;
set Ret_Code=0;
end;
...
Рейтинг: 0 / 0
СУБД Teradata
    #37778558
Andrey Eliseev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выполнил ваш вариант, были некоторые ошибки, поправил их, процедура создалась!
Но при вызове ее ( call removet(ABD); ABD - это DName ) выдается ошибка "The positional assignment list has too few values". Разве не только DName должно задаваться...
...
Рейтинг: 0 / 0
СУБД Teradata
    #37778611
Andrey Eliseev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ой, затупил что-то) надо ж так вызывать :call removet ('ABD',Ret_Code);
Теперь другая проблема, вызывается без ошибок, но после выполнения не удаляет таблицы...
...
Рейтинг: 0 / 0
СУБД Teradata
    #37778863
Andrey Eliseev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все, нашел ошибки по SQLCODE и исправил.
Спасибо огромное, Павел!
...
Рейтинг: 0 / 0
СУБД Teradata
    #37787593
Andrey Eliseev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не знаете, можно ли задавать по умолчанию значения in - параметров? Например, с помощью set.
И как можно контролировать процесс ошибок, чтобы например знать на какой таблице произошла ошибка ( к примеру, если на одну таблицу есть права на удаление-процедура ее удалит, на другую табл нет-она завершиться и выдаст return code, который будет указывать на ошибку что нет прав. но будет не понятно каких именно, на какую таблицу. Может можно создать какую-то переменную, которая будет в случае ошибки показывать на какой таблице произошла ошибка или как-то так...
...
Рейтинг: 0 / 0
СУБД Teradata
    #37788410
illeo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrey EliseevИ как можно контролировать процесс ошибок, чтобы например знать на какой таблице произошла ошибка ( к примеру, если на одну таблицу есть права на удаление-процедура ее удалит, на другую табл нет-она завершиться и выдаст return code, который будет указывать на ошибку что нет прав. но будет не понятно каких именно, на какую таблицу. Может можно создать какую-то переменную, которая будет в случае ошибки показывать на какой таблице произошла ошибка или как-то так...

Можно например сделать вторую out переменную, которая будет возвращать SQL-запрос или имя таблицы во время удаления которой завершилась процедура. Так же можно вести лог выполнения процедуры в какой-нибудь таблице. Или если у вас включено логирование, то можете поискать упавший запрос в DBC.QryLog.
...
Рейтинг: 0 / 0
СУБД Teradata
    #37788761
Andrey Eliseev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в DBC.QryLog нужной информации нет, плюс логирование включено не для всех пользователей, выполняющих процедуру. Вариант с out переменной подходит, сам про нее думал. Видимо как-то не правильно задаю ее, потому что при выполнении она пустая. taberror - имя этой переменной.
Код: sql
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.
replace procedure ABD.drop_tt (in DName varchar(128), out Ret_Code integer, out taberror char)
  begin
    declare DatabaseName varchar (128);
    declare TableName varchar (128);
    declare sql_stmt varchar (100);
   
       
       declare exit handler 
       for sqlexception  
       begin
       set Ret_Code = SQLCODE;
       set taberror = Tablename;
       end;

for cname as TabTblCursor cursor for 
  select *
    from ABD.select_tt
    where DatabaseName like '%' || :DName || '%'
 do
set sql_stmt = 'drop table ' || cname.DatabaseName || '.' || cname.TableName;
call DBC.SysExecSQL (:sql_stmt);
end for;
set Ret_Code=0;
  set taberror = TableName;
end;
...
Рейтинг: 0 / 0
СУБД Teradata
    #37788958
Andrey Eliseev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
все сделал сам)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / СУБД Teradata
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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