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

я написал 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
Запретить передачу null параметра в PL/SQL procedure
    #40001824
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Не умеет
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001826
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001830
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неофит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
Запретить передачу null параметра в PL/SQL procedure
    #40001832
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001836
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
env,


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

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

xtender,

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

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


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

subtype?
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001921
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неофит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
Запретить передачу null параметра в PL/SQL procedure
    #40001922
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby

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

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

...

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


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

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

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

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

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

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


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

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

что это, ты что - пьёшь по ночам?
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001929
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Неофит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
Запретить передачу null параметра в PL/SQL procedure
    #40001930
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Неофит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
Запретить передачу null параметра в PL/SQL procedure
    #40001932
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
booby,

Форум немного не так работает то что "по прочтении сжечь" лучше отправлять на почту у меня в профиле :)
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001940
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
Не советуй того, что сам не осилил... Да и судя по тому, как ты осваиваешь документацию по ораклу, сомневаюсь, что осилишь.
Но бисер мечете…
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001969
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Запретить передачу null параметра в PL/SQL procedure
    #40001980
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А мне интересно, что Саян пишет... Так что польза есть :)
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001983
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad
...

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

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


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