![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
В Oracle есть dual, а что есть в InterBase e?
csf © (2001-12-10 16:28:00)Добрый день!
Слышал, что есть и в IB что-то подобное dual, из разряда широко не документированных возможностей. Кто может просветить?
С уважением, CSF.
Fay (2001-12-12 23:03:00) [1]Информация о генераторах лежит в rdb@generators
Jey (2001-12-12 22:26:00) [2]>>csf © (10.12.01 18:52)
>>Ну туповат я малость.
>>Растолкуй мне как написать синтаксически правильное SQL-предложение на >>IB-диалекте, выдающее в качестве результата текущее значение генератора >>My_Gen. И без FROM. И без SP. Сможешь?
А так разве не получится ?
gen_id(mygen,0)
evgeg (2001-12-12 20:47:00) [3]> Mick
Сравни:
> Dual в оракле живет патамучта его SQL диалект всегда требует присутсвия
> клаузы "FROM" если юзер сказал "SELECT".
> В IB этого требования нет. Потому в нем и DUAL"а нет.
> Триггер приведен мной только в качестве примера SQL кода. Я и не
> утверждал что это самый удобный вариант.
> В нем делается аналог ораклового селекта сикванса из дуала.
> Если внимательно присмотреться, то видно что нет ни "Select" ни "From" ни
> "Dual".
Bachin (2001-12-12 18:46:00) [4]IMHO создавать свою таблицу не слишком хорошо. Можно воспользоваться практикой Informix: select ... from systables where tabid = 1 (это и есть сама systables которая всегда есть :)
csf (2001-12-11 10:29:00) [5]Спасибо все откликнувшимся, особенно paul_shmakov ©.
И за совет от Bill.
Bill (2001-12-11 10:09:00) [6]Удобная возможность: создаеш таблицу dual например
create table dual(DUMMY VARCHAR(1));
инсертиш туда строку, например Х, далее пользуешься также, как в Oracle.
Меньше мороки и переносимость кода высокая.
Mick (2001-12-11 09:15:00) [7]Триггер приведен мной только в качестве примера SQL кода. Я и не утверждал что это самый удобный вариант.
В нем делается аналог ораклового селекта сикванса из дуала.
Если внимательно присмотреться, то видно что нет ни "Select" ни "From" ни "Dual".
evgeg (2001-12-11 07:47:00) [8]Никто не мешает самому создать таблицу с одной записью.
А как же все таки с select без from??
paul_shmakov (2001-12-11 01:38:00) [9]2 csf:
да, select ... from rdb$database выдает одну запись.
2 mick:
тригер не всегда удобен, а скорее наоборот. причина в том, что идентификатор записи обычно нужен уже до того, как эта запись будет записана в базу. особенно остро это стоит в midas приложениях. поэтому и приходится писать функции на сервере приложений типаследующей:
function TRemoteDataModule.GenID(const TriggerName: string): Integer;
begin
with ibqGen do
begin
Active := false;
SQL.Text := "select gen_id(" + TriggerName + ", 1) as id from rdb$database";
Active := true;
Result := ibqGenID.asInteger;
Active := false;
end;
end;
2 panov:
не во всех версиях interbase это будет работать (только начиная с 6)
SELECT USER FROM dual == select user from rdb$database
SELECT systime FROM dual == select cast("now" as time) from rdb$database
SELECT sysdate FROM dual == select cast("today" as date) from rdb$database
panov (2001-12-10 23:44:00) [10]Для примера:
получить имя пользователя в текущем сеансе: SELECT USER FROM dual
получить текущее время в системе на сервере: SELECT systime FROM dual
получить текущую дату в системе на сервере: SELECT sysdate FROM dual
Это в ORACLE.
Как то же самое получить в IB?
Без написания процедур?
Есть ли такая возможность?
evgeg (2001-12-10 22:31:00) [11]> Mick
> Dual в оракле живет патамучта его SQL диалект всегда требует присутсвия клаузы "FROM" если юзер сказал "SELECT".
В IB этого требования нет. Потому в нем и DUAL"а нет.
Приведи, пожалуйста, пример select-а без from.
csf (2001-12-10 19:15:00) [12]2 paul_shmakov ©
Спасибо!
Уточните еще, pls,
rdb$database содержит всегда одну и только одну запись?
Mick (2001-12-10 19:02:00) [13]
CREATE TRIGGER TR_NEW_ITEM FOR MY_ITEMS BEFORE INSERT POSITION 0 AS
BEGIN
New.MI_ID = Gen_ID(GenItems,1);
END
paul_shmakov (2001-12-10 18:56:00) [14]interbase:
select gen_id(my_gen, 1) from rdb$database
csf (2001-12-10 18:52:00) [15]Ну туповат я малость.
Растолкуй мне как написать синтаксически правильное SQL-предложение на IB-диалекте, выдающее в качестве результата текущее значение генератора My_Gen. И без FROM. И без SP. Сможешь?
Да и странно смотрится
select F1, F2, F3
не так ли?
Yuvich (2001-12-10 18:47:00) [16]>csf
"В результирующей выборке будет столько записей, сколько содержит эта любая таблица." - это точно, кто-нибудь проверял?
В Informix то же нет таблицы dual, но выборка возвращает столько записей, сколько возвратит функция, поэтому делаешь from из любой системной таблицы.
Mick (2001-12-10 18:32:00) [17]Попробую еще раз.
Dual в оракле живет патамучта его SQL диалект всегда требует присутсвия клаузы "FROM" если юзер сказал "SELECT".
В IB этого требования нет. Потому в нем и DUAL"а нет.
csf (2001-12-10 18:28:00) [18]В Оракле ХП тоже есть...:)
Mick (2001-12-10 18:15:00) [19]Я же сказал, что если не в SP то вот так криво.
А в SP все достаточно прямолинейно и dual просто не нужен.
csf (2001-12-10 18:11:00) [20]2Mick
...и что будет?
В результирующей выборке будет столько записей, сколько содержит эта любаятаблица. А надо городить distinct или еще что-то.
В Oracle dual не дергает никакие таблицы. Можно получить значение сиквенса/генератора запросом
Oracle
select myseq.curvalue as A from dual
IB
select gen_id(my_gen, 0) as A from ????
Вопрос, к сожалению, остался...