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

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

Вы чё, белены объелись?
Расскажи, из какой ноздри таку бредятину доставать надо?
Если Вы не согласны с моим утверждением, то пожалуйста, опровергните его. Или попробуйте ответить на вопрос: какой способ передачи параметров в функцию в С/С++ (без учета наличия перегрузок) позволяет логически сделать параметр необязательным (непроинициализированным) и в вызываемой функции определить, был ли передан (проинициализирован) тот или иной параметр.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002011
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad
booby
пропущено...

Вы чё, белены объелись?
Расскажи, из какой ноздри таку бредятину доставать надо?
Если Вы не согласны с моим утверждением, то пожалуйста, опровергните его. Или попробуйте ответить на вопрос: какой способ передачи параметров в функцию в С/С++ (без учета наличия перегрузок) позволяет логически сделать параметр необязательным (непроинициализированным) и в вызываемой функции определить, был ли передан (проинициализирован) тот или иной параметр.


Правильно ли я понял, что вы утверждаете буквально следующее:
При объявлении в разделе деклараций процедуры/функции/анонимного блока
переменной типа, например, pls_integer, на стеке выделяется память не под значение для этой переменной,
а всегда и обязательно под адрес к выделяемому в куче значению?
И значение Null в Pl/SQL всегда опознается по нулевому значению этого адреса?

Я, правда, не знаю, как оно на самом деле, расскажите.
Я свою белену закатаю в трубочку, если вы как-то сможете обосновать своё суждение.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002024
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, даже если на самом деле используется любая форма косвенности,
это означает лишь то, что что получение нуля в качестве адреса в параметре в PL/SQL невозможно в принципе.
Поэтому, и в таком случае тоже, аналогия с передачей nullptr в параметр в С++ - некорректна.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002027
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,
имхо в pl/sql есть признак на null
различает же он как-то null и '' пустую строку

.....
stax
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002034
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
booby,
...
различает же он как-то null и '' пустую строку
.....
stax

я уже не помню, где он их на самом деле различает.
Но право вдруг, когда-нибудь, начать повсеместно различать - точно за собой оставляет,
даже если не будет делать так никогда.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002035
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В каждом языке есть свои особенности и их нужно учитывать при написании кода, однако воевать с ними непродуктивно и бессмысленно.

Stax
null и '' пустую строку

Ну зачем ты это упомянул, сейчас начнется по 100500 кругу ...
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002037
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
AmKad,

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

Зы. Свои утверждения тоже хорошенько обдумай. Booby кое о чем уже намекал ещё до появления тебя в теме. Не вынуждай комментировать твои измышлизмы...

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

вот лобовое решение

create or replace
function MyAdd( a in integer, b in integer ) return integer is
begin
if a is null or b is null then
raise_application_error(-20999,'Не заданы значения параметра');
end if;
return a+b;
end;
/

select MyAdd(1,2) from dual;
select MyAdd(1,null) from dual;
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002052
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Stax
booby,
имхо в pl/sql есть признак на null
различает же он как-то null и '' пустую строку

.....
stax
ну сто раз же обсуждалось... и в доке есть...
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare
   procedure f(i in int) as
   begin dbms_output.put_line('int'); end;
   
   procedure f(i in varchar2) as
   begin dbms_output.put_line('chr'); end;
   
begin
   f(1);
   f('');
--   f(null);
end;
/


Код: plsql
1.
2.
3.
4.
int
chr

PL/SQL procedure successfully completed.


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare
   procedure f(i in int) as
   begin dbms_output.put_line('int'); end;
   
   procedure f(i in varchar2) as
   begin dbms_output.put_line('chr'); end;
   
begin
   f(1);
   f('');
   f(null);
end;
/


Код: plsql
1.
2.
3.
4.
5.
6.
7.
   f(null);
   *
ERROR at line 11:
ORA-06550: line 11, column 4:
PLS-00307: too many declarations of 'F' match this call
ORA-06550: line 11, column 4:
PL/SQL: Statement ignored

...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002053
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby

Правильно ли я понял, что вы утверждаете буквально следующее:
При объявлении в разделе деклараций процедуры/функции/анонимного блока
переменной типа, например, pls_integer, на стеке выделяется память не под значение для этой переменной,
а всегда и обязательно под адрес к выделяемому в куче значению?
В контексте моего утверждения вообще не имеет значения, как физически реализовано хранение переменных в памяти в Oracle. Строго говоря, поскольку я никогда не изучал исходники Oracle, я вообще не могу утверждать, что память под локальные переменные PL/SQL-функции или анонимного блока всегда выделяется на стеке машины, (то на что указывает регистр SP).

На контекст моего утверждение явно указывает мой вопрос, адресованный Вам. Ну, а смысл появления nullptr в c+11, как более безопасная альтернатива NULL, думаю Вам хорошо известен.

xtender
AmKad,

Подумай хорошенько... Посмотри контекст обсуждения, внимательно посмотри мой пример и еще раз подумай...
А что там думать, Саян? Ты передал честный int с нулевым значением в int-параметр функции. С таким же успехом можно было просто написать proc(0);. Что ты хотел показать?

xtender
Зы2. Пассаж про "мой" компилятор мне понравился
Когда в контексте С++ говорят "твой компилятор", то имеют в виду его конкретное название (или производителя), версию, платформу, под которую идет сборка, и настройки компиляции. И еще бывают неспецифицированные стандартом расширения.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002060
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
AmKad
Ты передал честный int с нулевым значением в int-параметр функции.
ты весь целиком же мой пример внимательно посмотрел? И про контекст обсуждения подумал? Еще один намек тебе - вот прямо совсем в лоб, чтобы вообще думать не надо было:
Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
$ cat constref.cpp && g++ -std=c++11 -w -o constref constref.cpp && ./constref && ./constref && ./constref 
#include <iostream>

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

int main(int argc, char** argv)
{
    int x=0;
    int a=123;
    int y;
    int z;
    proc(++x);
    proc(++y);
    proc(++z);
    return 0;
}
======
1 Yoohoo
======
32765 Yoohoo
======
1742994097 Yoohoo

======
1 Yoohoo
======
32766 Yoohoo
======
-524876047 Yoohoo

======
1 Yoohoo
======
32767 Yoohoo
======
1917494433 Yoohoo

...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002061
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Les,
НеофитSQL
Хочется запретить передачу null в качестве параметров на стадии компиляции


В эксепшн автор и сам уже умеет )
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002077
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
AmKad
Ты передал честный int с нулевым значением в int-параметр функции.
ты весь целиком же мой пример внимательно посмотрел? И про контекст обсуждения подумал? Еще один намек тебе - вот прямо совсем в лоб, чтобы вообще думать не надо было:
Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
$ cat constref.cpp && g++ -std=c++11 -w -o constref constref.cpp && ./constref && ./constref && ./constref 
#include <iostream>

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

int main(int argc, char** argv)
{
    int x=0;
    int a=123;
    int y;
    int z;
    proc(++x);
    proc(++y);
    proc(++z);
    return 0;
}
======
1 Yoohoo
======
32765 Yoohoo
======
1742994097 Yoohoo

======
1 Yoohoo
======
32766 Yoohoo
======
-524876047 Yoohoo

======
1 Yoohoo
======
32767 Yoohoo
======
1917494433 Yoohoo

Саян, я правда тебя не понимаю. Что ты хочешь показать? Что непроинициализированные локальные переменные имеют "случайные" значения (по факту инициализируются текущими значениями в стеке)? Или что на машинном уровне передача по ссылке реализована как передача по указателю? Если я настолько глуп, не соизволишь ли ты объяснить мне на понятном языке?
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002081
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender
Ты вообще понимаешь разницу run-time/compile time?

С большой долей вероятности автор топика имел ввиду примитивные типы данных в некоторых распространенных языках программирования, которые действительно не могут быть null и соответствие типов проверяется в большинстве случаев при компиляции.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002092
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
AmKad,

О том, что booby написал ещё в самом начале: про сишные UB куда ни плюнь...сравни сишный "int x;" и pl/sql "x int;"

Уж что-что, а си и даже современные плюсы сюда в контекст пихать мягко говоря не стоило...
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002096
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
graycode
xtender
Ты вообще понимаешь разницу run-time/compile time?

С большой долей вероятности автор топика имел ввиду примитивные типы данных в некоторых распространенных языках программирования, которые действительно не могут быть null и соответствие типов проверяется в большинстве случаев при компиляции.
потому ссылка на документацию и была... Надо хотя бы знать основы, да хотя посмотреть в sys.standard...

Зы. Пример ошибки времени компиляции выше был: 22203366
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002110
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри, был глюк какойто, д.б. так:

AmKad
...

На контекст моего утверждение явно указывает мой вопрос, адресованный Вам.

Вы задали мне такой вопрос:
AmKad..попробуйте ответить на вопрос: какой способ передачи параметров в функцию в С/С++ (без учета наличия перегрузок) позволяет логически сделать параметр необязательным (непроинициализированным) и в вызываемой функции определить, был ли передан (проинициализирован) тот или иной параметр

Ответа на него я не знаю , в частности потому, что вообще отношения ни C, ни С++ не имею.
Технически, "в стиле C/C++", на уровне подсистемы передачи параметров, это можно было бы делать передачей как раз nullptr для пропущенного параметра, изолированного в промежуточную ссылочную переменную.
Однако Вы, задавая такой такой вопрос, вероятно не просто знаете на него правильный ответ,
но и понимаете, как он обосновывает утверждение о том, что nullptr "по смыслу наиболее близкое значение к ораколовому null".

Что точно вы вы хотели сказать своим ответом в виде вопроса, если перевести его в утвердительное предложение?



AmKad
...
... Ну, а смысл появления nullptr в c+11, как более безопасная альтернатива NULL, думаю Вам хорошо известен.

В контексте данного конкретного топика это выглядит вообще как весёлая шутка:
Т.е., перевожу:
С++ развивается от C в направлении к Ada, в смысле непрерывного укрепления строгости системы типов,
а PL/SQL с рождения продрейфовал от Ada к "процедурным расширениям SQL", сразу и явно пожертвовав строгостью системы типов,
путём внедрения встроенного преобразования типов для значений.

Спасибо, посмеялся вместе с Вами.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002120
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
AmKad,

О том, что booby написал ещё в самом начале: про сишные UB куда ни плюнь...сравни сишный
Демонстрация UB через передачу NULL в int-овый параметр - это неудачный пример. Ввиду того, что NULL это и есть int, то есть фактически конкретное пронициализированное значение.

И проблему неинициализированных переменных нельзя назвать чисто сишной. Хотя, уверен, твой C++ компилятор при включении соответствующих опций-ворнингов обязательно укажет на них. Мой MSVC даже не дает компилировать такой кусок кода.

Если мы хотим продемонстрировать UB через передачу параметров по ссылке, можно постараться придумать куда более общий пример c разыменованием указателя.
Код: plaintext
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.
30.
31.
32.
#include <iostream>

class A {
public:
    A(int X, int Y) : x(X), y(Y) { }
    ~A() {x = -1; y = -1;}
    void Out() const {
        std::cout << "X=" << x << " Y=" << y << std::endl;
    };
private:
int x, y;
};

void OutA(const A& aObj){
    aObj.Out();
}

int main()
{   
    auto p = new A(11, 100);
    OutA(*p);
    delete p;
    OutA(*p); // UB
    return 0;
}


X=11 Y=100                                                                                                                                                                         
X=0 Y=0                                                                                                                                                                            
                                                                                                                                                                                  
                                                                                                                                                                                   
...Program finished with exit code 0                                                                                                                                               

https://onlinegdb.com/S1_gHx5BP
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002126
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
AmKad,

Про NULL в первом примере было вообще о понимании разницы null в pl/sql и в сях и с намёком про c++11
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002127
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby

Ответа на него я не знаю , в частности потому, что вообще отношения ни C, ни С++ не имею.
Ответ простой: передача посредством указателя. Если указатель нулевой, то параметр не передан.
Дополнение: в С+11 появился более безопасный способ указать нулевой указатель: nullptr.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002174
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

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

Кстати, это правда мог бы быть простой вариант реализации за малую цену общей производительности.
Но даже, если это на самом деле так, и Вы абсолютно правы в своем "почти приравнивании" nullptr в C++ и Null в pl/sql,
а белены объелся именно я, это не отменяет того, что в логическом отношении PL/SQL-Null - это самостоятельное значение.

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

В этом смысле сравнение там, где вы именно именно в качестве передаваемого параметра nullptr используете как аналогию,
для меня остаётся как выглядящее неприемлемым.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002180
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
booby,

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

...Объекты же как и коллекции в pl/sql тоже могут быть неинициализированными

если подразумевается, имеющими значение 0xFF, то в русском языке это называется - всегда инициализированы
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002185
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender

В оракле в случае переменных простых типов null - это спец значение 0xFF.


А вот тут неясно что под капотом. Кто знает может как в OCI - indicator variable в придачу.

SY.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002188
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В любом случае - возможность указать NOT NULL для IN/IN OUT параметров (runtime проверка естественно) было бы неплохо хотя и явная поверка в теле stored objects не смертельно.

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


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