Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проверка/обработка правильности параметров в SQL квери / 25 сообщений из 36, страница 1 из 2
10.09.2020, 15:05
    #39997321
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
Новичок в SQL, сейчас работаю с Ораклом 11.

Возник вопрос, как у осторожных программистов принято обрабатывать явно ошибочные параметры переданные в квери, или другие аварийные ситуации? Ведь не всегда можно пригладить параметр через nvl() и продолжить, иногда что-то настолько наперекосяк, что желательно не пытаться создать рекорд сет, а выкинуть исключение, пусть выше обрабатывают.

В знакомых мне процедурных языках программирования это решается легко, например вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
// функция подсчета объема ведер и бутылок
ERRORCODE CalcVesselVolume( const OBJECT& po ) // вызов по ссылке не даст передать NULL
{
    if( o.type != TYPE_BUCKET && 
        o.type != TYPE_BOTTLE )
        return ERROR_BAD_OBJECT_TYPE;
   ...

А в SQL или это не актуально, или я не знаю трюк как это сделать красиво, не портя слишком читабельность основной квери.

Если кто-то проверяет параметры на вшивость на языке SQL, как вы это делаете?
Хочется обойтись без добавления PL/SQL блока begin/end, и обработать проверку параметров в одном месте, а не разбросать по всей странице.
...
Рейтинг: 0 / 0
10.09.2020, 15:23
    #39997331
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
НеофитSQLВедь не всегда можно пригладить параметр через nvl() и продолжить, иногда что-то настолько
наперекосяк, что желательно не пытаться создать рекорд сет, а выкинуть исключение, пусть
выше обрабатывают.

Ну так и выкидывай исключение, в чём проблема-то?

А аффтар приложения, который не провалидировал значения перед скармливанием их серверу
пусть сам с этим разбирается.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.09.2020, 15:43
    #39997347
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
НеофитSQL,

Валидацию совпадения типов данных вызываемых процедур/полей таблиц вам всё равно придётся делать на клиенте.

Правильность значений, при правильном типе данных, в любом случае описывается вашей бизнес-логикой.
...
Рейтинг: 0 / 0
10.09.2020, 15:44
    #39997348
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
не знаю, как это сделать.

на псевдоязыке это было бы

Код: plaintext
1.
2.
3.
4.
5.
-- псевдоселект - он исполняется, но не создает рекордсет
non_select Raise_Exception(code,'Message') from dual where :type != TYPE_BUCKET and :type != TYPE_BOTTLE

-- рабочий селект, до него исполнение доберется только если проверка параметров прошла
select ...
А как такое в SQL написать? Raise_Application_Error из квери вызывать нельзя, псевдо-селектов тоже в языке нет.
Поэтому спрашиваю у знатоков, которые или такую проблему уже давно решили, или могут легко решить.
...
Рейтинг: 0 / 0
10.09.2020, 15:56
    #39997363
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
env

Валидацию совпадения типов данных вызываемых процедур/полей таблиц вам всё равно придётся делать на клиенте.
Правильность значений, при правильном типе данных, в любом случае описывается вашей бизнес-логикой.


"Не делай этого в SQL" это конечно ответ, но это не решение.

В простых случаях (один программист, отсутствие подчиненных квери, отсутствие middleware) за этим можно проследить.
Кто-то апгрейднул верхнюю квери - моя подчиненная квери перестала получать необходимые параметры. Я предпочитаю чтоб моя квери сбойнула сразу не увидев присутствия параметров, а не ждала полного цикла тестов (или хуже, жалобы клиента).

Есть конечно принцип GIGO - мусор пришел, мусор вышел. Пусть клиент догадывается, таблица пустая потому что данных нет, или потому что внутренняя ошибка случилась, или может кто-то полномочия подкрутил не туда.
...
Рейтинг: 0 / 0
10.09.2020, 16:01
    #39997368
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
НеофитSQLА как такое в SQL написать?

В SQL - никак. Garbage in - garbage out.

А какую реальную проблем ты пытаешься решить-то?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.09.2020, 16:17
    #39997379
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
Dimitry Sibiryakov

НеофитSQLА как такое в SQL написать?

В SQL - никак. Garbage in - garbage out.

А какую реальную проблем ты пытаешься решить-то?..


>> Я предпочитаю чтоб моя квери сбойнула сразу не увидев присутствия параметров, а не ждала полного цикла тестов (или хуже, жалобы клиента).

Возможно, я переношу подходы из другого мира, где к процедуре сразу пишут юнит-тест и добавляют его в мейк на случай когда кто-то неудачно поковыряется в коде, его код даже в сорс контрол не появится - автотест сразу бьет по рукам, высылает имейл с результатами проваленного теста. Но это было в тех местах, где пишут код так, чтоб к нему не возвращаться.

Наверное в SQL подход более "агильный", где это все не нужно, просто ожидается что постоянно что-то будет ломаться/чиниться понемножку без всякой инструментации, историй изменений или автоматических тестов. Пока еще не разобрался.
...
Рейтинг: 0 / 0
10.09.2020, 16:24
    #39997382
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
Для начала разберись: процедура у тебя или запрос. Это две большие разницы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.09.2020, 16:35
    #39997386
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
Dimitry Sibiryakov, запрос конечно.

это видно из заголовка, начального вопроса и контекста.

А как вы поступаете, когда запрос работал, а потом что-то вне запроса сломалось и запрос перестал работать?
Или вы единственный программист, и вопрос ответственности неактуален?

Интересно.
...
Рейтинг: 0 / 0
10.09.2020, 16:43
    #39997390
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
НеофитSQL
А как вы поступаете, когда запрос работал, а потом что-то вне запроса сломалось и запрос перестал работать?
Как перестал?
Забастовку объявил?
Ушёл в нирвану?
Выдал слишком много данных?
Выдал слишком мало данных?
Вообще ничего не выдал?
Выдал что-то, похожее на лажу?
...
Рейтинг: 0 / 0
10.09.2020, 16:49
    #39997392
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
Basil A. Sidorov,

Ну или банальный вариант: пользователь/оператор просто не ввел нужных данных в базу ))) - запрос не работает
...
Рейтинг: 0 / 0
10.09.2020, 16:50
    #39997393
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
НеофитSQL,

SQL не процедурный язык, это декларативное определение способа извлечения данных. Считайте, что у вас есть код пример вызова метода закрытой библиотеки. Что вы передадите на вход - внутри и в самом вызове вы не проверите.

Любая проверка параметров подобного вызова должна быть снаружи. Внутри запроса на SQL вы можете задать логику интерпретации отсутствующих значений, либо получить явные ошибки конвертации типов. При этом успешные неявные конвертации даже вернут результат, но не тот, что вы ожидаете.

Например
Код: plsql
1.
select 1 id from dual where date '2010-12-10' = :d union all select 2 from dual where date '2010-10-12' = :d

, где :d передаётся строкой '10122010' и в зависимости от NLS либо совпадёт с одной из дат, либо не совпадёт ни с одной (20.10.1012) либо вообще упадёт на преобразовании из строки в дату при сравнении.
...
Рейтинг: 0 / 0
10.09.2020, 17:36
    #39997411
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
Basil A. Sidorov
НеофитSQL
А как вы поступаете, когда запрос работал, а потом что-то вне запроса сломалось и запрос перестал работать?
Как перестал?
Забастовку объявил?
Ушёл в нирвану?
Выдал слишком много данных?
Выдал слишком мало данных?
Вообще ничего не выдал?
Выдал что-то, похожее на лажу?


Может по-разному сбойнуть. К перечисленным вариантам:
- запустил мусор дальше в систему, где осторожный программист поймал мусор и выдал ошибку с указанием на мою процедуру
- создал рекордсет, на основании которого неверно совершились важные действия (напр, денежный перевод или удаление данных)
- показал на экране правдоподобный, но неправдивый отчет по продажам. И комиссиям. и премиям. И налогам.
- переправил мусор в парсер, который крэшнулся (если моя квери исполняется при старте, перезапуск снова крэшнется.

В знакомых мне процедурных языках программирования этот вопрос не ставится после 1990го.
Огромные ресурсы тратятся на проверку системы, в том числе коммерческие системы типа BoundsChecker, Fortify, и т.д.
Самый простой и первый способ для программиста работающего в команде не стать козлом (отпущения), который не вылазит из дебагера, это тщательно проверять параметры на вшивость. Код, работающий по принципу garbage in - garbage out считается непригодным для коммерческого использования.

Но это в другом мире драйверов и покупного софта. Я постепенно привыкаю, что тут по-другому.

Пока решил эту проблему двумя способами, попутно нашел серьезный баг в Оракле 11.

Проконсультируюсь с коллегой, если решение годное, опубликую здесь.
...
Рейтинг: 0 / 0
10.09.2020, 18:00
    #39997418
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
НеофитSQLКод, работающий по принципу garbage in - garbage out считается непригодным для
коммерческого использования.

То есть абсолютно всё шифрование, включая RSA и AES не может быть использовано в
коммерческом софте. Интересная новость...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.09.2020, 19:16
    #39997432
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
Dimitry Sibiryakov

НеофитSQLКод, работающий по принципу garbage in - garbage out считается непригодным для
коммерческого использования.

То есть абсолютно всё шифрование, включая RSA и AES не может быть использовано в
коммерческом софте. Интересная новость...


Рассуждение странное и ошибочное, учитывая что у крипто API есть около полусотни кодов ошибок.
Тут можно посмотреть для винды: https://docs.microsoft.com/en-us/windows/win32/seccrypto/capicom-error-code

Среди них полно кодов ошибок параметров, напр.
- CAPICOM_E_STORE_EMPTY
- CAPICOM_E_ATTRIBUTE_INVALID_NAME
- CAPICOM_E_INVALID_KEY_LENGTH
...
Рейтинг: 0 / 0
10.09.2020, 20:09
    #39997446
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
НеофитSQLРассуждение странное и ошибочное, учитывая что у крипто API есть около полусотни кодов ошибок.

Чтобы оно перестало быть странным достаточно изучить непосредственно алгоритмы, а не
библиотеку вокруг них.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.09.2020, 21:19
    #39997470
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
Решение, которое мне показалось наиболее читабельным.
Протестировал - исключение происходит при невыполнении любого из условий.
В данном случае, условия ограничивают сроки работы квери с 2020 по 2036 год.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
-- опубликовано на правах GPL v3 / published under GPL v3
-- Автор/Author: НеофитSQL
--
-- инлайн квери precheck перечисляет через "или" все условия, при которых исполнение
-- квери следует прекратить и выдать сообщение об ошибке
-- глобальная функция fAbortQuery оборачивает процедуру Raise_Application_Error,
-- т.к. вызов процедур не разрешен из SQL select
with precheck as (select besapi.fAbortQuery('precheck failed in test.sql') from dual
                   where sysdate < to_date('2020','yyyy') or
                         sysdate > to_date('2037','yyyy'))

-- первая строчка задает имена и типы колонок, но не входит в рекордсет
-- если precheck условия выполнились. Если prechek выстрелил, квери вылетит с ошибкой
          select '?' as Question,      0 as Answer from dual where (select * from precheck)='as'
union all select '2x2=?',              4           from dual
union all select 'Сломаных индексов:', count(*)    from USER_INDEXES where upper(status) != 'VALID'
union all select 'Всего таблиц:',      count(*)    from ALL_OBJECTS where upper(object_type) = 'TABLE'
...
Рейтинг: 0 / 0
11.09.2020, 06:17
    #39997511
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
Кроме логики, производительности, есть еще читаемость и сопровождаемость.

Я бы не хотел после вас сопровождать код.
...
Рейтинг: 0 / 0
11.09.2020, 10:08
    #39997537
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
если хочется обработку ораклом делать
то ХП

ну или можно квери в бегин-енд пихать
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
BEGIN
    IF :p_date < SYSDATE THEN
       raise_application_error(-20900, 'bad date');
    END IF;
    OPEN :p_cursor FOR SELECT :p_date from dual;
end;

конечно, если клиент понимает тип курсор
...
Рейтинг: 0 / 0
11.09.2020, 11:10
    #39997568
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
НеофитSQL
В данном случае, условия ограничивают


Т.е. проще говоря, внесли бизнес-логику проверки значений в статичный запрос без параметров.

А теперь протестируйте ваше решение на запросе с параметрами и передайте число вместо даты, например.

Как уже было сказано, логику интерпретации значений параметров можно зашить в запрос. Но это не защитит его от ошибок конвертации типов или от разной интерпретации значений в зависимости от окружения, если типы оказались конвертируемыми успешно.
...
Рейтинг: 0 / 0
11.09.2020, 11:46
    #39997578
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
env
1. Но это не защитит его от ошибок конвертации типов
2. или от разной интерпретации значений в зависимости от окружения, если типы оказались конвертируемыми успешно.
первое это хорошо
а второе это ужасно
...
Рейтинг: 0 / 0
11.09.2020, 12:48
    #39997608
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
andreymx,

У ТС же боль в том, чтобы
НеофитSQL
не стать козлом (отпущения)
, если на вход его декларативному объявлению пути доступа к данным через стопятьсот обёрток поверх прилетят некузявые параметры.

При этом человек наивно ожидает от декларативного языка возможностей и функционала процедурного.
...
Рейтинг: 0 / 0
11.09.2020, 16:54
    #39997712
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
авторТ.е. проще говоря, внесли бизнес-логику проверки значений в статичный запрос без параметров.

А теперь протестируйте ваше решение на запросе с параметрами и передайте число вместо даты, например.


Спасибо,у меня код так и делает - проверяет что объект-параметр существует, и правильного типа. Дату использовал в качестве примера для форума.

Как уже было сказано, логику интерпретации значений параметров можно зашить в запрос. Но это не защитит его от ошибок конвертации типов или от разной интерпретации значений в зависимости от окружения, если типы оказались конвертируемыми успешно.

Тут я не совсем понял что вы хотели сказать. Проверка параметров защищает только от плохих параметров. Она не защищает от собственных ошибок в другом месте, поломок дисков или пропажи электропитания, т.к. это не входит в задачу проверок параметров.
...
Рейтинг: 0 / 0
11.09.2020, 17:03
    #39997714
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
andreymx
если хочется обработку ораклом делать
то ХП

Извините, не знаком с термином ХП. что это?

andreymx

ну или можно квери в бегин-енд пихать

конечно, если клиент понимает тип курсор


Верно, это был первый порыв, т.к. привычно.
Но клиент не понимает курсор, и также хочется эффективно научиться пользоваться
новым для меня языком, не уподобляясь тем, кто пишет на всех языках как на бейсике.
...
Рейтинг: 0 / 0
11.09.2020, 17:09
    #39997716
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка/обработка правильности параметров в SQL квери
dmdmdm
Кроме логики, производительности, есть еще читаемость и сопровождаемость.

Я бы не хотел после вас сопровождать код.


Экспертами не рождаются, экспертами становятся (и то не все).

Мне бы хотелось чтобы мой код был максимально читаемым и сопровождаемым.
По этой причине я пишу комментарии, не увлекаюсь вложенными подзапросами,
даю переменным описательные названия.

Наверное есть и другие полезные методы - поделитесь если знаете.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проверка/обработка правильности параметров в SQL квери / 25 сообщений из 36, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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