Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Выполнить хранимую процедуру для POSTGRES ... нашел решение (число прочтений - 1945 )
menen
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 09. Сентября 2011
Выполнить хранимую процедуру для POSTGRES ... нашел решение
09. Сентября 2011 :: 04:15
Печать  
Используем 1CPP для работы в POSTGRES (через SELTA). Написана хранимая процедура, в которой есть предложение $BODY$ . Естественно, парсер 1CPP не понимает его (Meta name parser error: неизвестное метаимя или алиас "$BODY").

Вопрос: как обойти эту проблему?

Текст хранимой процедуры ("!!" впереди означает, что запрос выполняется напрямую - минуя Selta):

     ТекстЗапроса = "!!
     |
     |CREATE OR REPLACE FUNCTION pg_temp.clearTotal()
       |RETURNS void AS
     |$BODY$
     |DECLARE
     |  _tovar mchar(9);
     |  _dr mchar(9);
     |  _ost double precision;
     |  _iddoc mchar(9);
     |  _iddocdef integer;
     |  _date_time_iddoc mchar(23);
     |  _kol double precision;
     |  countKol double precision;
     |  cur_tovars REFCURSOR;
     |  flag integer;
     |  cur_docs REFCURSOR;
     |BEGIN
     |      NULL;
     |      OPEN cur_tovars FOR SELECT DISTINCT tovar, dr, ost FROM tmpdocs;
     |      FETCH cur_tovars INTO _tovar, _dr, _ost;
     |      
     |      WHILE FOUND = true LOOP
     |            countKol := 0;
     |            flag := 0;
     |            OPEN cur_docs FOR SELECT date_time_iddoc, kol FROM tmpdocs WHERE tovar = _tovar and dr = _dr ORDER BY date_time_iddoc DESC;
     |            FETCH cur_docs INTO _date_time_iddoc, _kol;
     |                  
     |            WHILE FOUND = true LOOP
     |                  IF (flag = 1) THEN
     |                        DELETE FROM tmpdocs WHERE tovar=_tovar AND dr=_dr AND date_time_iddoc=_date_time_iddoc;
     |                  END IF;
     |                  countKol = countKol + _kol;
     |                  IF (countKol >= _ost) THEN flag := 1; END IF;
     |                  
     |                  FETCH cur_docs INTO _date_time_iddoc, _kol;
     |            END LOOP;
     |            CLOSE cur_docs;
     |            FETCH cur_tovars INTO _tovar, _dr, _ost;
     |      END LOOP;
     |      CLOSE cur_tovars;
     |END;
     |$BODY$
     |  LANGUAGE plpgsql VOLATILE
     |  COST 100;
     |ALTER FUNCTION pg_temp.clearTotal() OWNER TO postgres;
     |
     |;
   |SELECT pg_temp.clearTotal();
     |";
     RS.Выполнить(ТекстЗапроса);
« Последняя редакция: 13. Сентября 2011 :: 06:16 - menen »  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Выполнить хранимую процедуру для POSTGRES
Ответ #1 - 09. Сентября 2011 :: 05:08
Печать  
В тексте запроса писать заместо $ например, @, потом сделать

Код
Выбрать все
ТекстЗапроса=глМД.ОбрМетаСКЛ(ТекстЗапроса);
ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"@","$");
 


ну и выполнить запрос.
  
Наверх
 
IP записан
 
menen
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 09. Сентября 2011
Re: Выполнить хранимую процедуру для POSTGRES
Ответ #2 - 09. Сентября 2011 :: 05:58
Печать  
Может быть я что-то не так делаю ...
Что значит выполнить:

..........................
<заменил $ на @>

НовыйТекст = глMDW.ОбрМетаСКЛ(ТекстЗапроса);
НовыйТекст = СтрЗаменить(НовыйТекст,"@","$");

RS.Выполнить(НовыйТекст); //  ??? может быть есть вызов другой МИНУЯ ПАРСЕР

... та же ошибка

  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Выполнить хранимую процедуру для POSTGRES
Ответ #3 - 09. Сентября 2011 :: 06:24
Печать  
а всё, я про другое подумал.
Да, так не прокатит.
Почитай еще тут:


http://www.1cpp.ru/forum/YaBB.pl?num=1270458147/10#10
  
Наверх
 
IP записан
 
menen
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 09. Сентября 2011
Re: Выполнить хранимую процедуру для POSTGRES
Ответ #4 - 09. Сентября 2011 :: 06:37
Печать  
Нашел решение - возможно кому пригодиться.
Проблему с хранимой процедурой победил ... хранимой процедурой.

Идея заключается в том, чтобы ТЕКСТ по созданию хранимой процедуры затолкать в аргумент другой хранимой процедуры.

SELTA создает в 1C-й postgree-SQL базе хранимую процедуру exec_query(sql-текст).

Я обременяю текст по созданию своей временной хранимой процедуры в апострофы '' и выполняю :

..........
|SELECT exec_query('"+ ТекстХранимойПроцедуры+"');
|;
|SELECT pg_temp.clearTotal();
..........
« Последняя редакция: 13. Сентября 2011 :: 06:15 - menen »  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать