Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Связывание таблицы и хранимки / 17 сообщений из 17, страница 1 из 1
05.05.2004, 18:08:24
    #32507941
vovan1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблицы и хранимки
Можно ли связать таблицу и хранимку?

я пробую сделать вот так:

select cd.Id,d.Discount
from Cards cd, GETCLIENTDISCOUNT(cd.Id,'01.05.03',0,0) d

план строит нормально а при выполнении пишет:
The cursor identified in the update or delete statement is not positioned on . no current record for fetch operation.
...
Рейтинг: 0 / 0
05.05.2004, 18:10:17
    #32507945
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблицы и хранимки
А где связь между ХП и таблицей ?

select cd.Id,d.Discount
from Cards cd, GETCLIENTDISCOUNT(cd.Id,'01.05.03',0,0) d ON (...)

Best regards,
Dnico.
...
Рейтинг: 0 / 0
05.05.2004, 18:13:35
    #32507949
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблицы и хранимки
И Вообще так не делают, надо так:

Код: plaintext
1.
2.
SELECT cd.Id,d.Discount
FROM Cards cd
JOIN GETCLIENTDISCOUNT('01.05.03', 0 , 0 ) d ON (cd.Id = d.Id)

Best regards,
Dnico.
...
Рейтинг: 0 / 0
05.05.2004, 18:14:47
    #32507951
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблицы и хранимки
И еще надо скорее всего текст ХП смотреть... чуствую там все не так ...

Best regards,
Dnico.
...
Рейтинг: 0 / 0
05.05.2004, 18:16:47
    #32507957
vovan1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблицы и хранимки
авторА где связь между ХП и таблицей ?
В процедуру передается параметр cd.Id который и является связкой

авторSELECT cd.Id,d.Discount
FROM Cards cd
JOIN GETCLIENTDISCOUNT('01.05.03',0,0) d ON (cd.Id = d.Id)


Все равно таже ошибка
...
Рейтинг: 0 / 0
05.05.2004, 18:17:43
    #32507959
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблицы и хранимки
Текст ХП нарисуй, сейчас разберемся ...

Best regards,
Dnico.
...
Рейтинг: 0 / 0
05.05.2004, 18:21:22
    #32507966
vovan1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблицы и хранимки
CREATE PROCEDURE GETCLIENTDISCOUNT(
CARDID VARCHAR(16),
DATEONLY DATE,
TOTAL DOUBLE PRECISION,
OPERID INTEGER)
RETURNS (
DISCOUNT DOUBLE PRECISION,
MAXSUM DOUBLE PRECISION,
CURRENTSUM DOUBLE PRECISION,
RET_CARDID VARCHAR(16))
AS
declare variable StartDate1 DATE;
declare variable StartDate2 DATE;
declare variable EndDate1 DATE;
declare variable EndDate2 DATE;
declare variable DateTemp DATE;

declare variable Sum1 DOUBLE PRECISION;
declare variable Sum2 DOUBLE PRECISION;
declare variable Sum1_S DOUBLE PRECISION;
declare variable Sum2_S DOUBLE PRECISION;
declare variable Sum1_R DOUBLE PRECISION;
declare variable Sum2_R DOUBLE PRECISION;
begin
/*---------------------------------------------------------*/
/*Сначала устанавливаем текущую дату*/
DateTemp = DateOnly;
StartDate1 = FirstDayMonth(DateTemp);
EndDate1 = LastDayMonth(DateTemp);

/*Отнимаем один месяц*/
DateTemp = IncDate(StartDate1,0,-1,0);
StartDate2 = FirstDayMonth(DateTemp);
EndDate2 = LastDayMonth(DateTemp);

/*--Выбираем из 2-х месяцев максимальную сумму----*/
SELECT SUM(Actual)
FROM Opers
WHERE (CardId = :CardId)
AND (RDB$Modified <> 1)
AND (DateOnly BETWEEN :StartDate1 AND :EndDate1)
AND (Id <> :OperId)
AND (ActionId <> 'R')
INTO :Sum1_S;
if (Sum1_S IS NULL) then Sum1_S = 0;

SELECT SUM(Actual)
FROM Opers
WHERE (CardId = :CardId)
AND (RDB$Modified <> 1)
AND (DateOnly BETWEEN :StartDate1 AND :EndDate1)
AND (Id <> :OperId)
AND (ActionId = 'R')
INTO :Sum1_R;
if (Sum1_R IS NULL) then Sum1_R = 0;

Sum1 = Sum1_S - Sum1_R;

CURRENTSUM = Sum1;

SELECT SUM(Actual)
FROM Opers
WHERE (CardId = :CardId)
AND (RDB$Modified <> 1)
AND (DateOnly BETWEEN :StartDate2 AND :EndDate2)
AND (Id <> :OperId)
AND (ActionId <> 'R')
INTO :Sum2_S;
if (Sum2_S IS NULL) then Sum2_S = 0;

SELECT SUM(Actual)
FROM Opers
WHERE (CardId = :CardId)
AND (RDB$Modified <> 1)
AND (DateOnly BETWEEN :StartDate2 AND :EndDate2)
AND (Id <> :OperId)
AND (ActionId = 'R')
INTO :Sum2_R;
if (Sum2_R IS NULL) then Sum2_R = 0;

Sum2 = Sum2_S - Sum2_R;
/*-------------------------------------------------*/

if (Sum1 > Sum2) then MaxSum = Sum1; else MaxSum = Sum2;
/*MaxSum = MaxSum + Total;*/

/*-----------Выбираем соответствующую скидку-------*/
SELECT MAX(Discount)
FROM DiscBarriers
WHERE (Barrier < :MaxSum)
INTO :Discount;

if (Discount IS NULL) then
/*Сумма ниже всех барьеров, делаем скидку минимальной*/
begin
SELECT MIN(Discount)
FROM DiscBarriers
INTO :Discount;
end
Ret_CardId = CardId;
suspend;
end


Когда вызываю просто
select * from GetClientDiscount('11111111','01.05.03',0,0)
то все нормально
...
Рейтинг: 0 / 0
05.05.2004, 18:25:47
    #32507978
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблицы и хранимки
Все понятно. Попробуй так:

Код: plaintext
1.
2.
SELECT cd.Id,d.Discount
FROM Cards cd
JOIN GETCLIENTDISCOUNT(cd.Id, '01.05.03',  0 ,  0 ) d ON (cd.Id = d.Ret_CardId)

Best regards,
Dnico.
...
Рейтинг: 0 / 0
05.05.2004, 18:27:25
    #32507981
vovan1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблицы и хранимки
Да уже давно так пробовал ошибка одна и та же

кстати FB1.5+IBExpert
...
Рейтинг: 0 / 0
05.05.2004, 18:45:30
    #32508016
vovan1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблицы и хранимки
SELECT cd.Id,(select Discount from GETCLIENTDISCOUNT(cd.Id,'01.05.03',0,0))
FROM Cards cd

вот так вот вроде заработало
...
Рейтинг: 0 / 0
05.05.2004, 18:48:21
    #32508021
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблицы и хранимки
Нельзя передовать cd.Id в качестве параметра ХП.

Надо сделать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
CREATE PROCEDURE GETCLIENTDISCOUNT(
DATEONLY DATE,
TOTAL DOUBLE PRECISION,
OPERID INTEGER)
RETURNS (
DISCOUNT DOUBLE PRECISION,
MAXSUM DOUBLE PRECISION,
CURRENTSUM DOUBLE PRECISION)
AS
declare variable StartDate1 DATE;
declare variable StartDate2 DATE;
declare variable EndDate1 DATE;
declare variable EndDate2 DATE;
declare variable DateTemp DATE;
declare variable CARDID VARCHAR( 16 );

declare variable Sum1 DOUBLE PRECISION;
declare variable Sum2 DOUBLE PRECISION;
declare variable Sum1_S DOUBLE PRECISION;
declare variable Sum2_S DOUBLE PRECISION;
declare variable Sum1_R DOUBLE PRECISION;
declare variable Sum2_R DOUBLE PRECISION;
begin

---------------------------------------------------------------------------
-- Цикл по Cards
FOR SELECT ID FROM Cards INTO :CardId DO BEGIN
-------------------------------------------------------------------------

 /*---------------------------------------------------------*/ 
 /*Сначала устанавливаем текущую дату*/ 
DateTemp = DateOnly;
StartDate1 = FirstDayMonth(DateTemp);
EndDate1 = LastDayMonth(DateTemp);

 /*Отнимаем один месяц*/ 
DateTemp = IncDate(StartDate1, 0 ,- 1 , 0 );
StartDate2 = FirstDayMonth(DateTemp);
EndDate2 = LastDayMonth(DateTemp);

 /*--Выбираем из 2-х месяцев максимальную сумму----*/ 
SELECT SUM(Actual)
FROM Opers
WHERE (CardId = :CardId)
AND (RDB$Modified <>  1 )
AND (DateOnly BETWEEN :StartDate1 AND :EndDate1)
AND (Id <> :OperId)
AND (ActionId <> 'R')
INTO :Sum1_S;
if (Sum1_S IS NULL) then Sum1_S =  0 ;

SELECT SUM(Actual)
FROM Opers
WHERE (CardId = :CardId)
AND (RDB$Modified <>  1 )
AND (DateOnly BETWEEN :StartDate1 AND :EndDate1)
AND (Id <> :OperId)
AND (ActionId = 'R')
INTO :Sum1_R;
if (Sum1_R IS NULL) then Sum1_R =  0 ;

Sum1 = Sum1_S - Sum1_R;

CURRENTSUM = Sum1;

SELECT SUM(Actual)
FROM Opers
WHERE (CardId = :CardId)
AND (RDB$Modified <>  1 )
AND (DateOnly BETWEEN :StartDate2 AND :EndDate2)
AND (Id <> :OperId)
AND (ActionId <> 'R')
INTO :Sum2_S;
if (Sum2_S IS NULL) then Sum2_S =  0 ;

SELECT SUM(Actual)
FROM Opers
WHERE (CardId = :CardId)
AND (RDB$Modified <>  1 )
AND (DateOnly BETWEEN :StartDate2 AND :EndDate2)
AND (Id <> :OperId)
AND (ActionId = 'R')
INTO :Sum2_R;
if (Sum2_R IS NULL) then Sum2_R =  0 ;

Sum2 = Sum2_S - Sum2_R;
 /*-------------------------------------------------*/ 

if (Sum1 > Sum2) then MaxSum = Sum1; else MaxSum = Sum2;
 /*MaxSum = MaxSum + Total;*/ 

 /*-----------Выбираем соответствующую скидку-------*/ 
SELECT MAX(Discount)
FROM DiscBarriers
WHERE (Barrier < :MaxSum)
INTO :Discount;

if (Discount IS NULL) then
 /*Сумма ниже всех барьеров, делаем скидку минимальной*/ 
begin
SELECT MIN(Discount)
FROM DiscBarriers
INTO :Discount;
end
suspend;
-------------------------------------------------------------------------
-- Конец цикла по Cards
-------------------------------------------------------------------------
END

end

И тогда :

Код: plaintext
1.
2.
SELECT cd.Id,d.Discount
FROM Cards cd
JOIN GETCLIENTDISCOUNT('01.05.03', 0 , 0 ) d ON (cd.Id = d.CardId)


Best regards,
Dnico.
...
Рейтинг: 0 / 0
05.05.2004, 18:49:54
    #32508023
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблицы и хранимки
vovan1
Так конечно должно работать, но вложенные запросы думаю очень медленно будут работать.

Best regards,
Dnico.
...
Рейтинг: 0 / 0
05.05.2004, 19:13:10
    #32508066
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблицы и хранимки
При связывании ХП и таблицы нужно использовать LEFT JOIN .
...
Рейтинг: 0 / 0
05.05.2004, 19:19:10
    #32508078
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблицы и хранимки
Мимопроходящий
Согласен, но не всегда.

Best regards,
Dnico.
...
Рейтинг: 0 / 0
05.05.2004, 19:23:35
    #32508085
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблицы и хранимки
Если видишь " no current record for fetch operation ", то ОБЯЗАТЕЛЬНО .
...
Рейтинг: 0 / 0
06.05.2004, 07:58:17
    #32508382
FreemanZAV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблицы и хранимки
МимопроходящийПри связывании ХП и таблицы нужно использовать LEFT JOIN. Это обязательно если соединение с ХП идет через параметр.
Запрос вида:
Код: plaintext
1.
select cd.Id,d.Discount
from Cards cd, GETCLIENTDISCOUNT(cd.Id,'01.05.03', 0 , 0 ) d
Нужно переделать так:
Код: plaintext
1.
2.
select cd.Id,d.Discount
from Cards cd LEFT JOIN GETCLIENTDISCOUNT(cd.Id,'01.05.03', 0 , 0 ) d
ON ( 1 = 1 )
...
Рейтинг: 0 / 0
06.05.2004, 14:58:13
    #32509262
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связывание таблицы и хранимки
...
"Ещё одна особенность, точнее на этот раз пожалуй даже глупость, которую периодически пытаются сделать новички. Ну например так:

select * from sp1(t.id) sp, test2 t

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

Подробности - http://www.krista.ru/ib/proc-join.html

...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Связывание таблицы и хранимки / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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