Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Выбивает БД / 25 сообщений из 40, страница 1 из 2
07.08.2007, 14:41
    #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
07.08.2007, 14:50
    #34711001
Estets
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбивает БД
Для начала поставить PB 9.03 последний билд
...
Рейтинг: 0 / 0
07.08.2007, 15:03
    #34711060
rashman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбивает БД
EstetsДля начала поставить PB 9.03 последний билд

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

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

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

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

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

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

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

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

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

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

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

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

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

IkarHomeCenter ........ Детский Дворик ........ ГавГав.Инфо
Портал русскоязычной группы пользователей Sybase
...
Рейтинг: 0 / 0
07.08.2007, 18:07
    #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
07.08.2007, 18:47
    #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
07.08.2007, 19:01
    #34712151
rashman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбивает БД
IkarНу еще можно попробовать решать бредовую проблему бредовым образом - вынести делит в отдельную процедуру и вызывать ее в нужном месте...


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

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

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

И еще. А не стоит ли RetrieveAsNeed?
...
Рейтинг: 0 / 0
08.08.2007, 01:01
    #34712553
rcryo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбивает БД
покажи пожалуйста синтаксис DataWindow, раздел table(........)
...
Рейтинг: 0 / 0
08.08.2007, 08:56
    #34712724
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбивает БД
rcryoпокажи пожалуйста синтаксис DataWindow, раздел table(........)
И еще сюда описание самой глобальной таблички (Ctrl-C в Central на ней и копипаст сюда).
...
Рейтинг: 0 / 0
08.08.2007, 09:13
    #34712741
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбивает БД
Так может и не заморачиватся с delete? Просто использовать truncate
Я не великий спец по ASA, но под Oracle я бы так и сделал
--------------------------------------------------
Главная деталь любой машины - голова ее владельца
...
Рейтинг: 0 / 0
08.08.2007, 09:15
    #34712744
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбивает БД
А локальную функцию обьявить можно, тогда перенести del или trunc туда
Сразу будет я сно в чем причина:)
--------------------------------------------------
Главная деталь любой машины - голова ее владельца
...
Рейтинг: 0 / 0
08.08.2007, 10:05
    #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
08.08.2007, 10:16
    #34712898
rashman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбивает БД
spas2001Так может и не заморачиватся с delete? Просто использовать truncate
Я не великий спец по ASA, но под Oracle я бы так и сделал
--------------------------------------------------
Главная деталь любой машины - голова ее владельца

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

но я попробовал. ваще не понятно. после трункейта таблица ваще не наполняеца.
...
Рейтинг: 0 / 0
08.08.2007, 11:01
    #34713099
Ikar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбивает БД
ASCRUSИ еще сюда описание самой глобальной таблички (Ctrl-C в Central на ней и копипаст сюда).
...
Рейтинг: 0 / 0
08.08.2007, 13:21
    #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
08.08.2007, 13:26
    #34713751
KOLCHOZ_POSTEVENT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбивает БД
Мужчина,я давно уже промышленно на PB не пишу,но по старой памяти,наш лидер просил дописывать перед текстом вызова процы в окошечке,таком маленьком
Код: plaintext
begin tran;вызов процы;commit;
давно было,не судите строго,забыл всё к чертям.
А исчо,если жизнь останеться такая тяжёлая,может в retrieveend сделать
Код: plaintext
1.
2.
3.
disconnect;
connect;
this.settransobject(SQLCA)
...
Рейтинг: 0 / 0
08.08.2007, 14:47
    #34714110
rashman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбивает БД
KOLCHOZ_POSTEVENTМужчина,я давно уже промышленно на PB не пишу,но по старой памяти,наш лидер просил дописывать перед текстом вызова процы в окошечке,таком маленьком
Код: plaintext
begin tran;вызов процы;commit;


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

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


этот метод срабатывает... но он корявый. мы просто обнуляем подсоединение и ессно "каждый раз в первый класс!". кроме того теряется инфа о соединении
...
Рейтинг: 0 / 0
08.08.2007, 17:50
    #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
08.08.2007, 17:53
    #34714892
KOLCHOZ_POSTEVENT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбивает БД
Чо-то такое,должно получиться.
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Выбивает БД / 25 сообщений из 40, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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