|
|
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
Или лыжи не едут... Есть таблица CREATE TABLE TREES ( TID INTEGER NOT NULL, PARENT_TID INTEGER NOT NULL, NAME VARCHAR(30) NOT NULL COLLATE PXW_CYRL, PASH VARCHAR(250) ) Pash - путь от узла до корня И есть процедура, которая формирует Pash для узла. CREATE PROCEDURE TREES_SET_PASH ( TABLE_NAME VARCHAR(50), IN_ID INTEGER) AS DECLARE VARIABLE VAR_ID INTEGER; DECLARE VARIABLE NAME_FULL VARCHAR(250); DECLARE VARIABLE E_ID INTEGER; DECLARE VARIABLE P_ID INTEGER; DECLARE VARIABLE NAME VARCHAR(30); DECLARE VARIABLE SQL VARCHAR(250); BEGIN SQL = ''; VAR_ID = IN_ID; EXECUTE STATEMENT 'SELECT NAME from ' || Table_Name || ' where TID = ' || :VAR_ID into : NAME_FULL; EXECUTE STATEMENT 'select PARENT_TID from ' || Table_Name || ' where TID =' || :VAR_ID into : VAR_ID; WHILE (VAR_ID > 0) DO BEGIN EXECUTE STATEMENT 'SELECT TID, PARENT_TID, NAME FROM ' || Table_Name || ' WHERE TID = ' || :VAR_ID INTO :E_ID, :P_ID, :NAME; VAR_ID=P_ID; if (NAME = '') then begin NAME_FULL = 'demagesroot'; end else NAME_FULL = NAME || '@' || NAME_FULL; END SQL = 'UPDATE ' || Table_Name || ' SET pash = ' || '''' || NAME_FULL || '''' || ' where TID = ' || :IN_ID; EXECUTE STATEMENT SQL; SUSPEND; END Теперь о нюансах: Есль прослеживается весь путь до корня - все отрабатывает. Если же где-то обрыв (ну удалили родителя) Unsuccessful execution caused by an unavailable resource. Invalid argument in EXECUTE STATEMENT - cannot convert to string. У кого есть какие-нибудь мысли по этому поводу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2004, 22:30:57 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
автор WHILE (VAR_ID > 0) DO BEGIN EXECUTE STATEMENT 'SELECT TID, PARENT_TID, NAME FROM ' || Table_Name || ' WHERE TID = ' || :VAR_ID INTO :E_ID, :P_ID, :NAME; VAR_ID=P_ID; if (NAME = '') then begin NAME_FULL = 'demagesroot'; end else NAME_FULL = NAME || '@' || NAME_FULL; END SQL = 'UPDATE ' || Table_Name || ' SET pash = ' || '''' || NAME_FULL || '''' || ' where TID = ' || :IN_ID; EXECUTE STATEMENT SQL; Если нет попадания в этот цикл, то NAME_FULL может быть Null. Перед выполнением Execute Statement нужно убедиться в отсутствии неопределенных значений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 10:20:41 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
Убеждался. Прекрасная строка - как и должно быть, только SQL = 'UPDATE ' || Table_Name || ' SET pash = ' || '''' || NAME_FULL || '''' || ' where TID = ' || :IN_ID; EXECUTE STATEMENT SQL; работает после того, как EXECUTE STATEMENT 'SELECT TID, PARENT_TID, NAME FROM ' || Table_Name || ' WHERE TID = ' || :VAR_ID INTO :E_ID, :P_ID, :NAME; найдет какую-либо строку. Если строка не найдена, то E_ID = 0, P_ID= 0, NAME= '' Но после этого не выполняется UPDATE, хотя строка SQL правильная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 10:42:49 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
SQL = 'UPDATE ' || Table_Name || ' SET pash = ' || '''' || NAME_FULL || '''' || ' where TID = ' || :IN_ID; EXECUTE STATEMENT SQL; Все ж поставь перед этой конструкцией проверочку If (NAME_FULL Is Null) Then NAME_FULL=''; If (IN_ID Is Null) Then IN_ID=0; Че теперь получится ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 11:03:01 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
Все то же. Хотя, с недавних пор появляется другое исключение Arithmetic overflow or division by zero has occurred. arithmetic exception, numeric overflow, or string truncation. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 16:02:33 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
И охота же людям заниматься мастурбацией через анус... Чего ради нужно заморачиваться с некоей универсальной процедурой, производительность которой будет к тому же довольно низкой? Их ферштее нихт... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 16:10:47 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
vaaВсе то же. Хотя, с недавних пор появляется другое исключение Arithmetic overflow or division by zero has occurred. arithmetic exception, numeric overflow, or string truncation. Та это уже, наверно, надо триггеры на TableName смотреть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 16:10:54 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
МимопроходящийИ охота же людям заниматься мастурбацией через анус... Чего ради нужно заморачиваться с некоей универсальной процедурой, производительность которой будет к тому же довольно низкой? Их ферштее нихт... Вот он поколупается с ней да и, глядишь, бросит... Все познается только опытным путем (к сожалению). Ты же вот знаешь задрочки "универсальных" процедур, стало быть, шишек мало-мало набил :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 16:15:17 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
Триггеров нет PS: Мимопроходящему: Просили помочь разобраться с этой ситуацией, а не материться и корчить из себя "гуру". Короче,проходя-проходи, "гуру", не засоряй эфир! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 18:12:47 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
а сходика вот сюда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 18:39:19 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
В процедуре сделай SQL выходным параметром и сделай обработчик исключений и покажи нам чё за команда выполняется в EXECUTE STATEMENT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 18:44:37 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
Att: alex777 На уродов больше не реагирую ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 21:24:27 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
Alex777 конечно погорячился, но взамно-посылами, имхо, дело не ограничится... Ты с этими EXECUTE STATEMENT имеешь нестандартные интимные отношения, начиная с 13-го апреля. Может стОит пересмотреть подход к рещению задачи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 21:31:51 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
Att Мимопроходящий: Со вчерашнего дня. Но ситуация такая - или это глюк FB, тогда стоит подумать о другом выходе (он есть, но мне не нравится) или я чего-то не догоняю. Скорость в данном случае не критична, а имена таблиц у меня генерятся как угодно. Теперь к Gold: написал так: CREATE PROCEDURE TREES_UPDATE_PASH2 ( TABLE_NAME VARCHAR(50)) AS DECLARE VARIABLE VAR_ID INTEGER; DECLARE VARIABLE PASH VARCHAR(250); DECLARE VARIABLE SQL VARCHAR(250); BEGIN var_ID = 225;./*у этой записи специально удалил родителя TABLE_NAME = 'TREES_BRAND20040714172103'; EXECUTE PROCEDURE trees_get_pash (TABLE_NAME, VAR_ID ) RETURNING_VALUES Pash; if (Pash = 'damagesRoot') then begin sql = 'DELETE FROM ' || Table_Name || ' where TID = ' || :VAR_ID; end else SQL = 'UPDATE ' || Table_Name || ' SET pash = ' || '''' || Pash || '''' || ' where TID = ' || :VAR_ID; EXECUTE STATEMENT SQL; SUSPEND; END CREATE PROCEDURE TREES_GET_PASH ( TABLE_NAME VARCHAR(50), IN_ID INTEGER) RETURNS ( RETPASH VARCHAR(250)) AS DECLARE VARIABLE VAR_ID INTEGER; DECLARE VARIABLE NAME_FULL VARCHAR(250); DECLARE VARIABLE VP_ID INTEGER; DECLARE VARIABLE VNAME VARCHAR(50); DECLARE VARIABLE SQL VARCHAR(250); BEGIN SQL = ''; VAR_ID = IN_ID; NAME_FULL = ''; WHILE (VAR_ID > 0) DO BEGIN sql = 'SELECT PARENT_TID, NAME FROM ' || Table_Name || ' WHERE TID = ' || :VAR_ID; EXECUTE STATEMENT SQL INTO :vP_ID, :vNAME; VAR_ID=vP_ID; if (vName = '') then begin NAME_FULL = 'damagesRoot'; end else NAME_FULL = vNAME || '@' || NAME_FULL; END RETPASH = NAME_FULL; SUSPEND; END EXECUTE PROCEDURE trees_get_pash Возвращает Arithmetic overflow or division by zero has occurred. arithmetic exception, numeric overflow, or string truncation. При отладке в Ibexpert происходит вход в trees_get_pash RETPASH принимает значение, но пи возврате в TREES_UPDATE_PASH2 матерится, но только в том случае, если sql = 'SELECT PARENT_TID, NAME FROM ' || Table_Name || ' WHERE TID = ' || :VAR_ID; EXECUTE STATEMENT SQL INTO :vP_ID, :vNAME; запрос не возвращает ни одной строки Если на возврате строка - все ОК. Кажется, что все-таки глюк ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2004, 21:53:58 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
ух ты... неужели эксперт может нормально отлаживать процедуры с EXECUTE STATEMENT??? скажите как такого добиться, а то у меня не могёт... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2004, 08:46:08 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
а сходика вот сюда и еще куданить где тебя научат правилам хорошего тона vaa PS: Мимопроходящему: Просили помочь разобраться с этой ситуацией, а не материться и корчить из себя "гуру". Короче,проходя-проходи, "гуру", не засоряй эфир! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2004, 08:47:51 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
2 alex777 это мне??? я там был уже... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2004, 08:49:05 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
2 VF не надо фсе принимать на свой счет, ты опубликовал свое сообщение когда я писал свое, я это сказал АВТОРУ, P.S. кто нить отмодерировал бы чтоль топик ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2004, 08:58:36 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
fedd спит ещё, наверное ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2004, 09:06:03 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
эээ... ещё не проснулся но попробую включится vaaИли лыжи не едут... Теперь о нюансах: Есль прослеживается весь путь до корня - все отрабатывает. Если же где-то обрыв (ну удалили родителя) Unsuccessful execution caused by an unavailable resource. Invalid argument in EXECUTE STATEMENT - cannot convert to string. У кого есть какие-нибудь мысли по этому поводу? Мысль одна - в базе д.б. триггер, который будет контролировать ее целостность - то есть либо удалит все дочерние ветви - либо не позволит удалить родителя, если есть дети. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2004, 09:50:37 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
vaa Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Продолжаю настаивать на ОБЯЗАТЕЛЬНОЙ ПРОВЕРКЕ НА NULL во всех случаях ! Только что прокрутил твои процедуры в IBExpert (FB 1.5) - все работает, так что вряд ли дело в глюках :-). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2004, 10:56:03 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
Ты напиши так, и покажи что вернёт процедура: CREATE PROCEDURE TREES_SET_PASH ( TABLE_NAME VARCHAR(50), IN_ID INTEGER) RETURNS ( SQL VARCHAR(250) ) AS DECLARE VARIABLE VAR_ID INTEGER; DECLARE VARIABLE NAME_FULL VARCHAR(250); DECLARE VARIABLE E_ID INTEGER; DECLARE VARIABLE P_ID INTEGER; DECLARE VARIABLE NAME VARCHAR(30); BEGIN SQL = ''; VAR_ID = IN_ID; EXECUTE STATEMENT 'SELECT NAME from ' || Table_Name || ' where TID = ' || :VAR_ID into : NAME_FULL; EXECUTE STATEMENT 'select PARENT_TID from ' || Table_Name || ' where TID =' || :VAR_ID into : VAR_ID; WHILE (VAR_ID > 0) DO BEGIN EXECUTE STATEMENT 'SELECT TID, PARENT_TID, NAME FROM ' || Table_Name || ' WHERE TID = ' || :VAR_ID INTO :E_ID, :P_ID, :NAME; VAR_ID=P_ID; if (NAME = '') then begin NAME_FULL = 'demagesroot'; end else NAME_FULL = NAME || '@' || NAME_FULL; END SQL = 'UPDATE ' || Table_Name || ' SET pash = ' || '''' || NAME_FULL || '''' || ' where TID = ' || :IN_ID; EXECUTE STATEMENT SQL; WHEN ANY DO SUSPEND; END ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2004, 12:16:45 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
2 AndriyKo да КАК ЭКСПЕРТ у Тебя ПРОПУСКАЕТ такие процедуры, у меня ругается и всё тут, хотя вызываю из проги и всё пахает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2004, 12:53:16 |
|
||
|
опять EXECUTE STATEMENT
|
|||
|---|---|---|---|
|
#18+
Att: Gold Возврвщает Null, хотя при отладке перед выполнением EXECUTE STATEMENT SQL - SQL высвечивает правильную строку. (Ibexpert 2004.04.08, FB 1.5 Att: AndriyKo Проверял на Null - как и советовал if (NAME_FULL is Null) then NAME_FULL = ''; If (IN_ID Is Null) Then IN_ID=0; Результат тот-же. Что-то происходит в момент выполнения EXECUTE STATEMENT SQL Att: Bol Эта на крайний случай. Уже думал об этом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2004, 13:45:23 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32614509&tid=1578198]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
84ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 227ms |
| total: | 414ms |

| 0 / 0 |
