Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];




Вниз

В Oracle есть dual, а что есть в InterBase e? 


csf   (2001-12-10 16:28) [0]

Добрый день!
Слышал, что есть и в IB что-то подобное dual, из разряда широко не документированных возможностей. Кто может просветить?
С уважением, CSF.



Mick   (2001-12-10 16:35) [1]

"Dual" в Оракле нужен только потому, что у него все select"ы требуют FROM"а.
Зачем нужен аналог Dual"а в IB непонятно.



csf   (2001-12-10 17:40) [2]

Хорошо,
как в IB сделать то что в Oracle делается так

select "AAA", "BBB", "CCC" from dual;




Mick   (2001-12-10 17:54) [3]

Если не в SP то можно так
select "AAA", "BBB", "CCC" from <Любая_существующая_таблица>



csf   (2001-12-10 18:11) [4]

2Mick

...и что будет?
В результирующей выборке будет столько записей, сколько содержит эта любая таблица. А надо городить distinct или еще что-то.
В Oracle dual не дергает никакие таблицы. Можно получить значение сиквенса/генератора запросом
Oracle
select myseq.curvalue as A from dual
IB
select gen_id(my_gen, 0) as A from ????

Вопрос, к сожалению, остался...



Mick   (2001-12-10 18:15) [5]

Я же сказал, что если не в SP то вот так криво.
А в SP все достаточно прямолинейно и dual просто не нужен.



csf   (2001-12-10 18:28) [6]

В Оракле ХП тоже есть...:)



Mick   (2001-12-10 18:32) [7]

Попробую еще раз.
Dual в оракле живет патамучта его SQL диалект всегда требует присутсвия клаузы "FROM" если юзер сказал "SELECT".
В IB этого требования нет. Потому в нем и DUAL"а нет.



Yuvich   (2001-12-10 18:47) [8]

>csf
"В результирующей выборке будет столько записей, сколько содержит эта любая таблица." - это точно, кто-нибудь проверял?

В Informix то же нет таблицы dual, но выборка возвращает столько записей, сколько возвратит функция, поэтому делаешь from из любой системной таблицы.



csf   (2001-12-10 18:52) [9]

Ну туповат я малость.
Растолкуй мне как написать синтаксически правильное SQL-предложение на IB-диалекте, выдающее в качестве результата текущее значение генератора My_Gen. И без FROM. И без SP. Сможешь?
Да и странно смотрится
select F1, F2, F3
не так ли?



paul_shmakov   (2001-12-10 18:56) [10]

interbase:
select gen_id(my_gen, 1) from rdb$database



Mick   (2001-12-10 19:02) [11]


CREATE TRIGGER TR_NEW_ITEM FOR MY_ITEMS BEFORE INSERT POSITION 0 AS
BEGIN
New.MI_ID = Gen_ID(GenItems,1);
END



csf   (2001-12-10 19:15) [12]

2 paul_shmakov ©

Спасибо!
Уточните еще, pls,
rdb$database содержит всегда одну и только одну запись?



evgeg   (2001-12-10 22:31) [13]

> Mick

> Dual в оракле живет патамучта его SQL диалект всегда требует присутсвия клаузы "FROM" если юзер сказал "SELECT".
В IB этого требования нет. Потому в нем и DUAL"а нет.

Приведи, пожалуйста, пример select-а без from.



panov   (2001-12-10 23:44) [14]

Для примера:
получить имя пользователя в текущем сеансе: SELECT USER FROM dual
получить текущее время в системе на сервере: SELECT systime FROM dual
получить текущую дату в системе на сервере: SELECT sysdate FROM dual

Это в ORACLE.

Как то же самое получить в IB?
Без написания процедур?
Есть ли такая возможность?




paul_shmakov   (2001-12-11 01:38) [15]

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



evgeg   (2001-12-11 07:47) [16]

Никто не мешает самому создать таблицу с одной записью.

А как же все таки с select без from??



Mick   (2001-12-11 09:15) [17]

Триггер приведен мной только в качестве примера SQL кода. Я и не утверждал что это самый удобный вариант.
В нем делается аналог ораклового селекта сикванса из дуала.
Если внимательно присмотреться, то видно что нет ни "Select" ни "From" ни "Dual".



Bill   (2001-12-11 10:09) [18]

Удобная возможность: создаеш таблицу dual например
create table dual(DUMMY VARCHAR(1));
инсертиш туда строку, например Х, далее пользуешься также, как в Oracle.
Меньше мороки и переносимость кода высокая.





csf   (2001-12-11 10:29) [19]

Спасибо все откликнувшимся, особенно paul_shmakov ©.
И за совет от Bill.



Bachin   (2001-12-12 18:46) [20]

IMHO создавать свою таблицу не слишком хорошо. Можно воспользоваться практикой Informix: select ... from systables where tabid = 1 (это и есть сама systables которая всегда есть :)



evgeg   (2001-12-12 20:47) [21]

> Mick
Сравни:
> Dual в оракле живет патамучта его SQL диалект всегда требует присутсвия
> клаузы "FROM" если юзер сказал "SELECT".
> В IB этого требования нет. Потому в нем и DUAL"а нет.

> Триггер приведен мной только в качестве примера SQL кода. Я и не
> утверждал что это самый удобный вариант.
> В нем делается аналог ораклового селекта сикванса из дуала.
> Если внимательно присмотреться, то видно что нет ни "Select" ни "From" ни
> "Dual".



Jey   (2001-12-12 22:26) [22]

>>csf © (10.12.01 18:52)
>>Ну туповат я малость.
>>Растолкуй мне как написать синтаксически правильное SQL-предложение на >>IB-диалекте, выдающее в качестве результата текущее значение генератора >>My_Gen. И без FROM. И без SP. Сможешь?

А так разве не получится ?
gen_id(mygen,0)



Fay   (2001-12-12 23:03) [23]

Информация о генераторах лежит в rdb@generators




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.031 c
1-42459           Dim                   2001-12-24 14:23  2002.01.14  
Контроль за перемещениями мышки.


1-42399           Andrey196             2001-12-26 16:24  2002.01.14  
Как найти файл в поддериктории


1-42422           dimonf                2001-12-25 19:37  2002.01.14  
Как работать с Canvas в StringGrid?


3-42384           NLO                   2001-12-07 12:23  2002.01.14  
кряк для Grant Manager 3 ну очень надо !!


3-42380           bk                    2001-12-10 14:25  2002.01.14  
Ms Outlook