powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / PSQL Subfunction: не видит содержимое rdb$get_context('SYSTEM', . . . ). Why ?
6 сообщений из 6, страница 1 из 1
PSQL Subfunction: не видит содержимое rdb$get_context('SYSTEM', . . . ). Why ?
    #38613342
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

А чё это вложенная функция не видит пространство SYSTEM с встроенными контекстами ?
Например:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SQL> set list on;
SQL> set term ^;
SQL> execute block returns( ip_a varchar(21), ip_b varchar(21) ) as
CON>     declare function fn_internal_ip_address() returns varchar(21) deterministic
CON>         as begin
CON>             rdb$get_context('SYSTEM', 'CLIENT_ADDRESS');
CON>         end
CON> begin
CON>    ip_a = fn_internal_ip_address(); 
CON>   ip_b = rdb$get_context('SYSTEM', 'CLIENT_ADDRESS');
CON>   suspend;
CON> end^

IP_A                             <null> 
IP_B                            192.168.43.96

PS. LI-T3.0.0.31037
...
Рейтинг: 0 / 0
PSQL Subfunction: не видит содержимое rdb$get_context('SYSTEM', . . . ). Why ?
    #38613343
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... и в то же время, контексты уровня USER_SESSION & USER_TRANSACTION, установленыее вне вложенных функций, видятся ими ОК:
Код: sql
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.
execute block returns( ip_a varchar(21), ip_b varchar(21), ssn int, trn int ) as
    declare function fn_internal_ip_address() returns varchar(21) deterministic
        as begin
            rdb$get_context('SYSTEM', 'CLIENT_ADDRESS');
        end
    declare function fn_internal_ssn() returns varchar(21) deterministic
        as begin
            return rdb$get_context('USER_SESSION', 'MY_SESSION');
        end
    declare function fn_internal_trn() returns varchar(21) deterministic
        as begin
            return rdb$get_context('USER_TRANSACTION', 'MY_TRANSACTION');
        end
begin
  rdb$set_context('USER_SESSION', 'MY_SESSION', current_connection);
  rdb$set_context('USER_TRANSACTION', 'MY_TRANSACTION', current_transaction);

  ip_a = fn_internal_ip_address();
  ip_b = rdb$get_context('SYSTEM', 'CLIENT_ADDRESS');

  ssn = fn_internal_ssn();
  trn = fn_internal_trn();

  suspend;
end

IP_AIP_BSSNTRN192.168.43.9658901390406(да и если снаружи этого EB их объявлять, то всё Ок).
...
Рейтинг: 0 / 0
PSQL Subfunction: не видит содержимое rdb$get_context('SYSTEM', . . . ). Why ?
    #38613347
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,


CON> declare function fn_internal_ip_address() returns varchar(21) deterministic
CON> as begin
CON> return rdb$get_context('SYSTEM', 'CLIENT_ADDRESS');
CON> end
...
Рейтинг: 0 / 0
PSQL Subfunction: не видит содержимое rdb$get_context('SYSTEM', . . . ). Why ?
    #38613352
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

тьфу, глаза я замылил уже. Псип.

(хотя по-правильному компилятор должен был бы ругнуться, что ничего не возвращаю, хотя обещал :))
...
Рейтинг: 0 / 0
PSQL Subfunction: не видит содержимое rdb$get_context('SYSTEM', . . . ). Why ?
    #38613353
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

зачем ты вложенные функции как deterministic объявляешь? У меня почему то ощущение что для вложенных функций эта фича не работает
...
Рейтинг: 0 / 0
PSQL Subfunction: не видит содержимое rdb$get_context('SYSTEM', . . . ). Why ?
    #38613359
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисзачем ты вложенные функции как deterministic объявляешь? У меня почему то ощущение что для вложенных функций эта фича не работаетРаботает. И очень хорошо работает.
А нарыл я следующее:
Код: 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.
set term ^;
execute block returns(n int, elap int) as
  declare i int;
  declare q int;
  declare t timestamp;
  declare function fn_internal_determ() returns int deterministic as
  begin
    return rdb$get_context('SYSTEM', 'LOCK_TIMEOUT');
  end
  declare function fn_internal_common() returns int as
  begin
    return rdb$get_context('SYSTEM', 'LOCK_TIMEOUT');
  end
begin
  q=10000000;
  n=q;
  t='now';
  while(n>0) do begin
      -- время выполнения БЕЗ всяких вызовов: 2883 ms
      -- i=fn_internal_determ(); -- 1e7 ==> 3405 ms 
      --i=rdb$get_context('SYSTEM', 'LOCK_TIMEOUT'); -- 1e7 ==> 10418 ms
      --i=cast(rdb$get_context('SYSTEM', 'LOCK_TIMEOUT') as int); -- 1e7 ==> 11369 ms
      -- i=fn_internal_common(); -- 1e7 ==> 28088 ms 
      n=n-1;
  end
  elap=datediff(millisecond from t to cast('now' as timestamp));
  n=q;
  suspend;
end
^set term ;^
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / PSQL Subfunction: не видит содержимое rdb$get_context('SYSTEM', . . . ). Why ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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