Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Процедуры и функции / 2 сообщений из 2, страница 1 из 1
01.08.2013, 14:10
    #38351632
Toshkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедуры и функции
Есть функция:

Код: plsql
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.
CREATE FUNCTION "NFTG"."TOTAL_MONTH_CHARGEMENTS_0" (
   "PAYMENT_DATE"            TIMESTAMP,
   "MEMBER_ID"               INTEGER,
   "OPERATION_MONTH_DATE"    TIMESTAMP,
   "TAX_YEAR"                INTEGER)
   RETURNS TABLE ("OPERATION_TOTAL" DOUBLE)
   SPECIFIC "SQL130528130027400"
   LANGUAGE SQL
   NOT DETERMINISTIC
   EXTERNAL ACTION
   MODIFIES SQL DATA
   BEGIN ATOMIC
      DECLARE PAYOUT_DATE       TIMESTAMP;
      DECLARE PAYOUT_SUM        DOUBLE;
      DECLARE OPERATION_TOTAL   DOUBLE;
      SET PAYOUT_SUM = 0;
      SET OPERATION_TOTAL = 0;

      IF (PAYMENT_DATE IS NOT NULL)
      THEN
         SET PAYOUT_SUM = NULL;
         SET PAYOUT_SUM =
                (SELECT D.SUMOPER
                   FROM NFTG.DOLGY3 D
                  WHERE (D.MEMBER_ID = TOTAL_MONTH_CHARGEMENTS_0.MEMBER_ID)
                        AND (D.KOPERATION IN (34, 104, 134))
                        AND (D.DATEOPER =
                                TOTAL_MONTH_CHARGEMENTS_0.PAYMENT_DATE)
                 FETCH FIRST 1 ROWS ONLY);

         IF (PAYOUT_SUM IS NOT NULL)
         THEN
            SET OPERATION_TOTAL =
                   (SELECT SUM (D.SUMOPER)
                      FROM NFTG.DOLGY3 D
                     WHERE (D.MEMBER_ID = TOTAL_MONTH_CHARGEMENTS_0.MEMBER_ID)
                           AND (D.KOPERATION IN (34, 14, 104, 134))
                           AND (D.PAYMENT_DATE =
                                   TOTAL_MONTH_CHARGEMENTS_0.PAYMENT_DATE));
         END IF;
      ELSE
         SET PAYOUT_SUM = NULL;
         SET (PAYOUT_SUM, PAYOUT_DATE) =
                (SELECT D.SUMOPER, D.DATEOPER
                   FROM NFTG.DOLGY3 D
                  WHERE (D.MEMBER_ID = TOTAL_MONTH_CHARGEMENTS_0.MEMBER_ID)
                        AND (D.KOPERATION = 3)
                        AND (D.OPERATION_MONTH_DATE =
                                TOTAL_MONTH_CHARGEMENTS_0.OPERATION_MONTH_DATE)
                 FETCH FIRST 1 ROWS ONLY);

         IF (PAYOUT_SUM IS NOT NULL)
         THEN
            SET OPERATION_TOTAL =
                   (SELECT SUM (D.SUMOPER)
                      FROM NFTG.DOLGY3 D
                     WHERE (D.MEMBER_ID = TOTAL_MONTH_CHARGEMENTS_0.MEMBER_ID)
                           AND (D.KOPERATION IN (34, 14, 104, 134))
                           AND (D.PAYMENT_DATE = PAYOUT_DATE));
         END IF;
      END IF;

      RETURN SELECT OPERATION_TOTAL FROM SYSIBM.SYSDUMMY1;
   END



В интерфейсе на Delphi используется Unidac, в котором нет компонентов для функций, поэтому делаем для функции процедурную обертку:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE OR REPLACE  PROCEDURE "NFTG"."TOTAL_MONTH_CHARGEMENTS_0" (
    IN "PAYMENT_DATE"	TIMESTAMP,
    IN "MEMBER_ID"	INTEGER,
    IN "OPERATION_MONTH_DATE"	TIMESTAMP,
    IN "TAX_YEAR"	INTEGER,
    OUT "OPERATION_TOTAL"	DOUBLE )
  SPECIFIC "SQL130528131759700"
  LANGUAGE SQL
  NOT DETERMINISTIC
  EXTERNAL ACTION
  MODIFIES SQL DATA
  OLD SAVEPOINT LEVEL
begin
  SELECT OPERATION_TOTAL
    INTO OPERATION_TOTAL
    FROM TABLE(NFTG.TOTAL_MONTH_CHARGEMENTS_0(PAYMENT_DATE, MEMBER_ID, OPERATION_MONTH_DATE, TAX_YEAR));
end;



А теперь, ВНИМАНИЕ, вопрос:
Почему запрос

Код: plsql
1.
select OPERATION_TOTAL from table(nftg.TOTAL_MONTH_CHARGEMENTS_0(null,46,'01.01.2012',2012))



работает миллисекунды, а

Код: plsql
1.
2.
3.
4.
begin
  declare a integer;
  call nftg.TOTAL_MONTH_CHARGEMENTS_0(null,46,'01.01.2012',2012,a);
end



работает 28 секунд?
...
Рейтинг: 0 / 0
01.08.2013, 17:25
    #38351952
Toshkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедуры и функции
Перекомпилил процедуру - 5 миллисекунд...
Ну и что это за хрень?..
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Процедуры и функции / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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