powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Отвалидировать запросы
20 сообщений из 20, страница 1 из 1
Отвалидировать запросы
    #39947180
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу поднять старую тему .

Вкратце: в базе лежат SQL DML запросы. Периодически структура базы меняется и запросы перестают выполняться. Мне нужно в определенный момент проверить валидны ли запросы или нет.

Сейчас это делается вызовом UDF, которая делает этим запросам Prepare и возвращает OK или текст ошибки.

Хотелось бы иметь функцию ibec_Prepare(), которая бы взяла этот функционал на себя.


С уважением, Vasilisk
...
Рейтинг: 0 / 0
Отвалидировать запросы
    #39947327
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ibec_GetStatementPlan есть.
...
Рейтинг: 0 / 0
Отвалидировать запросы
    #39947587
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
ibec_GetStatementPlan есть.
Супер! Спасибо большое
...
Рейтинг: 0 / 0
Отвалидировать запросы
    #39949309
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
ibec_GetStatementPlan
Он не работает для процедур
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE OR ALTER PROCEDURE sp_d_test (
  in_param VARCHAR(64))
RETURNS (
  out_param VARCHAR(64))
AS
BEGIN
  out_param = '';
END

Код: sql
1.
2.
3.
4.
5.
6.
EXECUTE ibeblock
AS
BEGIN
  var_sql = 'EXECUTE PROCEDURE sp_d_test(:p)';
  var_plan = ibec_GetStatementPlan(ibec_GetDefaultConnection(), var_sql, TRUE);
END

Unknown error.
Как бы наверное правильно, какой план от процедуры? Но изначально то хотелось функцию валидации запроса. Т.е. некий ibec_Prepare()
...
Рейтинг: 0 / 0
Отвалидировать запросы
    #39949319
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
какой план от процедуры?
Может для процедур нужно возвращать пустую строку, но не поднимать исключение?
...
Рейтинг: 0 / 0
Отвалидировать запросы
    #39949323
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Он не работает для процедур


И не должен. А что ты хочешь "отвалидировать" в CREATE PROCEDURE и зачем??
...
Рейтинг: 0 / 0
Отвалидировать запросы
    #39949348
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
А что ты хочешь "отвалидировать" в CREATE PROCEDURE
В EXECUTE PROCEDURE
_Vasilisk_
Код: sql
1.
2.
  var_sql = 'EXECUTE PROCEDURE sp_d_test(:p)';
  var_plan = ibec_GetStatementPlan(ibec_GetDefaultConnection(), var_sql, TRUE);

...
Рейтинг: 0 / 0
Отвалидировать запросы
    #39949363
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, понятно.
Ну, можно на "Unknown error" и проверять. Эта ошибка означает, что собственно prepare прошел успешно, а облом случился на запросе плана.
Пока других вариантов в эксперте нет.
...
Рейтинг: 0 / 0
Отвалидировать запросы
    #39949377
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
Ну, можно на "Unknown error" и проверять
Этот Unknown error сыпется только при Raised = true. Т.е. нужно ловить исключение и дергать ibec_err_Message()? Если Raised = false возвращается пустая строка

И кстати, при таком коде
Код: sql
1.
2.
for i = 1 to 5 do
  var_plan = ibec_GetStatementPlan(ibec_GetDefaultConnection(), var_sql, TRUE);

я получаю пять Unknown error. Почему скрипт не прерывается на первой? Опция Abort on error установлена
IBExpert
prepare прошел успешно, а облом случился на запросе плана.
Хорошо, воспримем как документированное поведение
IBExpert
Пока других вариантов в эксперте нет.
А планируется?
...
Рейтинг: 0 / 0
Отвалидировать запросы
    #39949434
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Этот Unknown error сыпется только при Raised = true. Т.е. нужно ловить исключение и дергать ibec_err_Message()? Если Raised = false возвращается пустая строка


Дергать ibec_err_Message не нужно, потому что сообщение ошибки в случае RaiseError = true возвращается как результат.
По идее, нужно просто проверить результат на пустую строку или эту самую unknown error в нем -

_Vasilisk_
я получаю пять Unknown error. Почему скрипт не прерывается на первой?


Баг, очевидно. Завтра проверю.

_Vasilisk_
А планируется?


Смотря что нужно. Если просто ошибку препарирования вернуть, если таковая случилась, то это на пять минут работы.
Но это как-то слишком примитивно: prepare больше информации возвращает.
Если уж делать, то возвращать, например, JSON с полным описанием результатов prepare.
...
Рейтинг: 0 / 0
Отвалидировать запросы
    #39949455
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, я пока сделал заготовку ibec_PrepareStatement. Она пока ничего не возвращает, только поднимает исключение.
Для твоих целей этого вроде достаточно.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
EXECUTE ibeblock
AS
BEGIN
  var_sql = 'execute procedure sp_d_test(:p)';
  try
    Res = ibec_PrepareStatement(ibec_GetDefaultConnection(), var_sql, '',  TRUE);
  except
    s = ibec_err_Message();
    ibec_ShowMessage(s);
  end
END
...
Рейтинг: 0 / 0
Отвалидировать запросы
    #39949468
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
Смотря что нужно. Если просто ошибку препарирования вернуть, если таковая случилась, то это на пять минут работы.
Вот это мне и нужно
IBExpert
Баг, очевидно
Там какой-то сюрреализм

выполняем один раз, RaiseError = true
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
EXECUTE ibeblock
AS
BEGIN
  var_sql = 'EXECUTE PROCEDURE sp_d_test(:p)';
  var_res = '';
  FOR I = 1 TO 1 DO BEGIN
    var_plan = ibec_GetStatementPlan(ibec_GetDefaultConnection(), var_sql, TRUE);
    var_res = var_res || i || ': ' || var_plan || ibec_CRLF();
  END
  ibec_ShowMessage('Result: ' || var_res);
END

Получаю
1. Result: 1: Unknown error
2. Script executed with error
3. В панели сообщений Unknown error.

выполняем три раза, RaiseError = true
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
EXECUTE ibeblock
AS
BEGIN
  var_sql = 'EXECUTE PROCEDURE sp_d_test(:p)';
  var_res = '';
  FOR I = 1 TO 3 DO BEGIN
    var_plan = ibec_GetStatementPlan(ibec_GetDefaultConnection(), var_sql, TRUE);
    var_res = var_res || i || ': ' || var_plan || ibec_CRLF();
  END
  ibec_ShowMessage('Result: ' || var_res);
END

Получаю
1. IBEBlock MessageResult: 1: Unknown error.
2: Cannot perform operation -- DB is not open.
3: Cannot perform operation -- DB is not open.
2. Script executed with error
3. В панели сообщенийUnknown error.
Cannot perform operation -- DB is not open.
Cannot perform operation -- DB is not open.

выполняем три раза, RaiseError = false
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
EXECUTE ibeblock
AS
BEGIN
  var_sql = 'EXECUTE PROCEDURE sp_d_test(:p)';
  var_res = '';
  FOR I = 1 TO 3 DO BEGIN
    var_plan = ibec_GetStatementPlan(ibec_GetDefaultConnection(), var_sql, false);
    var_res = var_res || i || ': ' || var_plan || ibec_CRLF();
  END
  ibec_ShowMessage('Result: ' || var_res);
END

Получаю
1. IBEBlock MessageResult: 1:.
2:
3:2. Script executed successfully
3. В панели сообщений ничего
...
Рейтинг: 0 / 0
Отвалидировать запросы
    #39949487
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Там какой-то сюрреализм


В свежей версии проверяй.
...
Рейтинг: 0 / 0
Отвалидировать запросы
    #39949492
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_

выполняем три раза, RaiseError = false
...
Получаю
1. IBEBlock MessageResult: 1:.
2:
3:
2. Script executed successfully
3. В панели сообщений ничего

А тут что не так? Все правильно: план пустой, исключение не поднимается.
...
Рейтинг: 0 / 0
Отвалидировать запросы
    #39949519
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
А тут что не так?
То, что пустая строка при Raised = false возвращается и при ошибке prepare
...
Рейтинг: 0 / 0
Отвалидировать запросы
    #39949527
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
То, что пустая строка при Raised = false возвращается и при ошибке prepare


Так и задумано. Плана же нет. A RaiseError = FALSE означает, что ошибки тебе не интересны.
...
Рейтинг: 0 / 0
Отвалидировать запросы
    #39950428
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
В свежей версии проверяй.
Нормализовалось.

Теперь исходный вопрос
IBExpert
Дергать ibec_err_Message не нужно, потому что сообщение ошибки в случае RaiseError = true возвращается как результат.
При RaiseError = true я получаю исключение (что правильно), соответственно ни о каком возвращаемом результате говорить нельзя. И все-таки нужно вызвать ibec_err_Message чтобы убедиться, что у меня не Unknown error. Или я где-то не прав?
...
Рейтинг: 0 / 0
Отвалидировать запросы
    #39950448
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
В общем, я пока сделал заготовку ibec_PrepareStatement.
О! Спасибо. Как-то я пропустил это сообщение
...
Рейтинг: 0 / 0
Отвалидировать запросы
    #39950452
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
При RaiseError = true я получаю исключение (что правильно), соответственно ни о каком возвращаемом результате говорить нельзя. И все-таки нужно вызвать ibec_err_Message чтобы убедиться, что у меня не Unknown error. Или я где-то не прав?


А, кстати, да. Что-то я затупил. Конечно, если исключение возникло, то присваивание не выполнится.
И да, тогда надо ibec_err_Message дергать:
https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1324374&msg=22120021
...
Рейтинг: 0 / 0
Отвалидировать запросы
    #39950486
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уже увидел. Отлично работает. Но пока возникла проблема с перевыбросом исключения. Но это в соседней теме
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Отвалидировать запросы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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