Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Informix [игнор отключен] [закрыт для гостей] / Как узнать о существовании временной таблицы? / 13 сообщений из 13, страница 1 из 1
25.09.2003, 11:51
    #32275196
igor_u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать о существовании временной таблицы?
Пишу прогу на Дельфях, которая создает и использует временные таблицы. Если таблица уже существует, то нужно просто удалить из нее все данные, а если нет, то создать ее. Сейчас я делаю следующим образом:
try
ExecSQL('delete from tmp_tbl');
except
// нет таблицы
ExecSQL('create temp table tmp_tbl...')
end;

Но неудобно, что если таблицы нет, то в процессе разработки по эксепшену все время вываливаешься в среду.

Отсюда вопрос: можно ли как-нибудь "культурно" :) узнать о существовании временной таблицы?

Заранее благодарен.
...
Рейтинг: 0 / 0
25.09.2003, 12:15
    #32275239
hav
hav
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать о существовании временной таблицы?
никак
а Вы в своей программе не знаете создана она или нет ?
...
Рейтинг: 0 / 0
25.09.2003, 12:19
    #32275242
igor_u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать о существовании временной таблицы?
Дополнение.

Нашел в форуме скрипт, который вроде как раз выводит список временных таблиц с какой-то еще инфой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
set isolation to dirty read;
select tn.tabname[ 1 , 18 ] temp_table
,tn.dbsname[ 1 , 18 ] db_name
,tn.owner[ 1 , 8 ] owner
,s.name[ 1 , 18 ] dbspace
,substr(bitval(ti_flags, 32 ), 1 , 1 ) sys
,substr(bitval(ti_flags, 64 ), 1 , 1 ) log
,substr(bitval(ti_flags, 128 ), 1 , 2 ) srt
from systabnames tn,systabinfo ti,sysdbspaces s
where tn.partnum = ti.ti_partnum
and s.dbsnum=partdbsnum(ti_partnum)
and (bitval(ti_flags, 32 )= 1  or bitval(ti_flags, 64 )= 1  or bitval(ti_flags, 128 )= 1 )


но он у меня не работает, ругается на systabnames. Видимо, это для 9 версии, а у меня 7.30.
...
Рейтинг: 0 / 0
25.09.2003, 12:25
    #32275249
igor_u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать о существовании временной таблицы?
hav:

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

Вот, например, в MSSQL это очень просто сделать :

Код: plaintext
1.
2.
if object_id('table_name') is not null  -- таблица существует
 
else -- не существует


Неужели в informix'е нет какого-нибудь аналогичного способа?
...
Рейтинг: 0 / 0
25.09.2003, 13:02
    #32275317
hav
hav
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать о существовании временной таблицы?
в 7.30 точно не записывалась в systabnames
...
Рейтинг: 0 / 0
25.09.2003, 13:20
    #32275338
igor_u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать о существовании временной таблицы?
Так там такой таблицы вообще нет. Но от этого не легче :)
...
Рейтинг: 0 / 0
25.09.2003, 13:29
    #32275357
Daugava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать о существовании временной таблицы?
Удалять данные лучше через drop table, в особенности если у тебя логгируемая временная таблица.

Сделай процедурку, в которой напиши что-то типа того:
BEGIN
ON EXCEPTION IN (-206)
END EXCEPTION WITH RESUME;

DROP TABLE tmp_tbl;

CREATE TEMP TABLE tmp_tbl () WITH NO LOG;
END;

В принципе, узнать существует ли временная таблица можно. Но узнать какой именно сессии она принадлежит, это уже сложнее (по крайней мере я не знаю как).
Вот запрос из пакета DBA_Tools им. Василия Шульженко.
select tn.tabname[1,18] temp_table
,tn.dbsname[1,18] db_name
,tn.owner[1,8] owner
,s.name[1,18] dbspace
,substr(bitval(ti_flags,32),1,1) sys
,substr(bitval(ti_flags,64),1,1) log
,substr(bitval(ti_flags,128),1,2) srt
from systabnames tn,systabinfo ti,sysdbspaces s
where tn.partnum = ti.ti_partnum
and s.dbsnum=partdbsnum(ti_partnum)
and (bitval(ti_flags,32)=1 or bitval(ti_flags,64)=1 or bitval(ti_flags,128)=1);
...
Рейтинг: 0 / 0
25.09.2003, 13:32
    #32275363
Daugava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать о существовании временной таблицы?
;-) systabnames находится в sysmaster.
...
Рейтинг: 0 / 0
25.09.2003, 13:47
    #32275398
igor_u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать о существовании временной таблицы?
Да, точно. И все остальные таблицы тоже в sysmaster. Но теперь проблема с bitval - в 7.30 ее еще не было, похоже :(

А по поводу процедуры с обработкой эксепшена - минус в том, что это только для таблицы с конкретным именем и с конкретной структурой. А хочется иметь универсальную функцию, которая принимала бы имя временной таблицы как параметр, и возвращала бы есть таблица или нет, а сreate table делать из клиента.

Но все равно спасибо за участие :)
...
Рейтинг: 0 / 0
25.09.2003, 14:01
    #32275414
Daugava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать о существовании временной таблицы?
bitval действительно нет в 7.30, но реализовать ее особых проблем нет.
CREATE PROCEDURE "informix".is_bit(examine_value INTEGER, bit_number SMALLINT)
RETURNING SMALLINT;
DEFINE N INTEGER;
DEFINE I SMALLINT;

IF examine_value IS NULL THEN RETURN 0; END IF;
IF bit_number <= 0 THEN RETURN 1; END IF;

LET N = examine_value;
IF bit_number > 1 THEN
FOR I = 2 TO bit_number
LET N = TRUNC( N / 2, 0);
END FOR;
END IF;

RETURN MOD (N, 2);
END PROCEDURE;

К сожалению, это не поможет в главной проблеме, привязать найденные таблицы к текущей сессии. А без этого тебе сие не поможет :-(.

На счет универсиализации, тут прийдется идти на 9-ку, так как аналога MSSQL exec() в 7-ке нет. Поэтому либо делай обработчик ошибок на клиенте или пиши по процедуре под каждую таблицу :-).
...
Рейтинг: 0 / 0
25.09.2003, 14:53
    #32275533
igor_u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать о существовании временной таблицы?
Да, все так... Ладно, буду думать. :) Спасибо за помощь.
...
Рейтинг: 0 / 0
24.12.2003, 10:36
    #32361692
Sandman25
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать о существовании временной таблицы?
igor_u

Чтобы не получать обработанный exception в среде Delphi, нужно снять флаг Break/Stop on Delphi Exceptions. Это в настройке Delphi, естественно.
...
Рейтинг: 0 / 0
09.06.2004, 14:59
    #32554412
Julian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать о существовании временной таблицы?
bitval() есть не во всякой 9-ке, а начиная с 9.4 или 9.3
Недавно мне пришлось решить эту задачку для нашего
Informix Dynamic Server 2000 Version 9.21.UC3,
сюда не заглядывал.

И вот что интересно: имя функции выбрал абсолютно то же!
(насчет параметров и их последовательности
удивляться не приходится, но тоже совпали :)
Работают обе функции по скорости примерно одинаково.

DROP FUNCTION Is_Bit;

CREATE FUNCTION Is_Bit( p_int INTEGER, p_bit SMALLINT ) RETURNING SMALLINT;

DEFINE v_pow INTEGER;

LET v_pow = POW( 2, p_bit-1 ); -- чтобы POW() вызывать только 1 раз :)

IF MOD( p_int, v_pow*2 ) >= v_pow THEN
RETURN 1;
ELSE
RETURN 0;
END IF

END FUNCTION
DOCUMENT
'Purpose: проверить установку бита в числе',
'Return: 1: 1 - бит установлен',
' 0 - бит не установлен',
'Parameters: 1 p_int - тестируемое число',
' 2 p_bit - номер бита, младший номер 1',
'Notes: 1. Для проверки двоичной маски в числах. Пример:',
' 22 в двоичном виде выглядит как 010110, проверка битов 1-6:',
' Is_Bit(22,1) = 0',
' Is_Bit(22,2) = 1',
' Is_Bit(22,3) = 1',
' Is_Bit(22,4) = 0',
' Is_Bit(22,5) = 1',
' Is_Bit(22,6) = 0',
' 2. Функция проверяет истинность отношения',
' MOD(p_int,2**p_bit) - 2**(p_bit-1) >=0',
' Подробнее см. в Morn.er1, Движение изделий, описание и примечание',
' к полю Признаки (назначение и вывод формулы).',
' 3. При необходимости можно добавить проверки на допустимость:',
' 0 <= p_int <= 2147483647 (2**32-1)',
' 1 <= p_bit <= 32',
' и возврат, например -1, в качестве признака ошибки.',
'Author: Julian Zalutsky',
'Date: 15.05.2004 13:55';
GRANT EXECUTE ON Is_Bit TO PUBLIC;
UPDATE STATISTICS FOR FUNCTION Is_Bit;
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / Как узнать о существовании временной таблицы? / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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