Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запретить передачу null параметра в PL/SQL procedure / 25 сообщений из 114, страница 1 из 5
23.09.2020, 18:26
    #40001820
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
Добрый день,

я написал PL/SQL функцию которая ожидает несколько чисел-параметров.
Код: plsql
1.
2.
3.
4.
function MyAdd( a in integer, b in integer ) return integer is
begin
  return a+b;
end;



Хочется запретить передачу null в качестве параметров на стадии компиляции.
В логике этой моей функции null никогда не полезен, и его появление всегда говорит об ошибке в программе, в моем случае.

Я могу сделать обработку в ран тайм с nvl(), или бросить Exception, но не знаю PL/SQL достаточно глубоко, чтобы объявить параметры функции "null не принимает". Мне неизвестно, возможно ли вообще такое, потому что:

Код: plsql
1.
2.
3.
4.
n integer;
begin
  n := null;
  x := MyAdd( n, n );



В этом примере можно обмануть компилятор.

В других языках есть конструкции позволяющие синтаксически запретить null в параметрах, может и PL/SQL это умеет?
...
Рейтинг: 0 / 0
23.09.2020, 18:29
    #40001824
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
НеофитSQL,

Не умеет
...
Рейтинг: 0 / 0
23.09.2020, 18:30
    #40001826
istrebitel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
...
Рейтинг: 0 / 0
23.09.2020, 18:34
    #40001830
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
НеофитSQL,

Можно заморочиться

Код: plsql
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.
26.
27.
28.
29.
SQL> create or replace package dropme_pck is
  2      subtype int_not_null is int not null;
  3  end;
  4  /

Package created.

SQL> create or replace procedure dropme_p(p_int dropme_pck.int_not_null)
  2  is
  3  begin
  4      dbms_output.put_line(p_int);
  5  end;
  6  /

Procedure created.

SQL> exec dropme_p(1);

1

PL/SQL procedure successfully completed.

SQL> exec dropme_p(null);
BEGIN dropme_p(null); END;

               *
ERROR at line 1:
ORA-06550: line 1, column 16:
PLS-00567: cannot pass NULL to a NOT NULL constrained formal parameter
...
Рейтинг: 0 / 0
23.09.2020, 18:36
    #40001832
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
...
Рейтинг: 0 / 0
23.09.2020, 18:37
    #40001836
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
env,


НеофитSQL
на стадии компиляции.
...
Рейтинг: 0 / 0
23.09.2020, 18:40
    #40001839
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
НеофитSQL
В других языках есть конструкции позволяющие синтаксически запретить null в параметрах
"другие" языки тебе тоже стоит поучить нормально.
...
Рейтинг: 0 / 0
23.09.2020, 18:41
    #40001840
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
динамически получаемые параметры на этапе компиляции еще неизвестны.
...
Рейтинг: 0 / 0
23.09.2020, 18:53
    #40001845
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
env,

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

xtender,

ваши ответы бывают полезны и информативны. сегодня не тот случай, наверное погода.

Посмотрите конструкцию C/C++ proc( const TYPE& x ), где параметр передается по ссылке, но сама ссылка нулем быть не может.
При этом функция прекрасно принимает константы типа, и можно писать proc( 5 ) хотя язык не определяет указатели на такие литералы.
...
Рейтинг: 0 / 0
23.09.2020, 19:05
    #40001854
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure


В точку. Мои поиски не нашли эту тему, спасибо!
...
Рейтинг: 0 / 0
23.09.2020, 21:44
    #40001896
oragraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
НеофитSQL,

subtype?
...
Рейтинг: 0 / 0
24.09.2020, 01:05
    #40001921
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
НеофитSQL


...

Посмотрите конструкцию C/C++ proc( const TYPE& x ), где параметр передается по ссылке, но сама ссылка нулем быть не может.
При этом функция прекрасно принимает константы типа, и можно писать proc( 5 ) хотя язык не определяет указатели на такие литералы.


1) IN параметры в PL/SQL всегда pass by reference-to-const, то есть 100% точно
аналогичны C++ параметрам вида
Код: plaintext
1.
(const typename& paramname)

,
и ни при каких обстоятельствах не могут быть иными, by design.
Ясность и железобетонность работы IN параметра не только автоматически освобождает мозг от вопроса правильности
использования модификатора const, но и, при понимании того, что это именно и только
Код: plaintext
1.
(const typename& paramname)

, и никогда ничто иное, так же автоматически, дает все преимущества работы по ссылке.


2) В отличии от C++, на который вы ссылаетесь, в PL/SQL нет понятия "неинициализированная переменная",
это одна из причин, по которой в PL/SQL нет понятия "неопределённое поведение".

Все переменные всегда обязательно инициализируются значением,
и для unconstrained типов таким значением по умолчанию является Null (Null в PL/SQL это значение ),
а для ограниченных на Not Null типов вы обязаны указать начальное значение, согласующееся с прочими ограничениями типа.

3) Явно объявленное ограничение типа сорта Is Not Null всегда реализуется в виде атрибута типа значения, проверяемого в runtime,
оно принципиально не может быть проверено во время компиляции.
Исключением могли бы быть (может быть, и являются) Simple_* типы, т.к. на этапе компиляции проверка для них не требуется,
а фактически она всё равно возникает во время выполнения, как результат встроенного приведения типа фактического параметра к
типу формального, при их различии.
Именно и специально поэтому, если от кода требуется предельно и максимально достижимая производительность,
то и для входного параметра и внутри такого кода применяют не ограниченный на Not Null Тип.

4) Сравнивая PL/SQL с "другими языками", подразумевая это явно или нет, вы даете отсылки к таким "другим языкам",
которые являются языками программирования , но PL/SQL таковым не является .

В том смысле не является, в каком под "языками программирования" понимаются языки программирования общего назначения .
Таким языкам - языкам программирования общего назначения, запрещено нарушать закон исключения третьего.
И в этом существо дела.

PL/SQL проходит по другой категории - [i]процедурные расширения [/i] языка SQL.
Хотя он мог бы и языком программирования являться, но компания - владелец языка,
в стране своего существования, не рискует даже пытаться озвучивать такого сорта произношение,
дабы не возбуждать академически образованную общественность,
а все, что делала и делает в этом плане, делает так, чтобы и подозрений не могло возникать о возможности и допустимости
использования PL/SQL в отрыве от инфраструктуры Oracle Database.


PS
Вы пишите такую ахинею, да еще с такой уверенностью в том, что понимаете, что пишите, что ссылка документацию - проявление неслыханной к вам терпимости.
Маэстро, бросайте вы эту фигню, немедленно лифтуйтесь на 5-7, вообще, на сколько возможно позиций вверх.
Вам в начальники срочно надо.
...
Рейтинг: 0 / 0
24.09.2020, 01:18
    #40001922
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
booby

...
дает все преимущества работы по ссылке.
...

Ну, со всеми недостатками впридачу, конечно.
Алиасинг не отслеживается компилятором.
Точнее, иногда компилятор его видит, но сообщает об этом только в виде предупреждения.
...
Рейтинг: 0 / 0
24.09.2020, 01:32
    #40001923
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
booby
...
Именно и специально поэтому, если от кода требуется предельно и максимально достижимая производительность,
то и для входного параметра и внутри такого кода применяют не ограниченный на Not Null Тип.

...

здесь тоже, с оговоркой на то, что Simple_* типы самые быстрые by design.
И Not Null у них, похоже, чуть-чуть другой системы.
...
Рейтинг: 0 / 0
24.09.2020, 02:36
    #40001925
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
booby
.
.
.
простыня
.
.


Другими словами, как сказали выше раньше и короче, в PL/SQL невозможно отказаться от null параметра даже там, где ожидается 2-байтное число. Придется с этим жить, у каждого языка свои сильные и слабые стороны. Пережил Итаниум, переживу и это.

автор4) Сравнивая PL/SQL с "другими языками", подразумевая это явно или нет, вы даете отсылки к таким "другим языкам",
которые являются языками программирования, но PL/SQL таковым не является.

Лол, хорошо. оставайтесь пока при этом мнении :) Когда-нибудь почитайте Кнута.

Станет скучно - попробуйте передать null в putchar( int c ), расскажите как получилось.
...
Рейтинг: 0 / 0
24.09.2020, 02:59
    #40001926
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
booby
... в PL/SQL нет понятия "неопределённое поведение".
...

Впрочем, есть - в части значений OUT параметров вызываемой процедуры при возникновении в ней необработанной ошибки.
Однако это не подразумевает возможности неконтролируемого падения падения процесса,
обычно ассоциируемого с термином "неопределенное поведение" как неотъемлемая возможность такого поведения.
...
Рейтинг: 0 / 0
24.09.2020, 03:01
    #40001927
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
НеофитSQL

... попробуйте передать null в putchar( int c ), расскажите как получилось.


Вы бы сняли клоунский колпак.
Шутки у вас плоские, если всё ещё считать, что вы "продолжаете шутить".
...
Рейтинг: 0 / 0
24.09.2020, 03:05
    #40001928
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
НеофитSQL

... 2-байтное число...

что это, ты что - пьёшь по ночам?
...
Рейтинг: 0 / 0
24.09.2020, 03:44
    #40001929
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
НеофитSQL
C/C++ proc( const TYPE& x )
ну что за бред ты несешь... еще и по сям/плюсам здесь позориться хочешь?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
$ cat constref.cpp && g++ -std=c++11 -w -o constref constref.cpp && ./constref 1
#include <iostream>

void proc(const int& a)
{
    std::cout <<"======\n" << a << " Yoohoo\n";
}

int main(int argc, char** argv)
{
    int x;
    proc(x);
    x = argc==2?NULL:333333;
    proc(x);
    proc(NULL);
    return 0;
}
======
0 Yoohoo
======
0 Yoohoo
======
0 Yoohoo



Ты вообще понимаешь разницу run-time/compile time?

зы. Вообще, это ж додуматься надо было именно С в таком контексте упомянуть...
...
Рейтинг: 0 / 0
24.09.2020, 03:50
    #40001930
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
НеофитSQL
Станет скучно - попробуйте передать null в putchar( int c ), расскажите как получилось.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
$ cat constref.cpp && g++ -std=c++11 -w -o constref constref.cpp && ./constref 1
#include <iostream>

void proc(const int& a)
{
    std::cout <<"======\n" << a << " Yoohoo\n";
}

int main(int argc, char** argv)
{
    putchar(NULL);
    proc(NULL);
    proc(3);
    return 0;
}
======
0 Yoohoo
======
3 Yoohoo



НеофитSQL
Лол, хорошо. оставайтесь пока при этом мнении :) Когда-нибудь почитайте Кнута.
Не советуй того, что сам не осилил... Да и судя по тому, как ты осваиваешь документацию по ораклу, сомневаюсь, что осилишь.
...
Рейтинг: 0 / 0
24.09.2020, 05:18
    #40001932
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
booby,

Форум немного не так работает то что "по прочтении сжечь" лучше отправлять на почту у меня в профиле :)
...
Рейтинг: 0 / 0
24.09.2020, 06:39
    #40001940
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
xtender
Не советуй того, что сам не осилил... Да и судя по тому, как ты осваиваешь документацию по ораклу, сомневаюсь, что осилишь.
Но бисер мечете…
...
Рейтинг: 0 / 0
24.09.2020, 09:31
    #40001969
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
xtender
Код: plaintext
1.
2.
3.
4.
5.
$ cat constref.cpp && g++ -std=c++11 -w -o constref constref.cpp && ./constref 1
#include <iostream>

    proc(x);
    proc(NULL);




Не совсем честное сравнение, Саян. Скорее всего в твоем компиляторе, даже несмотря на с++11, NULL определен как
Код: plaintext
1.
#define NULL 0

(либо идет замена на таковое на этапе компиляции), так что твой NULL имеет тот же тип int с нулевым значением.

Если ты же ты хотел туда передать нулевой указатель nullptr (по смыслу наиболее близкое значение к ораколовому null), то код не скомпилится из-за разности типов.
...
Рейтинг: 0 / 0
24.09.2020, 09:58
    #40001980
Sah
Sah
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
А мне интересно, что Саян пишет... Так что польза есть :)
...
Рейтинг: 0 / 0
24.09.2020, 10:14
    #40001983
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить передачу null параметра в PL/SQL procedure
AmKad
...

Если ты же ты хотел туда передать нулевой указатель nullptr (по смыслу наиболее близкое значение к ораколовому null)...

Вы чё, белены объелись?
Расскажи, из какой ноздри таку бредятину доставать надо?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запретить передачу null параметра в PL/SQL procedure / 25 сообщений из 114, страница 1 из 5
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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