Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > Получение данных из процедуры через select. Пробле


Автор: autotester 9.6.2006, 10:42
запости куда нить
---------- Защищенная информация ----------
1.
Господа, подскажите пожалуйста почему в IBConsole при выполнении select из любой процедуры
Код

select * from test


Код

CREATE PROCEDURE TEST 
RETURNS 

  N INTEGER 

AS 
begin 
 N=23; 
end 


выкидывает ошибку "Unknown Error - Can't retrieve plan."  Заранее благодарен.

2. 
И еще простите за чайниковский вопрос: после создания  ХП смотрю ее текст в базе, текст начинается и заканчивается командой commit work. Получается перед стартом процедуры все изменения транзакции сохранятся и после выполнения? Если это так, то как от них избавится, если мне например нужно выполнить несколько процедур а потом уже по результату выполнения решить коммитить или нет. Или я чего путаю? 





M
Akella
Используйте тэг "Код"


Советую внимательно прочесть:
http://forum.vingrad.ru/forum/topic-237714.html
http://forum.vingrad.ru/forum/topic-126445.html

Автор: vv3 10.6.2006, 15:30
1. N = 23 - ради такого ХП делать... Не может сервер план создать просто потому, что нет у тебя обращения ни к одному объекту БД. Хорошенькая процедура TEST! Написал бы хотя бы так: 
Код

SELECT 23 FROM RDB$DATABASE

2. Путаешь. Учи матчасть.
В метаданных БД содержится скрипт создания процедуры и, естественно, этот скрипт оканчивается COMMIT WORK, ибо после выполнения скрипта нужно закоммитить изменения, сделанные им в системных таблицах. Начинается скрипт, правда не с COMMIT WORK, а с CREATE PROCEDURE, а верхний COMMIT от предыдущего блока... 

Автор: olek68 6.9.2010, 07:06
Доброе утро.
Создаю процедуру для отбора данных с таблицы почасовой температуры :

Код

create procedure MY_TEMP (MIN_DT date,MAX_DT date)
returns (DT date,MIN_T double precision,AVG_T double precision,MAX_T double precision)
as
begin
 dt = min_dt-1;
 while (dt<max_dt)
 do
  begin dt = dt+1;
   select min(TEMPERATURE), avg(TEMPERATURE), max(TEMPERATURE) from T_TABL
   where ID=01 and (T_DATE between : dt and : dt+0.99)
   into :min_t, :avg_t, :max_t;
   suspend;
  end
end^


проверяю SQL Editor-ом  в IB Expert:

Код

select * from MY_TEMP('01.07.2010','20.07.2010')


В результате  получаю таблицу с необходимыми данными.  smile 
Создаю небольшую программку на Delphi, где в IBQuery1.SQL.Add пишу соответствующий запрос. И  жму IBQuery1.Open;
 smile 
Dynamic SQL Error
SQL error code = -204
Procedure unknown
MY_TEMP
unknown ISC error 336397208
в чём  проблема?

Автор: olek68 6.9.2010, 09:01
Упс.  Нашёл ошибку.  smile 
Благодарю всех кто хотел помочь но не успел…   smile 

Автор: Eugeneus2010 11.9.2010, 16:17
Видимо потому, что suspend-а не было.

Автор: TechnoMag 6.6.2016, 18:00
_ удалено

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)