Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Жесть в процедуре. / 5 сообщений из 5, страница 1 из 1
24.01.2016, 18:35
    #39154025
B0nG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Жесть в процедуре.
Всем привет. Давно когда-то написал процедуру, она работала, все нормально. Но пришло время расширять базу, соответственно процедуру надо дописать.

Вот код процедуры:

Код: 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.
create or alter procedure NEW_PROCEDURE (
    EQ_ID integer)
returns (
    PROP integer,
    VAL_ID integer,
    VAL_CUSTOM varchar(100))
as
begin
      for select P_T.prop_type_id,
             case
               when EQ_L_P.PROP_VAL_ID is null then EQ_L_P.PROP_CUSTOM_VAL
               else cast(P_V.PROP_VAL_ID as varchar(100))
             end PROP_VAL_ID
      from EQ_LINK_PROP EQ_L_P
      join PROP_TYPE P_T on P_T.PROP_TYPE_ID = EQ_L_P.PROP_TYPE_ID
      join EQ_LIST EQ_L on EQ_L.EQ_ID = EQ_L_P.EQ_ID
      left join PROP_VAL P_V on EQ_L_P.PROP_VAL_ID = P_V.PROP_VAL_ID
      where EQ_L_P.EQ_ID = :eq_id
        into :prop, :val_id, :val_custom
      do
      begin
        suspend;
      end
end^

Модератор: Пользуйтесь тегами оформления

К сути:
Процедура имеет 1 входной и 3 выходных параметра.
В select есть case, там проверка PROP_VAL_ID = null то мы выводим PROP_CUSTOM_VAL иначе PROP_VAL_ID.
Как в этом же case сделать присвоение? Если мы выводим PROP_CUSTOM_VAL то значение должно идти в :val_custom иначе в :val_id .
...
Рейтинг: 0 / 0
24.01.2016, 19:14
    #39154053
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Жесть в процедуре.
B0nGКак в этом же case сделать присвоение?
Никак. Убери CASE из SELECT, все проверки и присваивания делай внутри цикла с помощью IF.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.01.2016, 19:18
    #39154056
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Жесть в процедуре.
B0nG,

как-то давно написал ХП и оставил её имя NEW_PROCEDURE?

что типа этого?

Код: 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.
CREATE OR ALTER PROCEDURE NEW_PROCEDURE (
    EQ_ID INTEGER)
RETURNS (
    PROP INTEGER,
    VAL_ID INTEGER,
    VAL_CUSTOM VARCHAR(100))
AS
BEGIN
  FOR
      SELECT
          P_T.prop_type_id,
          EQ_L_P.PROP_VAL_ID,
          CASE
            WHEN EQ_L_P.PROP_VAL_ID IS NULL
            THEN EQ_L_P.PROP_CUSTOM_VAL
          END PROP_CUSTOM_VAL
      FROM
          EQ_LINK_PROP EQ_L_P
          JOIN PROP_TYPE P_T ON P_T.PROP_TYPE_ID = EQ_L_P.PROP_TYPE_ID
          JOIN EQ_LIST EQ_L ON EQ_L.EQ_ID = EQ_L_P.EQ_ID
          LEFT JOIN PROP_VAL P_V ON EQ_L_P.PROP_VAL_ID = P_V.PROP_VAL_ID
      WHERE
            EQ_L_P.EQ_ID = :eq_id
      INTO :prop,
           :val_id,
           :val_custom
  DO
  BEGIN
    SUSPEND;
  END
END
...
Рейтинг: 0 / 0
25.01.2016, 09:40
    #39154263
DBConstructor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Жесть в процедуре.
B0nG, сдается мне, у тебя ошибка в запросе. Ты делаешь left join PROP_VAL, а проверяешь на NULL значение ключа EQ_LINK_PROP.
...
Рейтинг: 0 / 0
25.01.2016, 20:41
    #39155041
B0nG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Жесть в процедуре.
Симонов ДенисB0nG,

как-то давно написал ХП и оставил её имя NEW_PROCEDURE?

что типа этого?

Код: 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.
CREATE OR ALTER PROCEDURE NEW_PROCEDURE (
    EQ_ID INTEGER)
RETURNS (
    PROP INTEGER,
    VAL_ID INTEGER,
    VAL_CUSTOM VARCHAR(100))
AS
BEGIN
  FOR
      SELECT
          P_T.prop_type_id,
          EQ_L_P.PROP_VAL_ID,
          CASE
            WHEN EQ_L_P.PROP_VAL_ID IS NULL
            THEN EQ_L_P.PROP_CUSTOM_VAL
          END PROP_CUSTOM_VAL
      FROM
          EQ_LINK_PROP EQ_L_P
          JOIN PROP_TYPE P_T ON P_T.PROP_TYPE_ID = EQ_L_P.PROP_TYPE_ID
          JOIN EQ_LIST EQ_L ON EQ_L.EQ_ID = EQ_L_P.EQ_ID
          LEFT JOIN PROP_VAL P_V ON EQ_L_P.PROP_VAL_ID = P_V.PROP_VAL_ID
      WHERE
            EQ_L_P.EQ_ID = :eq_id
      INTO :prop,
           :val_id,
           :val_custom
  DO
  BEGIN
    SUSPEND;
  END
END



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


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