Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Определить передан ли параметр на самом деле / 19 сообщений из 19, страница 1 из 1
05.12.2017, 11:17
    #39564226
PARAM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить передан ли параметр на самом деле
Здравствуйте!

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

Может быть профи знают какой - то тайный код, который позволит это сделать?


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create or replace procedure tst(p1 varchar2 := '', p2 integer := '') is
begin
    dbms_output.put_line('PARS: '||p1||' - '||p2);

    if p1 передан then -- Как установить, что передан, а не дефолт?
         действие;
    end if;
end;

----------------------------------
set serveroutput on size unlimited;
begin
    tst;
end;
...
Рейтинг: 0 / 0
05.12.2017, 11:18
    #39564229
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить передан ли параметр на самом деле
PARAMМожет быть профи знают какой - то тайный код, который позволит это сделать?overload vs default
...
Рейтинг: 0 / 0
05.12.2017, 11:21
    #39564231
PARAM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить передан ли параметр на самом деле
ElicPARAMМожет быть профи знают какой - то тайный код, который позволит это сделать?overload vs default

Да не хотелось бы перегрузкой делать (если вы это имели ввиду). Может переданные параметры помещаются в какой массив, как в js, например?
...
Рейтинг: 0 / 0
05.12.2017, 11:24
    #39564235
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить передан ли параметр на самом деле
PARAMМожет переданные параметры помещаются в какой массив, как в js, например?Чудес не бывает. Но ты сам можешь строить своё API на основе массивов (брррр…).
...
Рейтинг: 0 / 0
05.12.2017, 11:37
    #39564242
PARAM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить передан ли параметр на самом деле
ElicPARAMМожет переданные параметры помещаются в какой массив, как в js, например?Чудес не бывает. Но ты сам можешь строить своё API на основе массивов (брррр…).

Жаль, что чудес не бывает ))) И массив - действительно брр...

Ситуация отягощается еще и тем, что для текста невозможно разделить null и пустую строку (((
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create or replace procedure tst(p1 varchar2 := '', p2 integer := -1) is
begin
    dbms_output.put_line('PARS: '||p1||' - '||p2);
    if p1 != '' then
        dbms_output.put_line('1');
    end if; 
end;

----------------------------------
set serveroutput on size unlimited;
begin
    tst(null, null);
end;



Так можно было бы отличить переданный null от дефолтного значения (пустой строки).
...
Рейтинг: 0 / 0
05.12.2017, 11:48
    #39564251
avanyugin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить передан ли параметр на самом деле
PARAM,

Можно завернуть в пакет две процедуры с одинаковыми именем и разными аргументами...
...
Рейтинг: 0 / 0
05.12.2017, 11:51
    #39564253
PARAM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить передан ли параметр на самом деле
Единственное, что пришло в мой воспаленный мозг, это:

1. Все параметры сделать строковыми
2. Назначить им дефолтное значение - '%'
3. Проверять на соответствие этому символу и его наличие принимать за признак "не передан"
4. Надеяться на чудо )))

Жаль, что в Oracle нет библиотеки именно для обработки переданных параметров...
...
Рейтинг: 0 / 0
05.12.2017, 11:53
    #39564254
PARAM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить передан ли параметр на самом деле
avanyuginPARAM,

Можно завернуть в пакет две процедуры с одинаковыми именем и разными аргументами...

Можно, но это будет перегрузка. А зачем нам перегрузка, нам перегрузка не нужна )))
...
Рейтинг: 0 / 0
05.12.2017, 11:56
    #39564257
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить передан ли параметр на самом деле
PARAMЖаль, что в Oracle нет библиотеки именно для обработки переданных параметров...А в каком ЯП есть инструмент, без перегрузки позволяющий понять, что аргумент при вызове "не передан"/"не указан" или "передано значение по умолчанию"?
...
Рейтинг: 0 / 0
05.12.2017, 12:00
    #39564264
PARAM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить передан ли параметр на самом деле
AmKadPARAMЖаль, что в Oracle нет библиотеки именно для обработки переданных параметров...А в каком ЯП есть инструмент, без перегрузки позволяющий понять, что аргумент при вызове "не передан"/"не указан" или "передано значение по умолчанию"?

В JS формируется массив переданных параметров, насколько помню. По нему можно определить какие параметры были переданы и отличить от дефолтных.
...
Рейтинг: 0 / 0
05.12.2017, 12:05
    #39564274
Ikir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить передан ли параметр на самом деле
PARAM,

Странный подход: сначала устроить себе геморрой, а потом искать методы его лечения.
...
Рейтинг: 0 / 0
05.12.2017, 12:32
    #39564305
Foxter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить передан ли параметр на самом деле
IkirPARAM,

Странный подход: сначала устроить себе геморрой, а потом искать методы его лечения.

В каком смысле?
...
Рейтинг: 0 / 0
05.12.2017, 13:06
    #39564333
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить передан ли параметр на самом деле
IkirСтранный подход: сначала устроить себе геморрой, а потом искать методы его лечения.Вакцины/лекарства от некоторых бактерий так изобретались.
...
Рейтинг: 0 / 0
05.12.2017, 13:16
    #39564350
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить передан ли параметр на самом деле
FoxterВ каком смысле?Видимо это было такое замечание, что, мол, придумали в оракле отождествить пустую строку с null-ом, а ораклисты мучаются в попытке отличить одно от другого.
...
Рейтинг: 0 / 0
05.12.2017, 13:42
    #39564374
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить передан ли параметр на самом деле
PARAMПонимаю, что можно использовать заведомо невероятные дефолтные значения
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
create or replace procedure dropme_wtf_paranoia(p_par_phobia varchar2 := pkg_const.DEFAULT_VARCHAR2) is
  l_par_phobia varchar2(30) := '';
begin
  --setting defaults
  l_par_phobia := case when p_par_phobia = pkg_const.DEFAULT_VARCHAR2 then pkg_const.DEFAULT_PHOBIA else p_par_phobia end;
.....
end;
/


где параноидальные базовые константы никак не связаны с предметной областью приложения.

Если пользователь настолько туп, что передаёт базовую параноидальную константу, то считать его роботом и не реагировать дополнительно.
...
Рейтинг: 0 / 0
05.12.2017, 14:06
    #39564398
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить передан ли параметр на самом деле
envнастолько туп Я бы сказал "изобретателен".
...
Рейтинг: 0 / 0
05.12.2017, 15:59
    #39564512
Ikir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить передан ли параметр на самом деле
FoxterВ каком смысле?

В том смысле, что, если вам патологически необходимо отделить переданные параметры и дефолтные, то зачем присваивать дефолтные значения в объявлении процедуры? Присвойте их после обработки входных параметров.
...
Рейтинг: 0 / 0
05.12.2017, 16:13
    #39564525
pls-306
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить передан ли параметр на самом деле
Ikir Присвойте их после обработки входных параметров.Для этого придется определять, что пользователь не передал обязательный параметр. Внутри процедуры сделать этого не получится.
...
Рейтинг: 0 / 0
05.12.2017, 16:18
    #39564533
dba123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить передан ли параметр на самом деле
тогда проще, имхо, использовать функцию
Код: 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.
40.
41.
create or replace  function default_f(p_name varchar2) return varchar2
is
begin
    dbms_output.put_line('Inside default_f:'||p_name);
    return null;
end default_f;
/

create or replace  function default_f(p_name varchar2) return pls_integer
is
begin
    dbms_output.put_line('Inside default_f:'||p_name);
    return null;
end default_f;
/

create or replace procedure tst(
  p1 varchar2 := default_f($$PLSQL_UNIT_TYPE||':'||$$PLSQL_UNIT||':'||'P1'||':'||$$plsql_line)
, p2 integer  := default_f($$PLSQL_UNIT_TYPE||':'||$$PLSQL_UNIT||':'||'P2'||':'||$$plsql_line))
is
begin
    dbms_output.put_line('PARS: '||p1||' , '||p2);
end;
/

----------------------------------
--set serveroutput on size unlimited;
begin
    tst(null, null);
    tst(null, 1);
    tst(p2 => 2);
    tst(p1 => '1');
end;
/

PARS:  ,
PARS:  , 1
Inside default_f:PROCEDURE:TST:P1:2
PARS:  , 2
Inside default_f:PROCEDURE:TST:P2:3
PARS: 1 ,
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Определить передан ли параметр на самом деле / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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