powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Выбивает БД
25 сообщений из 40, страница 1 из 2
Выбивает БД
    #34710953
rashman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
думал, где это уместнее разместить здесь, или в базах... но поскольку проблема очевидно во взаимодействии VM с базой - разместил здесь.

ситуация бредовая полностью!

есть
PB 9.01 7171
ASA 9.02

вызываю из приложения сторед процедуру
на основании выполнения процедуры строю кросстаб

всё зашибись до тех пор, пока не вызываю эту же процедуру второй раз. при повторном вызове процедуры из приложения ложица сервер БД.

провел ряд экспериментов. вот что выяснил.

из централа процедура запускаеца нормально неограниченное кол-во раз.
из приложения можно запустить только один раз. но если после первого запуска процедуры из приложения, в этом же приложении этим же коннектом сделать какие-л изменения в посторонних таблицах - второй раз процедура запустица тоже нормально. то есть, нельзя запускать процедуру подряд.
место вылета помечено красным. самое интересное, если я выношу очистку таблицы за пределы цикла - ничё не вылетает... всё работает... но мне нужно её чистить, чтобы был правильный резалт.

собсно вот код процедуры:

ALTER PROCEDURE "DBA"."sp_sales_production_by_month"(in ad_date_start timestamp,in ad_date_end timestamp,in al_production_id integer)
result(res_year integer,res_month char(32),
RETAIL_COUNT integer,RETAIL_SUMMA decimal(12,4),
BUYERS_COUNT integer,BUYERS_SUMMA decimal(12,4))
BEGIN
declare li_ys integer; // year_start
declare li_ms integer; // month_start
declare li_ye integer; // year_end
declare li_me integer; // month_end
declare ld_ds timestamp; // date_start for loop
declare ld_de timestamp; // date_end for loop

DECLARE LOCAL TEMPORARY TABLE tt_sales_month(
l_year integer,
l_month char(32),
l_retail_count integer,
l_retail_sum decimal(12,2),
l_buyers_count integer,
l_buyers_sum decimal(12,2)
);
delete from tt_sales_month;

set li_ys = year( ad_date_start );
set li_ms = month( ad_date_start );
set li_ye = year( ad_date_end );
set li_me = month( ad_date_end ) + 1;
if li_me=13 then
set li_me = 1;
set li_ye = li_ye + 1;
end if;

set ad_date_start = datetime( string( li_ys ) || '-' || string( li_ms ) );
set ad_date_end = datetime( string( li_ye ) || '-' || string( li_me ) );

set ld_ds = ad_date_start;

// Разбиваем по этапам
while ld_ds < ad_date_end loop

// Сдвигаем конец на месяц
set li_ye = year( ld_ds );
set li_me = month( ld_ds ) + 1;
if li_me=13 then
set li_me = 1;
set li_ye = li_ye + 1;
end if;
set ld_de = datetime( string( li_ye ) || '-' || string( li_me ) );

// Чистим верменную таблицу
delete from dba.sales_total;

// Расчитываем продажи за месяц
call dba.sp_sales_all_reserv( ld_ds, ld_de );
insert into tt_sales_month(l_year, l_month, l_retail_count, l_retail_sum, l_buyers_count, l_buyers_sum )
select year( ld_ds ),
(CASE month( ld_ds )
WHEN 1 then '01 - Январь'
WHEN 2 then '02 - Февраль'
WHEN 3 then '03 - Март'
WHEN 4 then '04 - Апрель'
WHEN 5 then '05 - Май'
WHEN 6 then '06 - Июнь'
WHEN 7 then '07 - Июль'
WHEN 8 then '08 - Август'
WHEN 9 then '09 - Сентябрь'
WHEN 10 then '10 - Октябрь'
WHEN 11 then '11 - Ноябрь'
WHEN 12 then '12 - Декабрь'
END),
sum( dba.sales_total.retail_count ),
sum( dba.sales_total.retail_summa ),
sum( dba.sales_total.buyers_count ),
sum( dba.sales_total.buyers_summa )
from
dba.sales_total
where
sales_total.article_id =
any( select article.article_id
from dba.article
where article.production_id = al_production_id);


set ld_ds = ld_de;
end loop;

// Выводим результат
select * from tt_sales_month;
END



вылетает всегда вот здесь:
// Чистим верменную таблицу
delete from dba.sales_total;
где бы я ее не поставил - всегда вылетает!
dba.sales_total - global temporaly table

код специально максимально упростил, чтобы проще было разбираца, где именно глюк!
...
Рейтинг: 0 / 0
Выбивает БД
    #34711001
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала поставить PB 9.03 последний билд
...
Рейтинг: 0 / 0
Выбивает БД
    #34711060
rashman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
EstetsДля начала поставить PB 9.03 последний билд

а как это может повлиять? я же не из среды запускаюсь... тут максимум проблема в машине... вопрос, как ее обойти?
...
Рейтинг: 0 / 0
Выбивает БД
    #34711140
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rashman EstetsДля начала поставить PB 9.03 последний билд

а как это может повлиять? я же не из среды запускаюсь... тут максимум проблема в машине... вопрос, как ее обойти?

но поскольку проблема очевидно во взаимодействии VM с базой

а как может повлиять версия VM на взаимодействие VM с базой?
да как угодно может повлиять.
что такое "ложица сервер БД"? в чем это выражаеца?
...
Рейтинг: 0 / 0
Выбивает БД
    #34711218
rashman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЗоринАндрей
что такое "ложица сервер БД"? в чем это выражаеца?

ASA вылетает с системной табличкой "отправить уведомление разработчикам"
...
Рейтинг: 0 / 0
Выбивает БД
    #34711457
Фотография Ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А при выполнении делита точно нет никого, кто мог бы держать записи в dba.sales_total ? Другой коннект, этот же коннект но другое ДВ/ДС/прямой запрос/курсор/etc.?

Ну еще можно попробовать решать бредовую проблему бредовым образом - вынести делит в отдельную процедуру и вызывать ее в нужном месте...

ЗЫ Вообще было бы неплохо Аскруса на эту тему попытать, как прекрасно знающего и АСА и РВ, но он нынче крайне редкий гость... Попробую ему ссылочку скинуть, может заглянет...
------------
С уважением, IKAR

IkarHomeCenter ........ Детский Дворик ........ ГавГав.Инфо
Портал русскоязычной группы пользователей Sybase
...
Рейтинг: 0 / 0
Выбивает БД
    #34711752
rashman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IkarА при выполнении делита точно нет никого, кто мог бы держать записи в dba.sales_total ? Другой коннект, этот же коннект но другое ДВ/ДС/прямой запрос/курсор/etc.?

Ну еще можно попробовать решать бредовую проблему бредовым образом - вынести делит в отдельную процедуру и вызывать ее в нужном месте...

ЗЫ Вообще было бы неплохо Аскруса на эту тему попытать, как прекрасно знающего и АСА и РВ, но он нынче крайне редкий гость... Попробую ему ссылочку скинуть, может заглянет...
------------
С уважением, IKAR

IkarHomeCenter ........ Детский Дворик ........ ГавГав.Инфо
Портал русскоязычной группы пользователей Sybase

если идет блокировка на уровне таблицы, то почему сервер вываливается, а не просто идет сообщение о невозможности записи?
и почему процедура из искуэля запускаеца стоко раз, скоко хош?
...
Рейтинг: 0 / 0
Выбивает БД
    #34711801
Фотография Ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rashmanесли идет блокировка на уровне таблицы, то почему сервер вываливается, а не просто идет сообщение о невозможности записи?
и почему процедура из искуэля запускаеца стоко раз, скоко хош?
Честно? Понятия не имею!
Я просто предложил Вам проверить те моменты, которые бы проверил сам в первую очередь, окажись я на Вашем месте, и не более того...

ЗЫ В АСА, кстати, на сколько я помню, тоже не все билды стабильны. Некоторые валились чуть ли не от чиха. Так что еще, в качестве рекомендации, опять же, переформулирую пост Estets 'a: поиграйтесь с билдами РВ и ЕБФ-ами АСА...
------------
С уважением, IKAR

IkarHomeCenter ........ Детский Дворик ........ ГавГав.Инфо
Портал русскоязычной группы пользователей Sybase
...
Рейтинг: 0 / 0
Выбивает БД
    #34711926
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rashmanASA вылетает с системной табличкой "отправить уведомление разработчикам"
Вариант собственно говоря один - база умирает. Подключись к ней из Централа и сделай validate.

В приведеной ХП я не увидел определения таблицы sales_total из чего я делаю вывод что это постоянная таблица а не временая, как заявлено.

В любом случае в этой таблице нету смысла. Она используется только для вытаскивания резалтсета из внутренней процедуры, а это лучше делать вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
insert into tt_sales_month(l_year, l_month, l_retail_count, l_retail_sum, l_buyers_count, l_buyers_sum )
select year( ld_ds ), (CASE month( ld_ds ) .... END),
         sum( sales_total.retail_count ),
         sum( sales_total.retail_summa ),
         sum( sales_total.buyers_count ),
         sum( sales_total.buyers_summa )
from dba.sp_sales_all_reserv( ld_ds, ld_de ) as sales_total
where sales_total.article_id = 
         any( select article.article_id from dba.article where article.production_id = al_production_id);



PS: Пользуйся тэгом src...
...
Рейтинг: 0 / 0
Выбивает БД
    #34712104
rashman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl rashmanASA вылетает с системной табличкой "отправить уведомление разработчикам"
Вариант собственно говоря один - база умирает. Подключись к ней из Централа и сделай validate.


да при чем тут валидация? с бд всё в порядке... если бы с бд было что-то не так, то запуск процедуры из искуэля был бы тоже с ашипкой.

White Owl
В приведеной ХП я не увидел определения таблицы sales_total из чего я делаю вывод что это постоянная таблица а не временая, как заявлено.


нет. это как раз именно GLOBAL TEMPORALY TABLE ап чем и было написано ранее... есь GLOBAL, которые висят в списке таблиц, а есь LOCAL, которые апьявляюццо по месту...

White Owl
В любом случае в этой таблице нету смысла. Она используется только для вытаскивания резалтсета из внутренней процедуры, а это лучше делать вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
insert into tt_sales_month(l_year, l_month, l_retail_count, l_retail_sum, l_buyers_count, l_buyers_sum )
select year( ld_ds ), (CASE month( ld_ds ) .... END),
         sum( sales_total.retail_count ),
         sum( sales_total.retail_summa ),
         sum( sales_total.buyers_count ),
         sum( sales_total.buyers_summa )
from dba.sp_sales_all_reserv( ld_ds, ld_de ) as sales_total
where sales_total.article_id = 
         any( select article.article_id from dba.article where article.production_id = al_production_id);


не пойдет... процедура sp_sales_all_reserv наполняет таблицу и ничего там не селектица. так сложилось исторически и в таком виде досталось мне. менять что-л в этом месте - это подписать себе на год вперед проблемы и претензии из бухгалтерии и от складов.

White Owl
PS: Пользуйся тэгом src...

с тегами учту... просто не заметил...
...
Рейтинг: 0 / 0
Выбивает БД
    #34712151
rashman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IkarНу еще можно попробовать решать бредовую проблему бредовым образом - вынести делит в отдельную процедуру и вызывать ее в нужном месте...


не помогло
...
Рейтинг: 0 / 0
Выбивает БД
    #34712173
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
- как коннектитесь к БД ODBC или SYC?
- как вызываете процедуру из ПБ
- можно ли вызвать процедуру несколько раз из самого билдера (database painter)
...
Рейтинг: 0 / 0
Выбивает БД
    #34712230
Oleg1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rashmanвсё зашибись до тех пор, пока не вызываю эту же процедуру второй раз. при повторном вызове процедуры из приложения ложица сервер БД.IMHO, это проблема именно БД. Т.к. ни при каких условиях она не должна ложиться. Для начала все-таки надо поглядеть сообщение об ошибке, с которым все умирает, и попробовать поискать в списке багфиксов для ASA. Или просто накатить последний ASA 9.*

А не падает из isql из-за другого способа вызов хранимой. Сэмулировать из-под PB isql можно через execute immediate.

Если совсем ничего не поможет, то придется ставить фиктивные запросы, которые уже нащупаны.

И еще. А не стоит ли RetrieveAsNeed?
...
Рейтинг: 0 / 0
Выбивает БД
    #34712553
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
покажи пожалуйста синтаксис DataWindow, раздел table(........)
...
Рейтинг: 0 / 0
Выбивает БД
    #34712724
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcryoпокажи пожалуйста синтаксис DataWindow, раздел table(........)
И еще сюда описание самой глобальной таблички (Ctrl-C в Central на ней и копипаст сюда).
...
Рейтинг: 0 / 0
Выбивает БД
    #34712741
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так может и не заморачиватся с delete? Просто использовать truncate
Я не великий спец по ASA, но под Oracle я бы так и сделал
--------------------------------------------------
Главная деталь любой машины - голова ее владельца
...
Рейтинг: 0 / 0
Выбивает БД
    #34712744
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А локальную функцию обьявить можно, тогда перенести del или trunc туда
Сразу будет я сно в чем причина:)
--------------------------------------------------
Главная деталь любой машины - голова ее владельца
...
Рейтинг: 0 / 0
Выбивает БД
    #34712849
rashman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
подключаюсь через ОДБЦ

Код: plaintext
1.
2.
3.
4.
5.
table(column=(type=char( 20 ) updatewhereclause=yes name=res_month dbname="res_month" )
 column=(type=number updatewhereclause=yes name=retail_count dbname="retail_count" )
 column=(type=number updatewhereclause=yes name=retail_summa dbname="retail_summa" )
 column=(type=number updatewhereclause=yes name=buyers_count dbname="buyers_count" )
 column=(type=number updatewhereclause=yes name=buyers_summa dbname="buyers_summa" )
 procedure="1 execute dba.sp_sales_production_by_month;0 ad_date_start = :ad_date_start, ad_date_end = :ad_date_end, al_production_id = :al_production_id" arguments=(("ad_date_start", date),("ad_date_end", date),("al_production_id", number))  sort="res_month A " )
...
Рейтинг: 0 / 0
Выбивает БД
    #34712898
rashman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
spas2001Так может и не заморачиватся с delete? Просто использовать truncate
Я не великий спец по ASA, но под Oracle я бы так и сделал
--------------------------------------------------
Главная деталь любой машины - голова ее владельца

ИМХО не очень удачная идея хотя бы по правам доступа... чтобы пользователь мог делать трункейт ему надо дать alter на таблицу, что не есь гут.

но я попробовал. ваще не понятно. после трункейта таблица ваще не наполняеца.
...
Рейтинг: 0 / 0
Выбивает БД
    #34713099
Фотография Ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSИ еще сюда описание самой глобальной таблички (Ctrl-C в Central на ней и копипаст сюда).
...
Рейтинг: 0 / 0
Выбивает БД
    #34713723
rashman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE GLOBAL TEMPORARY TABLE "DBA"."SALES_TOTAL" (
	"ARTICLE_ID" integer NULL DEFAULT  0 ,
	"RETAIL_COUNT" integer NULL DEFAULT  0 ,
	"RETAIL_SUMMA" "T_MONEY" NULL DEFAULT  0 ,
	"BUYERS_COUNT" integer NULL DEFAULT  0 ,
	"BUYERS_SUMMA" "T_MONEY" NULL DEFAULT  0 ,
	"base_summa_r" "T_MONEY" NULL DEFAULT  0 ,
	"base_summa_b" "T_MONEY" NULL DEFAULT  0 ,
	"article_count" integer NULL,
	"writing_count" integer NULL DEFAULT  0 ,
	"writing_summa" decimal( 16 , 4 ) NULL DEFAULT  0 ,
	"writing_base" decimal( 16 , 4 ) NULL DEFAULT  0 
) ON COMMIT DELETE ROWS;
...
Рейтинг: 0 / 0
Выбивает БД
    #34713751
KOLCHOZ_POSTEVENT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мужчина,я давно уже промышленно на PB не пишу,но по старой памяти,наш лидер просил дописывать перед текстом вызова процы в окошечке,таком маленьком
Код: plaintext
begin tran;вызов процы;commit;
давно было,не судите строго,забыл всё к чертям.
А исчо,если жизнь останеться такая тяжёлая,может в retrieveend сделать
Код: plaintext
1.
2.
3.
disconnect;
connect;
this.settransobject(SQLCA)
...
Рейтинг: 0 / 0
Выбивает БД
    #34714110
rashman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KOLCHOZ_POSTEVENTМужчина,я давно уже промышленно на PB не пишу,но по старой памяти,наш лидер просил дописывать перед текстом вызова процы в окошечке,таком маленьком
Код: plaintext
begin tran;вызов процы;commit;


не совсем понял где прописывать....

KOLCHOZ_POSTEVENT
давно было,не судите строго,забыл всё к чертям.
А исчо,если жизнь останеться такая тяжёлая,может в retrieveend сделать
Код: plaintext
1.
2.
3.
disconnect;
connect;
this.settransobject(SQLCA)


этот метод срабатывает... но он корявый. мы просто обнуляем подсоединение и ессно "каждый раз в первый класс!". кроме того теряется инфа о соединении
...
Рейтинг: 0 / 0
Выбивает БД
    #34714881
KOLCHOZ_POSTEVENT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если так,по бырому,попробуйте,вдруг пойдёт.
Код: plaintext
1.
2.
3.
4.
5.
6.
string ls_string
ls_string='begin tran'
execute immediate :ls_string;
this.retrieve()
ls_string='commit'
execute immediate :ls_string;
А если вы этого окошка ни разу не видали,то как объяснить?
Там, где перечислены поля в гриде,жёлтая,такая табличка,найдите свободное место и right click,выбирете stored procedure,оно и откроется,должно,по крайней мере.Когда будете дописывать,на ENTER жмите вместе с cntrl,иначе,он думает,то вы давите OK.
...
Рейтинг: 0 / 0
Выбивает БД
    #34714892
KOLCHOZ_POSTEVENT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чо-то такое,должно получиться.
...
Рейтинг: 0 / 0
25 сообщений из 40, страница 1 из 2
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Выбивает БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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