|
запрос - создан ли объект
|
|||
---|---|---|---|
#18+
Подскажите пжалста, как корректно составить запрос. Нужно дропнуть таблицу в случае, если она создана. Вот такой вот запрос выдает 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; ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2005, 10:56 |
|
запрос - создан ли объект
|
|||
---|---|---|---|
#18+
Во-первых, лишний semicolon после TABNAME = 'T_DT'. Во-вторых, EXISTS в IF'е, насколько я помню, не работает, и надо использовать что-то вроде Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
В-третьих, все равно это работать не должно ( 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2005, 11:48 |
|
запрос - создан ли объект
|
|||
---|---|---|---|
#18+
Да, к сожалению, ничего не работает. Спасибо, Victor. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2005, 16:01 |
|
запрос - создан ли объект
|
|||
---|---|---|---|
#18+
вот это компилится: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
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 "для красоты" ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2005, 14:04 |
|
запрос - создан ли объект
|
|||
---|---|---|---|
#18+
Victor Metelitsaвот это компилится: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
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 "для красоты" Вах! Спасибо! Однако как сложно все... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2005, 18:11 |
|
запрос - создан ли объект
|
|||
---|---|---|---|
#18+
Вопрос привычки. В том числе - привычки регулярно перечитывать доки. К примеру, мне совершенно непонятно, почему у DB2 нелегально EXECUTE IMMEDIATE 'DROP TABLE FK_02.T_DT'; и легально SET s = 'DROP TABLE FK_02.T_DT'; EXECUTE IMMEDIATE s; однако о необходимости этого после перечитывания статьи по EXECUTE IMMEDIATE догадаться можно. А ораклисты вместо exists в if'ах вообще часто польуются обработкой исключений, что, на мой взгляд, еще более громоздко в данном применении. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2005, 20:15 |
|
запрос - создан ли объект
|
|||
---|---|---|---|
#18+
Кстати, пример из документации ;-) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2005, 11:28 |
|
запрос - создан ли объект
|
|||
---|---|---|---|
#18+
Еще раз большое спасибо! Надо, конечно, читать документацию... Только времени нет =( ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2005, 11:39 |
|
запрос - создан ли объект
|
|||
---|---|---|---|
#18+
появилась системная SP которая позволяет вызвать функционал CLP из SQL Тоже вариант, просто и удобно. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2005, 11:40 |
|
запрос - создан ли объект
|
|||
---|---|---|---|
#18+
А как проца называеЦЦа??? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2005, 11:53 |
|
запрос - создан ли объект
|
|||
---|---|---|---|
#18+
http://publib.boulder.ibm.com/infocenter/db2help/topic/com.ibm.db2.udb.doc/admin/r0012547.htm умеет не так много пока, но ведь это только начало - она появилась только в FixPack 9 подписывайтесь на бесплатную доставку DB2 magazine и читайте, хороший журнал. Наш журнал. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2005, 12:17 |
|
запрос - создан ли объект
|
|||
---|---|---|---|
#18+
ну и вот еще, что новенького - http://www-128.ibm.com/developerworks/db2/library/techarticle/dm-0506zikopoulos/index.html ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2005, 15:55 |
|
запрос - создан ли объект
|
|||
---|---|---|---|
#18+
ggv, свяжись плиз со мной... аська 230281 или мылом piffi(dog)bk(dot)ru ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2005, 20:06 |
|
запрос - создан ли объект
|
|||
---|---|---|---|
#18+
Leha123ggv, свяжись плиз со мной... аська 230281 или мылом piffi(dog)bk(dot)rupaffi(dog)bk(dot)ru ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2005, 20:07 |
|
запрос - создан ли объект
|
|||
---|---|---|---|
#18+
Хммм... вернемся к теме. Вот чего в итоге получилось. Может пригодится кому... Можно и через 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; ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2005, 10:24 |
|
|
start [/forum/topic.php?fid=43&fpage=144&tid=1605840]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
31ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 149ms |
0 / 0 |