Форум программистов, компьютерный форум, киберфорум
Firebird/InterBase
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
1

Ошибка при выполнении хранимой процедуры - FireBird

13.10.2015, 01:05. Показов 771. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите люди добрые. Сия процедура компилируется нормально, но при выполнении возникает ошибка. Не могу понять в чем дело.

Oracle 11 SQL
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
CREATE OR ALTER PROCEDURE DIF_TMU1 (
    FUL_TMU VARCHAR(30),
    CUR_TMU VARCHAR(30),
    TMP_TAB VARCHAR(30),
    STAGGMM INTEGER)
returns (
    DIF_RES INTEGER)
AS
DECLARE variable EXIST_TAB INTEGER;
DECLARE variable CFLAG CHAR(1);
DECLARE variable NID_SRC bigint;
DECLARE variable CCODE_LPU CHAR(6);
DECLARE variable CVID_MP CHAR(2);
DECLARE variable CUSL_OK CHAR(2);
DECLARE variable CVOZR CHAR(2);
DECLARE variable CPROFIL CHAR(2);
DECLARE variable CCODE_USL CHAR(15);
DECLARE variable NTARIF numeric(10,2);
DECLARE variable NTARIF_D numeric(10,2);
DECLARE variable NTARIF_F numeric(10,2);
DECLARE variable NTARIF_1K numeric(10,2);
BEGIN
    DIF_RES = 0;
 
    IF (:STAGGMM=0) THEN
        DIF_RES=1;
        suspend;
    /* END IF */
    
    FUL_TMU = UPPER(TRIM(:FUL_TMU));
    EXECUTE PROCEDURE EX_TAB(:FUL_TMU) returning_values (:EXIST_TAB);
 
    IF (:EXIST_TAB=0) THEN  /* Cumulative TMU table does not exist */
        DIF_RES=2;
        suspend;
    /* END IF */
 
    CUR_TMU = UPPER(TRIM(:CUR_TMU));
    EXECUTE PROCEDURE EX_TAB(:CUR_TMU) returning_values (:EXIST_TAB);
 
    IF (:EXIST_TAB=0) THEN   /* Month TMU table does not exist */
        DIF_RES=3;
        suspend;
    /* END IF */
 
    TMP_TAB = UPPER(TRIM(:TMP_TAB));
    EXECUTE PROCEDURE EX_TAB(:TMP_TAB) returning_values (:EXIST_TAB);
 
    IF (:EXIST_TAB=0) THEN   /* Work table for Difference TMU Process does not exist */
        DIF_RES=4;
        suspend;
    /* END IF */
 
    FOR EXECUTE statement '       
    select 
        rpad(iif(FUL.YML=STAGGMM and FUL.YMH=0, ''Y'', ''C''), 1) as FLAG,                                          ;
        FUL.ID as ID_SRC,
        CUR.CODE_LPU as CODE_LPU,
        CUR.VID_MP as VID_MP,
        CUR.USL_OK as USL_OK,
        CUR.VOZR as VOZR,
        CUR.PROFIL as PROFIL,
        CUR.CODE_USL as CODE_USL,
        CUR.TARIF as TARIF,
        CUR.TARIF_D as TARIF_D,
        CUR.TARIF_F as TARIF_F,
        CUR.TARIF_1K as TARIF_1K
    from ' || CUR_TMU || ' CUR ' ||
   'inner join ' || FUL_TMU || ' FUL on
        (FUL.CODE_LPU || FUL.VID_MP || FUL.USL_OK || FUL.VOZR || FUL.PROFIL || FUL.CODE_USL = 
         CUR.CODE_LPU || CUR.VID_MP || CUR.USL_OK || CUR.VOZR || CUR.PROFIL || CUR.CODE_USL)
    where
        ( 
            (
                (FUL.YMH=0) and
                (FUL.YML<=STAGGMM)
            )
            or
            (
                (FUL.YMH<>0) and 
                (FUL.YML<=STAGGMM) and
                (STAGGMM<=FUL.YMH)
            )
        )
        and
        (
            (CUR.TARIF<>FUL.TARIF) or
            (CUR.TARIF_D<>FUL.TARIF_D) or
            (CUR.TARIF_1K<>FUL.TARIF_1K) or
            (CUR.TARIF_F<>FUL.TARIF_F)
        )'
    INTO :cFLAG,
         :nID_SRC,
         :cCODE_LPU,
         :cVID_MP,
         :cUSL_OK,
         :cVOZR,
         :cPROFIL,
         :cCODE_USL,
         :nTARIF,
         :nTARIF_D,
         :nTARIF_F,
         :nTARIF_1K
    
    DO
            EXECUTE statement '
            insert into ' || TMP_TAB ||
               '(FLAG,
                 ID_SRC,
                 CODE_LPU,
                 VID_MP,
                 USL_OK,
                 VOZR,
                 PROFIL,
                 CODE_USL,
                 TARIF,
                 TARIF_D,
                 TARIF_F,
                 TARIF_1K)
                     values
                (:cFLAG,
                 :nID_SRC,
                 :cCODE_LPU,
                 :cVID_MP,
                 :cUSL_OK,
                 :cVOZR,
                 :cPROFIL,
                 :cCODE_USL,
                 :nTARIF,
                 :nTARIF_D,
                 :nTARIF_F,
                 :nTARIF_1K)';
END
Изображения
 
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2015, 01:05
Ответы с готовыми решениями:

Ошибка при вызове хранимой процедуры
Добрый день, подскажите что делать? Может кто сталкивался с данной проблемой. При вызове хранимой...

Ошибка при создании хранимой процедуры lock conflict on no wait transaction
Всем доброго вечера! Помогите пожалуйста, такая проблема.Создаю базу в IBExpert. При создании...

баг с кодировкой при выполнении хранимой процедуры
Добрый день. есть сайт копоративный на silex + twig. Сайт предназначен для 5 отделов, из которых...

Delphi не возвращает ошибку при выполнении хранимой процедуры
Здравствуйте люди добрые. Подскажите пожалуйста как получить сведения об ошибке в Delphi через ADO,...

3
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
13.10.2015, 02:15  [ТС] 2
Отбой. Вражеская точка с запятой в строке 56!!!
0
479 / 392 / 112
Регистрация: 24.04.2012
Сообщений: 1,632
Записей в блоге: 3
13.10.2015, 04:21 3
И что работает?!
0
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
13.10.2015, 14:33  [ТС] 4
Вот это заработало:

SQL
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
112
113
114
115
116
117
118
119
CREATE OR ALTER PROCEDURE DIF_TMU11 (
    FUL_TMU VARCHAR(30),
    CUR_TMU VARCHAR(30))
RETURNS (
    DIF_RES INTEGER)
AS
DECLARE variable EXIST_TAB INTEGER;
DECLARE variable CFLAG CHAR(1);
DECLARE variable NID_SRC BIGINT;
DECLARE variable CCODE_LPU CHAR(6);
DECLARE variable CVID_MP CHAR(2);
DECLARE variable CUSL_OK CHAR(2);
DECLARE variable CVOZR CHAR(2);
DECLARE variable CPROFIL CHAR(2);
DECLARE variable CCODE_USL CHAR(15);
DECLARE variable NTARIF NUMERIC(10,2);
DECLARE variable NTARIF_D NUMERIC(10,2);
DECLARE variable NTARIF_F NUMERIC(10,2);
DECLARE variable NTARIF_1K NUMERIC(10,2);
BEGIN
    DIF_RES = 0;
    
    FUL_TMU = UPPER(TRIM(:FUL_TMU));
    EXECUTE PROCEDURE EX_TAB(:FUL_TMU) returning_values (:EXIST_TAB);
 
    IF (:EXIST_TAB=0) THEN  /* Cumulative TMU table does not exist */
        DIF_RES=2;
        suspend;
    /* END IF */
 
    CUR_TMU = UPPER(TRIM(:CUR_TMU));
    EXECUTE PROCEDURE EX_TAB(:CUR_TMU) returning_values (:EXIST_TAB);
 
    IF (:EXIST_TAB=0) THEN   /* Month TMU table does not exist */
        DIF_RES=3;
        suspend;
    /* END IF */
 
    FOR EXECUTE statement '       
    select 
        rpad(iif(FUL.YML=1508 and FUL.YMH=0, ''Y'', ''C''), 1) as FLAG,
        FUL.ID as ID_SRC,
        CUR.CODE_LPU as CODE_LPU,
        CUR.VID_MP as VID_MP,
        CUR.USL_OK as USL_OK,
        CUR.VOZR as VOZR,
        CUR.PROFIL as PROFIL,
        CUR.CODE_USL as CODE_USL,
        CUR.TARIF as TARIF,
        CUR.TARIF_D as TARIF_D,
        CUR.TARIF_F as TARIF_F,
        CUR.TARIF_1K as TARIF_1K
    from ' || CUR_TMU || ' CUR ' ||
   'inner join ' || FUL_TMU || ' FUL on
        (FUL.CODE_LPU || FUL.VID_MP || FUL.USL_OK || FUL.VOZR || FUL.PROFIL || FUL.CODE_USL = 
         CUR.CODE_LPU || CUR.VID_MP || CUR.USL_OK || CUR.VOZR || CUR.PROFIL || CUR.CODE_USL)
    where
        ( 
            (
                (FUL.YMH=0) and
                (FUL.YML<=1508)
            )
            or
            (
                (FUL.YMH<>0) and 
                (FUL.YML<=1508) and
                (1508<=FUL.YMH)
            )
        )
        and
        (
            (CUR.TARIF<>FUL.TARIF) or
            (CUR.TARIF_D<>FUL.TARIF_D) or
            (CUR.TARIF_1K<>FUL.TARIF_1K) or
            (CUR.TARIF_F<>FUL.TARIF_F)
        )'
    INTO :cFLAG,
         :nID_SRC,
         :cCODE_LPU,
         :cVID_MP,
         :cUSL_OK,
         :cVOZR,
         :cPROFIL,
         :cCODE_USL,
         :nTARIF,
         :nTARIF_D,
         :nTARIF_F,
         :nTARIF_1K
    
    do
        INSERT INTO TMUDIF01
            (FLAG,
             ID_SRC,
             CODE_LPU,
             VID_MP,
             USL_OK,
             VOZR,
             PROFIL,
             CODE_USL,
             TARIF,
             TARIF_D,
             TARIF_F,
             TARIF_1K)
                 VALUES
            (:cFLAG,
             :nID_SRC,
             :cCODE_LPU,
             :cVID_MP,
             :cUSL_OK,
             :cVOZR,
             :cPROFIL,
             :cCODE_USL,
             :nTARIF,
             :nTARIF_D,
             :nTARIF_F,
             :nTARIF_1K);
 
        suspend;
END
Но это только начальный вариант.

Добавлено через 8 минут
Только вот кто мне расскажет, что делает оператор SUSPEND в предпоследней строчке. Так я до конца и не просек с этим SUSPEND-ом. Нагородили огород создатели! Это же не хранимая процедура вызова, а выполняемая хранимая процедура. А следуя документации, в выполняемых хранимых процедурах SUSPEND играет роль оператора выхода из процедуры. Только вот без этого SUSPEND-а в таблицу TMUDIF01 ничего не поступает.

И что это за база такая, этот FireBird - почему она не может выполнить SELECT сразу в обычную таблицу. Если кому-то надо в список переменных - на здоровье, почему в таблицу-то не может, как все нормальные продукты?
0
13.10.2015, 14:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2015, 14:33
Помогаю со студенческими работами здесь

Firebird ошибка при выполнении selectSQL
Здравствуйте. При работе с SelectSQL выдает ошибку, что не найдено ключевое поле Field id_enet not...

Вызов хранимой процедуры firebird из delphi
имеется автоматически созданная процедура в firebird: SET TERM ^ ; create or alter procedure...

Выходные параметры хранимой процедуры (FireBird 2.5, FireDac)
День добрый, подскажите как получить выходной параметр из хранимки (FireBird 2.5) INSERT INTO...

Как получить параметры хранимой процедуры сервер firebird
Всем, привет! В IBExpert создал на сервере вот такую хранимую процедуру SET TERM ^ ; create or...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru