Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Миграция БД - функция error_message() / 7 сообщений из 7, страница 1 из 1
22.12.2016, 12:52
    #39372800
RENO4
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция БД - функция error_message()
Всем доброе время суток!

Вопрос такой - в процессе миграции БД с платформы MS SQL на PG SQL 9.6.x встречаются различные встроенные в БД вызовы типа error_message(). Чтобы не переписывать каждый раз код, не тратить на это дополнительное время и автоматизировать процесс хотелось бы иметь возможность создать аналогичные функции-обертки на PG SQL.

Проблема заключается в том, что в отличие от стандартных ISNULL(), GETDATE() и т.п. функции обработки ошибок вызываются в контексте исключения. И если просто написать в PLPGSQL в теле функции-обертки что-то вроде

GET STACKED DIAGNOSTICS

то получится

ERROR: GET STACKED DIAGNOSTICS cannot be used outside an exception handler
CONTEXT: PL/pgSQL function error_message() line 5 at GET STACKED DIAGNOSTICS

Какие будут мысли и предложения по этому поводу?
...
Рейтинг: 0 / 0
22.12.2016, 13:01
    #39372819
YuriyRusinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция БД - функция error_message()
Писать в соответствующей процедуре что-то типа

Код: plsql
1.
2.
exception when others then 
    return someFuncErrorProc ();



где функция someFuncErrorProc () вернет индикатор ошибки.
...
Рейтинг: 0 / 0
22.12.2016, 13:06
    #39372823
RENO4
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция БД - функция error_message()
YuriyRusinovПисать в соответствующей процедуре что-то типа

Код: plsql
1.
2.
exception when others then 
    return someFuncErrorProc ();



где функция someFuncErrorProc () вернет индикатор ошибки.

Ага, именно так и сделал - получил обозначенную ошибку.

Дело в том, что не смотря на то, что функция error_message() вызывается в контексте исключения, код в самой функции error_message() работает в обычном контексте, где GET STACKED DIAGNOSTICS не применимо.
...
Рейтинг: 0 / 0
22.12.2016, 13:19
    #39372851
YuriyRusinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция БД - функция error_message()
И пример отсюда не работает ? Тогда хотелось бы взглянуть на код функции, порождающей exception.
...
Рейтинг: 0 / 0
22.12.2016, 13:29
    #39372880
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция БД - функция error_message()
RENO4,
заведите структуру. в блоке exception when её заполняйте. и передавайте вашей "обобщённой" ф-ии
...
Рейтинг: 0 / 0
22.12.2016, 13:33
    #39372884
RENO4
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция БД - функция error_message()
YuriyRusinovИ пример отсюда не работает ? Тогда хотелось бы взглянуть на код функции, порождающей exception.

Тот пример здесь не применим по вышеозвученной причине.

Вот код функции-обертки error_message(), возвращающей текст ошибки, например:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE OR REPLACE FUNCTION public.error_message(
	)
    RETURNS text
    LANGUAGE 'plpgsql'
    COST 100.0
    VOLATILE NOT LEAKPROOF 
AS $function$

declare
	SQLMessage text;
begin
	get stacked diagnostics
    	SQLMessage = MESSAGE_TEXT;
	return SQLMessage;
end

$function$;



Вот код функции-примера, где провоцируется ошибка -
Код: 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.
CREATE OR REPLACE FUNCTION test.test_er(
	)
    RETURNS text
    LANGUAGE 'plpgsql'
    COST 100.0
    VOLATILE NOT LEAKPROOF 
AS $function$

declare
	em text;
    SQLMessage text;
begin
	insert into test.test_excep values (1, 1, current_date, 'TEST1');
    em = 'TS: '; -- || error_message();
    return em;
exception
	when others then
    	em = 'TE: ' || error_message();
--		get stacked diagnostics
--			SQLMessage = MESSAGE_TEXT;

	return em; -- || '\r\nSQLM: ' || SQLMessage;
end

$function$;
...
Рейтинг: 0 / 0
22.12.2016, 13:36
    #39372894
RENO4
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция БД - функция error_message()
qwwqRENO4,
заведите структуру. в блоке exception when её заполняйте. и передавайте вашей "обобщённой" ф-ии

Это будет работать, но будет по определению ущербно, и задаче не соответствует.
Задача как раз в том, чтобы минимизировать изменение исходного кода.
А функция-обертка, которая без дополнительных костылей не функционирует, не выполняет возложенной на нее задачи.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Миграция БД - функция error_message() / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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