powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / запрос - создан ли объект
15 сообщений из 15, страница 1 из 1
запрос - создан ли объект
    #33142042
massaraksh33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пжалста, как корректно составить запрос. Нужно дропнуть таблицу в случае, если она создана.

Вот такой вот запрос выдает Function sequence error =(

IF ( EXISTS (SELECT * FROM SYSCAT.TABLES WHERE TABSCHEMA = 'FK_02' AND TABNAME = 'T_DT';) )
DROP TABLE FK_02.T_DT;
END IF;
...
Рейтинг: 0 / 0
запрос - создан ли объект
    #33142197
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, лишний semicolon после TABNAME = 'T_DT'.

Во-вторых, EXISTS в IF'е, насколько я помню, не работает, и надо использовать что-то вроде
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
DECLARE tn VARCHAR( 255 );
SET tn=(SELECT tabName 
  FROM SYSCAT.TABLES 
  WHERE TABSCHEMA = 'FK_02' AND TABNAME = 'T_DT'
  FETCH  1  FIRST ROW ONLY);
IF NOT(tn IS NULL) THEN
  DROP TABLE FK_02.T_DT;
END IF;
Есть еще вариант с попыткой сделать SELECT из FK_02.T_DT с последующим перехватом исключения, но он, на мой взгляд, менее удобен.

В-третьих, все равно это работать не должно (
All executable SQL statements can be contained within the body of an SQL procedure, with the exception of the following:
ALTER
CONNECT
CREATE any object other than indexes, tables, or views
DESCRIBE
DISCONNECT
DROP any object other than indexes, tables, or views
FLUSH EVENT MONITOR
REFRESH TABLE
RELEASE (connection only)
RENAME TABLE
RENAME TABLESPACE
REVOKE
SET CONNECTION
SET INTEGRITY
SET PASSTHRU
SET SERVER OPTION
).

Хотя стоит попробовать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
DECLARE tn VARCHAR( 255 );
SET tn=(SELECT tabName 
  FROM SYSCAT.TABLES 
  WHERE TABSCHEMA = 'FK_02' AND TABNAME = 'T_DT'
  FETCH  1  FIRST ROW ONLY);
IF NOT(tn IS NULL) THEN
  EXECUTE IMMEDIATE 'DROP TABLE FK_02.T_DT';
END IF;
...
Рейтинг: 0 / 0
запрос - создан ли объект
    #33143159
massaraksh33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, к сожалению, ничего не работает.
Спасибо, Victor.
...
Рейтинг: 0 / 0
запрос - создан ли объект
    #33145100
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот это компилится:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create procedure XXX
begin atomic
DECLARE i INTEGER;
DECLARE s VARCHAR( 255 );

SET i=(SELECT  1 
  FROM SYSCAT.TABLES 
  WHERE TABSCHEMA = 'FK_02' AND TABNAME = 'T_DT'
  FETCH FIRST  1  ROW ONLY);
IF i= 1  THEN
  SET s = 'DROP TABLE FK_02.T_DT';
  EXECUTE IMMEDIATE s;
END IF;
end
причем по сравнению с предыдущим
1. create procedure - обязательно.
2. FETCH FIRST 1 ROW ONLY вместо FETCH 1 FIRST ROW ONLY
3. SET s = 'DROP TABLE FK_02.T_DT';
EXECUTE IMMEDIATE s;
вместо
EXECUTE IMMEDIATE 'DROP TABLE FK_02.T_DT';

а SELECT 1 "для красоты"
...
Рейтинг: 0 / 0
запрос - создан ли объект
    #33145853
massaraksh33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Victor Metelitsaвот это компилится:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create procedure XXX
begin atomic
DECLARE i INTEGER;
DECLARE s VARCHAR( 255 );

SET i=(SELECT  1 
  FROM SYSCAT.TABLES 
  WHERE TABSCHEMA = 'FK_02' AND TABNAME = 'T_DT'
  FETCH FIRST  1  ROW ONLY);
IF i= 1  THEN
  SET s = 'DROP TABLE FK_02.T_DT';
  EXECUTE IMMEDIATE s;
END IF;
end
причем по сравнению с предыдущим
1. create procedure - обязательно.
2. FETCH FIRST 1 ROW ONLY вместо FETCH 1 FIRST ROW ONLY
3. SET s = 'DROP TABLE FK_02.T_DT';
EXECUTE IMMEDIATE s;
вместо
EXECUTE IMMEDIATE 'DROP TABLE FK_02.T_DT';

а SELECT 1 "для красоты"

Вах! Спасибо! Однако как сложно все...
...
Рейтинг: 0 / 0
запрос - создан ли объект
    #33146030
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос привычки. В том числе - привычки регулярно перечитывать доки. К примеру, мне совершенно непонятно, почему у DB2 нелегально

EXECUTE IMMEDIATE 'DROP TABLE FK_02.T_DT';

и легально

SET s = 'DROP TABLE FK_02.T_DT';
EXECUTE IMMEDIATE s;

однако о необходимости этого после перечитывания статьи по EXECUTE IMMEDIATE догадаться можно.

А ораклисты вместо exists в if'ах вообще часто польуются обработкой исключений, что, на мой взгляд, еще более громоздко в данном применении.
...
Рейтинг: 0 / 0
запрос - создан ли объект
    #33146779
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, пример из документации ;-)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE PROCEDURE EXIT_TEST ()
LANGUAGE SQL
BEGIN
  DECLARE OUT_BUFFER VARCHAR( 80 );
  DECLARE NO_TABLE CONDITION FOR SQLSTATE ‘ 42704 ’;
  A: 
    BEGIN
      DECLARE EXIT HANDLER FOR NO_TABLE 
        BEGIN 
          SET OUT_BUFFER=‘Table does not exist’;  
        END;
      -- Drop potentially nonexistent table:
      DROP TABLE JAVELIN;
      B: SET OUT_BUFFER=‘Table dropped successfully’;
    END;
  -- Copy OUT_BUFFER to some message table:
  C: INSERT INTO MESSAGES VALUES OUT_BUFFER;
END
...
Рейтинг: 0 / 0
запрос - создан ли объект
    #33147526
massaraksh33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще раз большое спасибо! Надо, конечно, читать документацию... Только времени нет =(
...
Рейтинг: 0 / 0
запрос - создан ли объект
    #33147531
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
появилась системная SP которая позволяет вызвать функционал CLP из SQL
Тоже вариант, просто и удобно.
...
Рейтинг: 0 / 0
запрос - создан ли объект
    #33147564
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как проца называеЦЦа???
...
Рейтинг: 0 / 0
запрос - создан ли объект
    #33147637
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
http://publib.boulder.ibm.com/infocenter/db2help/topic/com.ibm.db2.udb.doc/admin/r0012547.htm
умеет не так много пока, но ведь это только начало - она появилась только в FixPack 9
подписывайтесь на бесплатную доставку DB2 magazine и читайте, хороший журнал. Наш журнал.
...
Рейтинг: 0 / 0
запрос - создан ли объект
    #33148325
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
ну и вот еще, что новенького -
http://www-128.ibm.com/developerworks/db2/library/techarticle/dm-0506zikopoulos/index.html
...
Рейтинг: 0 / 0
запрос - создан ли объект
    #33153219
Leha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ggv, свяжись плиз со мной...
аська 230281

или мылом piffi(dog)bk(dot)ru
...
Рейтинг: 0 / 0
запрос - создан ли объект
    #33153220
Leha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leha123ggv, свяжись плиз со мной...
аська 230281

или мылом piffi(dog)bk(dot)rupaffi(dog)bk(dot)ru
...
Рейтинг: 0 / 0
запрос - создан ли объект
    #33156146
massaraksh33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хммм... вернемся к теме. Вот чего в итоге получилось. Может пригодится кому... Можно и через case - будет быстрее, но тогда с одним вариантом определения на тип объекта.




CREATE PROCEDURE DROPPER (IN obj_type VARCHAR(255), IN obj_schema VARCHAR(255), IN obj_name VARCHAR(255))
/*
* Drops schema object by its type.
* If object is not exists, error is not raised.
*/
BEGIN ATOMIC
DECLARE i INTEGER;
DECLARE o_type VARCHAR(255);
DECLARE s VARCHAR(255);

SET o_type = LTRIM(RTRIM(LCASE(obj_type)));

IF o_type IN ('t', 'tab', 'table', 'q', 'que', 'query', 'query table')
THEN BEGIN
SET o_type = ' TABLE ';
SET i=(SELECT 1
FROM SYSCAT.TABLES
WHERE TABSCHEMA = obj_schema AND TABNAME = obj_name
FETCH FIRST 1 ROW ONLY);
END;
ELSEIF o_type IN ('v', 'vie', 'view')
THEN BEGIN
SET o_type = ' VIEW ';
SET i=(SELECT 1
FROM SYSCAT.VIEWS
WHERE VIEWSCHEMA = obj_schema AND VIEWNAME = obj_name
FETCH FIRST 1 ROW ONLY);
END;
ELSEIF o_type IN ('a', 'ali', 'alias')
THEN BEGIN
SET o_type = ' ALIAS ';
SET i=(SELECT 1
FROM SYSCAT.TABLES
WHERE TABSCHEMA = obj_schema AND TABNAME = obj_name
FETCH FIRST 1 ROW ONLY);
END;
ELSEIF o_type IN ('f', 'fn', 'fun', 'func', 'function')
THEN BEGIN
SET o_type = ' FUNCTION ';
SET i=(SELECT 1
FROM SYSCAT.ROUTINES
WHERE ROUTINESCHEMA = obj_schema AND ROUTINENAME = obj_name
FETCH FIRST 1 ROW ONLY);
END;
ELSEIF o_type IN ('p', 'pro', 'proc', 'procedure')
THEN BEGIN
SET o_type = ' PROCEDURE ';
SET i=(SELECT 1
FROM SYSCAT.ROUTINES
WHERE ROUTINESCHEMA = obj_schema AND ROUTINENAME = obj_name
FETCH FIRST 1 ROW ONLY);
END;
ELSEIF o_type IN ('i', 'ind', 'idx', 'index')
THEN BEGIN
SET o_type = ' INDEX ';
SET i=(SELECT 1
FROM SYSCAT.INDEXES
WHERE INDSCHEMA = obj_schema AND INDNAME = obj_name
FETCH FIRST 1 ROW ONLY);
END;
ELSEIF o_type IN ('tr', 'tri', 'trig', 'trigger')
THEN BEGIN
SET o_type = ' TRIGGER ';
SET i=(SELECT 1
FROM SYSCAT.TRIGGERS
WHERE TRIGSCHEMA = obj_schema AND TRIGNAME = obj_name
FETCH FIRST 1 ROW ONLY);
END;
ELSEIF o_type IN ('typ', 'type', 'datatype')
THEN BEGIN
SET o_type = ' DISTINCT TYPE ';
SET i=(SELECT 1
FROM SYSCAT.DATATYPES
WHERE TYPESCHEMA = obj_schema AND TYPENAME = obj_name
FETCH FIRST 1 ROW ONLY);
END;
ELSEIF o_type IN ('s', 'seq', 'sequence')
THEN BEGIN
SET o_type = ' SEQUENCE ';
SET i=(SELECT 1
FROM SYSCAT.SEQUENCES
WHERE SEQSCHEMA = obj_schema AND SEQNAME = obj_name
FETCH FIRST 1 ROW ONLY);
END;
ELSE
BEGIN
END;
END IF;

IF i=1 THEN
SET s = 'DROP ' || o_type || obj_schema || '.' || obj_name;
EXECUTE IMMEDIATE s;
END IF;
END;
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / запрос - создан ли объект
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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