Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Подскажите по процедуре / 25 сообщений из 25, страница 1 из 1
01.11.2016, 07:40
    #39338444
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
create or alter procedure GET_LAST_CONNECT
returns (
    D_STARTED date)
as
declare variable V_D date;
declare variable L_D date;
begin
  /* ищет в списке коннектов последний по текущему юзеру
     возвращает время его старта
     найденный коннект должен быть единственным или
     отличаться по времени от предпоследнего более чем на 2 секунды
     иначе вернёт '01.01.1900' как признак что коннект неопределён */

  /* по умолчанию считаем что не нашли */
  l_d=null; d_started=StrToDateFmt('dd.mm.yyyy','01.01.1900'); /* преобразование строки в дату с помощью функции StrToDateFmt из Delphi (время не отрабатывает только дату) */
  for select mon$timestamp from mon$attachments where mon$user=user
        order by mon$timestamp desc
      into :v_d do begin
    if (l_d is null) then l_d=v_d; /* последний конект */
    else begin
      /* коннект не единственный (сейчас v_d - предпоследний коннект) */
      if (l_d-v_d>0.00003) then d_started=l_d; /* если между последним и предпоследним разница по времени более 2 секунд */
      suspend; exit;
      /* разница в 1-ну секунду = 0,000011574
         разница в 2-е  секунды = 0,000023148
         ... */
    end
  end
if (l_d is not null) then d_started=l_d; /* если коннект единственный */ suspend; end




нужно добавить в начало условие
if
select left(current_user, 2) from RDB$DATABASE = 'SM'
then

Чтобы процедура отрабатывала только если имя пользователя начинается с SM. Пробовал по разному, постоянно получаю ошибку парсера.
create or alter procedure GET_LAST_CONNECT
returns (
D_STARTED date)
as
declare variable V_D date;
declare variable L_D date;
begin

if

select left(current_user, 2)
from RDB$DATABASE = 'SM'

then
/* ищет в списке коннектов последний по текущему юзеру
возвращает время его старта
найденный коннект должен быть единственным или
отличаться по времени от предпоследнего более чем на 2 секунды
иначе вернёт '01.01.1900' как признак что коннект неопределён */

/* по умолчанию считаем что не нашли */
L_D = null;


create or alter procedure GET_LAST_CONNECT
returns (
D_STARTED date)
as
declare variable V_D date;
declare variable L_D date;
begin

if
begin
select left(current_user, 2)
from RDB$DATABASE = 'SM'
end
then


create or alter procedure GET_LAST_CONNECT
returns (
D_STARTED date)
as
declare variable V_D date;
declare variable L_D date;
begin

if
begin
select left(current_user, 2)
from RDB$DATABASE = 'SM'
end
then
/* ищет в списке коннектов последний по текущему юзеру
возвращает время его старта
найденный коннект должен быть единственным или
отличаться по времени от предпоследнего более чем на 2 секунды
иначе вернёт '01.01.1900' как признак что коннект неопределён */

/* по умолчанию считаем что не нашли */
begin
L_D = null;
D_STARTED = STRTODATEFMT('dd.mm.yyyy', '01.01.1900');/* преобразование строки в дату с помощью функции StrToDateFmt из Delphi (время не отрабатывает только дату) */
for select MON$TIMESTAMP
from MON$ATTACHMENTS
where MON$USER = user
order by MON$TIMESTAMP desc
into :V_D
do
begin
if (L_D is null) then
L_D = V_D;/* последний конект */
else
begin
/* коннект не единственный (сейчас v_d - предпоследний коннект) */
if (L_D - V_D > 0.00003) then
D_STARTED = L_D;/* если между последним и предпоследним разница по времени более 2 секунд */
suspend;
exit;
/* разница в 1-ну секунду = 0,000011574
разница в 2-е секунды = 0,000023148
... */
end
end

if (L_D is not null) then
D_STARTED = L_D;/* если коннект единственный */
suspend;
end
end
...
Рейтинг: 0 / 0
01.11.2016, 08:09
    #39338454
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Gallemar,

if ( (select ...) = 'SM')

if (CURRENT_USER starting with 'SM')
...
Рейтинг: 0 / 0
01.11.2016, 08:15
    #39338458
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Gallemar,
Код: sql
1.
d_started=StrToDateFmt('dd.mm.yyyy','01.01.1900');



UDF тут не нужна


Код: sql
1.
d_started=CAST('01.01.1900' AS DATE);
...
Рейтинг: 0 / 0
01.11.2016, 09:52
    #39338515
afgm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Gallemar,

ну и до кучи по самой процедуре, кроме уже сказанного:
- возможно лучше DATEDIFF вместо констант
- L_D и V_D не тип date, а timestamp
- возможно (не знаю точно задачи) стоит работать с mon$attachments в автономной транзакции, т.к. мониторинг "запекается" при первом обращении
...
Рейтинг: 0 / 0
01.11.2016, 13:07
    #39338784
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Симонов ДенисUDF тут не нужна

Да это не мой код, чужая база, в своё время мигрированая с IB, c кучей соответствующего мезозоя
...
Рейтинг: 0 / 0
01.11.2016, 18:28
    #39339258
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
afgmGallemar,
- L_D и V_D не тип date, а timestamp

timestamp есть в первом диалекте?

afgm- возможно (не знаю точно задачи) стоит работать с mon$attachments в автономной транзакции, т.к. мониторинг "запекается" при первом обращении
"запекается" это как?
...
Рейтинг: 0 / 0
01.11.2016, 18:51
    #39339283
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Gallemartimestamp есть в первом диалекте?Есть. А почему удивление?
...
Рейтинг: 0 / 0
01.11.2016, 18:58
    #39339290
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Ivan_Pisarevsky,

из источников:
TIMESTAMP
Этот тип данных доступен только в 3-м диалекте, состоит из двух 32-битных слов и хранит дату
со временем. Такое хранение эквивалентно типу DATE 1-го диалекта.
...
Рейтинг: 0 / 0
01.11.2016, 19:01
    #39339295
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Hello, Gallemar!
You wrote on 1 ноября 2016 г. 19:01:18:

Gallemar> /Этот тип данных доступен только в 3-м диалекте/хрень.
где взял?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
01.11.2016, 19:07
    #39339301
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Мимопроходящий,

Руководство по языку
SQL СУБД Firebird 2.5
20 июля 2016 — v.0469-1 для Firebird 2.5.6
...
Рейтинг: 0 / 0
01.11.2016, 19:15
    #39339308
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Gallemarнужно добавить в начало условие
if
select left(current_user, 2) from RDB$DATABASE = 'SM'
как же народу rdb$database припекло. Ну вот за каким фигом тут селект, если можно просто написать

if (left(current_user, 2) = 'SM') then
???
И pastor еще более простой вариант привел.

p.s. про "народ" я потому, что регулярно вот эту бредятину вижу.
...
Рейтинг: 0 / 0
01.11.2016, 19:41
    #39339324
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
kdv, готов встать на путь исправления!!!
Нашел курсы http://www.ibase.ru/crs_online/, научите меня хорошему!!!
...
Рейтинг: 0 / 0
01.11.2016, 19:48
    #39339329
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Gallemartimestamp есть в первом диалекте?В 1-ом диалекте он называется DATE, но содержит и дату, и время
...
Рейтинг: 0 / 0
01.11.2016, 19:50
    #39339331
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Gallemar,

это надо переписать. TIMESTAMP и DATE полные синонимы в первом диалекте. Оба существуют
...
Рейтинг: 0 / 0
01.11.2016, 21:56
    #39339402
afgm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Gallemar "запекается" это как?
Описания таблиц мониторинга
FB langrefЭти таблицы являются виртуальными в том смысле, что до обращения к ним со стороны пользователя, никаких данных в них не записано. Они заполняются данными только в момент запроса пользователя...

Ключевым понятием функции мониторинга является снимок активности. Снимок представляет собой текущее состояние базы данных, содержащее множество информации о самой базе данных, активных соединениях, пользователях, транзакциях, подготовленных и выполняемых запросах и т.д.

Снимок создаётся при первой выборке из любой таблице мониторинга и сохраняется до конца текущей транзакции , чтобы запросы к множеству таблиц (например, главная-подчинённая) всегда возвращал непротиворечивые данные.
off для Симонова Дениса: из любой таблиц_е_
...
Рейтинг: 0 / 0
01.11.2016, 22:27
    #39339417
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Симонов Денис,

чудится мне, что до какого-то момента timestamp в 1 диалекте не существовал. Я в том смысле, что в ИБ 6 это вряд ли было. Хотя могу проверить.

afgmoff для Симонова Дениса: из любой таблиц_е_
я бы вообще переписал выделенное так:
"При первом обращении к любой таблице мониторинга производится снимок активности сервера, записывается во все таблицы мониторинга, и сохраняется в них до конца текущей транзакции. Это сделано для возможности получения консистентной информации при выборке из нескольких взаимосвязанных таблиц мониторинга."

Последнее предложение можно поменять на
"Это сделано для того, чтобы запросы к множеству таблиц мониторинга (например, главная-подчинённая) всегда возвращал непротиворечивые данные."

как-то так.
...
Рейтинг: 0 / 0
02.11.2016, 11:18
    #39339690
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Hello, Kdv!
You wrote on 2 ноября 2016 г. 11:17:03:

Kdv> чудится мне, что до какого-то момента timestamp в 1 диалекте не существовал.в 1.5 оно точно есть, а ставить IB6.0 лень.
хотя, можно же заглянуть в доку от IB6.0
но тоже, лень.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.11.2016, 12:33
    #39339808
sonkz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Мимопроходящий,
Interbase 6.0 Data Defenition Guide

InterBase supports the following datatypes:

INTEGER and SMALLINT

FLOAT and DOUBLE PRECISION

NUMERIC and DECIMAL

DATE, TIME, and TIMESTAMP

CHARACTER and VARYING CHARACTER

BLOB
...
Рейтинг: 0 / 0
02.11.2016, 12:41
    #39339821
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Hello, Sonkz!
You wrote on 2 ноября 2016 г. 12:38:50:

Sonkz> DATE, TIME, and TIMESTAMPнадо смотреть про различия 1 и 3 диалектов.
речь идёт о взаимозаменяемости DATE и TIMESTAMP в 1-м диалекте на уровне SQL.
(для движка оно понятное дело один хрен)

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.11.2016, 12:50
    #39339842
sonkz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Мимопроходящий, специально ctrl-f весь pdf прошерстил. Похоже нету там различий на этот счет в 1 и 3 диалектах.
...
Рейтинг: 0 / 0
02.11.2016, 12:57
    #39339855
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
был ещё Migration Guide, по переходу с 1-го на 3-й диалект.
скорее всего там.
а может быть в Whats New...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.11.2016, 14:12
    #39339985
sonkz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
http://docwiki.embarcadero.com/InterBase/XE7/en/Method_One:_In-place_Migration

читаем пункт 5 - получается DATE и TIMESTAMP - В первом диалекте синонимы.
...
Рейтинг: 0 / 0
02.11.2016, 14:14
    #39339990
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Hello, Sonkz!
You wrote on 2 ноября 2016 г. 14:12:50:

SonkzВ первом диалекте синонимы.так то ж XE7.
а мы про 6.0
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.11.2016, 14:33
    #39340015
sonkz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Мимопроходящий,
а разве с диалектами что-то менялось? ЕМНИП - нет.
...
Рейтинг: 0 / 0
02.11.2016, 14:37
    #39340018
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по процедуре
Hello, Sonkz!
You wrote on 2 ноября 2016 г. 14:36:40:

Sonkz> а разве с диалектами что-то менялось? ЕМНИП - нет.за IB не скажу, а в FB от версии к версии таки да.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Подскажите по процедуре / 25 сообщений из 25, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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