powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проверка/обработка правильности параметров в SQL квери
25 сообщений из 36, страница 1 из 2
Проверка/обработка правильности параметров в SQL квери
    #39997321
Неофит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
Проверка/обработка правильности параметров в SQL квери
    #39997331
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLВедь не всегда можно пригладить параметр через nvl() и продолжить, иногда что-то настолько
наперекосяк, что желательно не пытаться создать рекорд сет, а выкинуть исключение, пусть
выше обрабатывают.

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

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

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

Правильность значений, при правильном типе данных, в любом случае описывается вашей бизнес-логикой.
...
Рейтинг: 0 / 0
Проверка/обработка правильности параметров в SQL квери
    #39997348
Неофит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
Проверка/обработка правильности параметров в SQL квери
    #39997363
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env

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


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

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

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

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

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

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

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

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


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

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

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

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

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

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

Ну или банальный вариант: пользователь/оператор просто не ввел нужных данных в базу ))) - запрос не работает
...
Рейтинг: 0 / 0
Проверка/обработка правильности параметров в SQL квери
    #39997393
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неофит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
Проверка/обработка правильности параметров в SQL квери
    #39997411
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov
НеофитSQL
А как вы поступаете, когда запрос работал, а потом что-то вне запроса сломалось и запрос перестал работать?
Как перестал?
Забастовку объявил?
Ушёл в нирвану?
Выдал слишком много данных?
Выдал слишком мало данных?
Вообще ничего не выдал?
Выдал что-то, похожее на лажу?


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

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

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

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

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

То есть абсолютно всё шифрование, включая RSA и AES не может быть использовано в
коммерческом софте. Интересная новость...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проверка/обработка правильности параметров в SQL квери
    #39997432
Неофит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
Проверка/обработка правильности параметров в SQL квери
    #39997446
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLРассуждение странное и ошибочное, учитывая что у крипто API есть около полусотни кодов ошибок.

Чтобы оно перестало быть странным достаточно изучить непосредственно алгоритмы, а не
библиотеку вокруг них.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проверка/обработка правильности параметров в SQL квери
    #39997470
Неофит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
Проверка/обработка правильности параметров в SQL квери
    #39997511
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроме логики, производительности, есть еще читаемость и сопровождаемость.

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

ну или можно квери в бегин-енд пихать
Код: 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
Проверка/обработка правильности параметров в SQL квери
    #39997568
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
В данном случае, условия ограничивают


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

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

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

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

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

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


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

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

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

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

andreymx

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

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


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

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


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

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

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


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