Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как узнать о существовании временной таблицы?
|
|||
|---|---|---|---|
|
#18+
Пишу прогу на Дельфях, которая создает и использует временные таблицы. Если таблица уже существует, то нужно просто удалить из нее все данные, а если нет, то создать ее. Сейчас я делаю следующим образом: try ExecSQL('delete from tmp_tbl'); except // нет таблицы ExecSQL('create temp table tmp_tbl...') end; Но неудобно, что если таблицы нет, то в процессе разработки по эксепшену все время вываливаешься в среду. Отсюда вопрос: можно ли как-нибудь "культурно" :) узнать о существовании временной таблицы? Заранее благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2003, 11:51 |
|
||
|
Как узнать о существовании временной таблицы?
|
|||
|---|---|---|---|
|
#18+
никак а Вы в своей программе не знаете создана она или нет ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2003, 12:15 |
|
||
|
Как узнать о существовании временной таблицы?
|
|||
|---|---|---|---|
|
#18+
Дополнение. Нашел в форуме скрипт, который вроде как раз выводит список временных таблиц с какой-то еще инфой: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. но он у меня не работает, ругается на systabnames. Видимо, это для 9 версии, а у меня 7.30. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2003, 12:19 |
|
||
|
Как узнать о существовании временной таблицы?
|
|||
|---|---|---|---|
|
#18+
hav: Ну, можно, конечно и так сделать, отслеживать создание таблицы и где-то запоминать это, но вообще-то хочется написать функцию, которая по заданному имени говорила бы, существует такая таблица или нет. Вот, например, в MSSQL это очень просто сделать : Код: plaintext 1. 2. Неужели в informix'е нет какого-нибудь аналогичного способа? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2003, 12:25 |
|
||
|
Как узнать о существовании временной таблицы?
|
|||
|---|---|---|---|
|
#18+
в 7.30 точно не записывалась в systabnames ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2003, 13:02 |
|
||
|
Как узнать о существовании временной таблицы?
|
|||
|---|---|---|---|
|
#18+
Так там такой таблицы вообще нет. Но от этого не легче :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2003, 13:20 |
|
||
|
Как узнать о существовании временной таблицы?
|
|||
|---|---|---|---|
|
#18+
Удалять данные лучше через 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); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2003, 13:29 |
|
||
|
Как узнать о существовании временной таблицы?
|
|||
|---|---|---|---|
|
#18+
;-) systabnames находится в sysmaster. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2003, 13:32 |
|
||
|
Как узнать о существовании временной таблицы?
|
|||
|---|---|---|---|
|
#18+
Да, точно. И все остальные таблицы тоже в sysmaster. Но теперь проблема с bitval - в 7.30 ее еще не было, похоже :( А по поводу процедуры с обработкой эксепшена - минус в том, что это только для таблицы с конкретным именем и с конкретной структурой. А хочется иметь универсальную функцию, которая принимала бы имя временной таблицы как параметр, и возвращала бы есть таблица или нет, а сreate table делать из клиента. Но все равно спасибо за участие :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2003, 13:47 |
|
||
|
Как узнать о существовании временной таблицы?
|
|||
|---|---|---|---|
|
#18+
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-ке нет. Поэтому либо делай обработчик ошибок на клиенте или пиши по процедуре под каждую таблицу :-). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2003, 14:01 |
|
||
|
Как узнать о существовании временной таблицы?
|
|||
|---|---|---|---|
|
#18+
Да, все так... Ладно, буду думать. :) Спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2003, 14:53 |
|
||
|
Как узнать о существовании временной таблицы?
|
|||
|---|---|---|---|
|
#18+
igor_u Чтобы не получать обработанный exception в среде Delphi, нужно снять флаг Break/Stop on Delphi Exceptions. Это в настройке Delphi, естественно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2003, 10:36 |
|
||
|
Как узнать о существовании временной таблицы?
|
|||
|---|---|---|---|
|
#18+
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; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 14:59 |
|
||
|
|

start [/forum/topic.php?fid=44&msg=32275249&tid=1609257]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 146ms |

| 0 / 0 |
