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

Есть таблица
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
опять EXECUTE STATEMENT
    #32611843
Фотография AndriyKo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
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
опять EXECUTE STATEMENT
    #32611895
vaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vaa
Гость
Убеждался. Прекрасная строка - как и должно быть,
только
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
опять EXECUTE STATEMENT
    #32611952
Фотография AndriyKo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
опять EXECUTE STATEMENT
    #32613056
vaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vaa
Гость
Все то же.
Хотя, с недавних пор появляется другое исключение


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


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

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

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

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

PS: Мимопроходящему:
Просили помочь разобраться с этой ситуацией, а не материться и корчить из себя "гуру". Короче,проходя-проходи, "гуру", не засоряй эфир!
...
Рейтинг: 0 / 0
опять EXECUTE STATEMENT
    #32613516
Фотография alex777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а сходика вот сюда
...
Рейтинг: 0 / 0
опять EXECUTE STATEMENT
    #32613526
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В процедуре сделай SQL выходным параметром и сделай обработчик исключений и покажи нам чё за команда выполняется в EXECUTE STATEMENT.
...
Рейтинг: 0 / 0
опять EXECUTE STATEMENT
    #32613697
vaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vaa
Гость
Att: alex777
На уродов больше не реагирую
...
Рейтинг: 0 / 0
опять EXECUTE STATEMENT
    #32613699
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex777 конечно погорячился, но взамно-посылами, имхо, дело не ограничится...
Ты с этими EXECUTE STATEMENT имеешь нестандартные интимные отношения,
начиная с 13-го апреля.
Может стОит пересмотреть подход к рещению задачи?
...
Рейтинг: 0 / 0
опять EXECUTE STATEMENT
    #32613713
vaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vaa
Гость
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
опять EXECUTE STATEMENT
    #32613874
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ух ты...
неужели эксперт может нормально отлаживать процедуры с EXECUTE STATEMENT???
скажите как такого добиться, а то у меня не могёт...
...
Рейтинг: 0 / 0
опять EXECUTE STATEMENT
    #32613877
Фотография alex777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а сходика вот сюда
и еще куданить где тебя научат правилам хорошего тона

vaa
PS: Мимопроходящему:
Просили помочь разобраться с этой ситуацией, а не материться и корчить из себя "гуру". Короче,проходя-проходи, "гуру", не засоряй эфир!
...
Рейтинг: 0 / 0
опять EXECUTE STATEMENT
    #32613878
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 alex777
это мне???
я там был уже...
...
Рейтинг: 0 / 0
опять EXECUTE STATEMENT
    #32613891
Фотография alex777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 VF
не надо фсе принимать на свой счет, ты опубликовал свое сообщение когда я писал свое, я это сказал АВТОРУ,
P.S. кто нить отмодерировал бы чтоль топик
...
Рейтинг: 0 / 0
опять EXECUTE STATEMENT
    #32613899
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fedd спит ещё, наверное
...
Рейтинг: 0 / 0
опять EXECUTE STATEMENT
    #32613974
Фотография Bol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эээ... ещё не проснулся но попробую включится
vaaИли лыжи не едут...
Теперь о нюансах:
Есль прослеживается весь путь до корня - все отрабатывает.
Если же где-то обрыв (ну удалили родителя)
Unsuccessful execution caused by an unavailable resource.
Invalid argument in EXECUTE STATEMENT - cannot convert to string.
У кого есть какие-нибудь мысли по этому поводу?
Мысль одна - в базе д.б. триггер, который будет контролировать ее целостность - то есть либо удалит все дочерние ветви - либо
не позволит удалить родителя, если есть дети.
...
Рейтинг: 0 / 0
опять EXECUTE STATEMENT
    #32614152
Фотография AndriyKo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
опять EXECUTE STATEMENT
    #32614388
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты напиши так, и покажи что вернёт процедура:

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
опять EXECUTE STATEMENT
    #32614509
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 AndriyKo
да КАК ЭКСПЕРТ у Тебя ПРОПУСКАЕТ такие процедуры, у меня ругается и всё тут, хотя вызываю из проги и всё пахает...
...
Рейтинг: 0 / 0
опять EXECUTE STATEMENT
    #32614676
vaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vaa
Гость
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
25 сообщений из 50, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / опять EXECUTE STATEMENT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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