Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / опять EXECUTE STATEMENT / 25 сообщений из 50, страница 1 из 2
19.07.2004, 22:30:57
    #32611555
vaa
vaa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
Или лыжи не едут...

Есть таблица
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.

У кого есть какие-нибудь мысли по этому поводу?
...
Рейтинг: 0 / 0
20.07.2004, 10:20:41
    #32611843
AndriyKo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
автор
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 нужно убедиться в отсутствии неопределенных значений.
...
Рейтинг: 0 / 0
20.07.2004, 10:42:49
    #32611895
vaa
vaa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
Убеждался. Прекрасная строка - как и должно быть,
только
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 правильная.
...
Рейтинг: 0 / 0
20.07.2004, 11:03:01
    #32611952
AndriyKo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
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;

Че теперь получится ?
...
Рейтинг: 0 / 0
20.07.2004, 16:02:33
    #32613056
vaa
vaa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
Все то же.
Хотя, с недавних пор появляется другое исключение


Arithmetic overflow or division by zero has occurred.
arithmetic exception, numeric overflow, or string truncation.
...
Рейтинг: 0 / 0
20.07.2004, 16:10:47
    #32613093
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
И охота же людям заниматься мастурбацией через анус...
Чего ради нужно заморачиваться с некоей универсальной процедурой,
производительность которой будет к тому же довольно низкой?
Их ферштее нихт...
...
Рейтинг: 0 / 0
20.07.2004, 16:10:54
    #32613094
AndriyKo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
vaaВсе то же.
Хотя, с недавних пор появляется другое исключение


Arithmetic overflow or division by zero has occurred.
arithmetic exception, numeric overflow, or string truncation.

Та это уже, наверно, надо триггеры на TableName смотреть
...
Рейтинг: 0 / 0
20.07.2004, 16:15:17
    #32613110
AndriyKo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
МимопроходящийИ охота же людям заниматься мастурбацией через анус...
Чего ради нужно заморачиваться с некоей универсальной процедурой,
производительность которой будет к тому же довольно низкой?
Их ферштее нихт...

Вот он поколупается с ней да и, глядишь, бросит... Все познается только опытным путем (к сожалению). Ты же вот знаешь задрочки "универсальных" процедур, стало быть, шишек мало-мало набил :-)
...
Рейтинг: 0 / 0
20.07.2004, 16:20:04
    #32613125
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
По этому поводу:

...
Рейтинг: 0 / 0
20.07.2004, 18:12:47
    #32613442
vaa
vaa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
Триггеров нет

PS: Мимопроходящему:
Просили помочь разобраться с этой ситуацией, а не материться и корчить из себя "гуру". Короче,проходя-проходи, "гуру", не засоряй эфир!
...
Рейтинг: 0 / 0
20.07.2004, 18:39:19
    #32613516
alex777
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
а сходика вот сюда
...
Рейтинг: 0 / 0
20.07.2004, 18:44:37
    #32613526
Gold
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
В процедуре сделай SQL выходным параметром и сделай обработчик исключений и покажи нам чё за команда выполняется в EXECUTE STATEMENT.
...
Рейтинг: 0 / 0
20.07.2004, 21:24:27
    #32613697
vaa
vaa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
Att: alex777
На уродов больше не реагирую
...
Рейтинг: 0 / 0
20.07.2004, 21:31:51
    #32613699
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
Alex777 конечно погорячился, но взамно-посылами, имхо, дело не ограничится...
Ты с этими EXECUTE STATEMENT имеешь нестандартные интимные отношения,
начиная с 13-го апреля.
Может стОит пересмотреть подход к рещению задачи?
...
Рейтинг: 0 / 0
20.07.2004, 21:53:58
    #32613713
vaa
vaa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
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;
запрос не возвращает ни одной строки
Если на возврате строка - все ОК.
Кажется, что все-таки глюк
...
Рейтинг: 0 / 0
21.07.2004, 08:46:08
    #32613874
VF
VF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
ух ты...
неужели эксперт может нормально отлаживать процедуры с EXECUTE STATEMENT???
скажите как такого добиться, а то у меня не могёт...
...
Рейтинг: 0 / 0
21.07.2004, 08:47:51
    #32613877
alex777
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
а сходика вот сюда
и еще куданить где тебя научат правилам хорошего тона

vaa
PS: Мимопроходящему:
Просили помочь разобраться с этой ситуацией, а не материться и корчить из себя "гуру". Короче,проходя-проходи, "гуру", не засоряй эфир!
...
Рейтинг: 0 / 0
21.07.2004, 08:49:05
    #32613878
VF
VF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
2 alex777
это мне???
я там был уже...
...
Рейтинг: 0 / 0
21.07.2004, 08:58:36
    #32613891
alex777
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
2 VF
не надо фсе принимать на свой счет, ты опубликовал свое сообщение когда я писал свое, я это сказал АВТОРУ,
P.S. кто нить отмодерировал бы чтоль топик
...
Рейтинг: 0 / 0
21.07.2004, 09:06:03
    #32613899
VF
VF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
fedd спит ещё, наверное
...
Рейтинг: 0 / 0
21.07.2004, 09:50:37
    #32613974
Bol
Bol
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
эээ... ещё не проснулся но попробую включится
vaaИли лыжи не едут...
Теперь о нюансах:
Есль прослеживается весь путь до корня - все отрабатывает.
Если же где-то обрыв (ну удалили родителя)
Unsuccessful execution caused by an unavailable resource.
Invalid argument in EXECUTE STATEMENT - cannot convert to string.
У кого есть какие-нибудь мысли по этому поводу?
Мысль одна - в базе д.б. триггер, который будет контролировать ее целостность - то есть либо удалит все дочерние ветви - либо
не позволит удалить родителя, если есть дети.
...
Рейтинг: 0 / 0
21.07.2004, 10:56:03
    #32614152
AndriyKo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
vaa
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
WHILE (VAR_ID > 0) DO
BEGIN
  If (Table_Name Is Null) Then Table_Name='';
 If (VAR_ID Is Null) Then VAR_ID=0; 

 sql = 'SELECT PARENT_TID, NAME FROM ' || Table_Name  ||
   ' WHERE TID = ' || :VAR_ID;
 EXECUTE STATEMENT  SQL  INTO :vP_ID, :vNAME;

  If (vNAME Is Null) Then vNAME='';
 If (vP_ID Is Null) Then vP_ID=0; 

 VAR_ID=vP_ID;
  if (vName = '') then NAME_FULL = 'damagesRoot';
  else NAME_FULL = vNAME || '@' || NAME_FULL;
END
RETPASH = NAME_FULL;
SUSPEND;
END


Продолжаю настаивать на ОБЯЗАТЕЛЬНОЙ ПРОВЕРКЕ НА NULL во всех случаях ! Только что прокрутил твои процедуры в IBExpert (FB 1.5) - все работает, так что вряд ли дело в глюках :-).
...
Рейтинг: 0 / 0
21.07.2004, 12:16:45
    #32614388
Gold
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
Ты напиши так, и покажи что вернёт процедура:

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
...
Рейтинг: 0 / 0
21.07.2004, 12:53:16
    #32614509
VF
VF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
2 AndriyKo
да КАК ЭКСПЕРТ у Тебя ПРОПУСКАЕТ такие процедуры, у меня ругается и всё тут, хотя вызываю из проги и всё пахает...
...
Рейтинг: 0 / 0
21.07.2004, 13:45:23
    #32614676
vaa
vaa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
опять EXECUTE STATEMENT
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

Эта на крайний случай. Уже думал об этом
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / опять EXECUTE STATEMENT / 25 сообщений из 50, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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