Объединение нескольких связанных процедур выбора Firebird с использованием метода If else или case - PullRequest
0 голосов
/ 02 мая 2020

Как объединить эти две процедуры выбора firebird, используя эту переменную REFERENCE через if, case или другой метод. Если REFERENCE = 1, то отображается процедура 1, если REFERENCE = 2, отображается процедура 2. Я пытаюсь получить 1 процедуру выбора с условиями, а не 2 процедуры.

CREATE PROCEDURE PRINT_NON_REF1(
      M VARCHAR(50) CHARACTER SET ISO8859_1 COLLATE ISO8859_1,
      Y VARCHAR(50) CHARACTER SET ISO8859_1 COLLATE ISO8859_1,
      REFERENCE VARCHAR(50) CHARACTER SET ISO8859_1 COLLATE ISO8859_1)
    RETURNS(
      AP_PSTIONLVL_NON VARCHAR(50) CHARACTER SET ISO8859_1 COLLATE ISO8859_1,
      AP_POSTION_NON VARCHAR(50) CHARACTER SET ISO8859_1 COLLATE ISO8859_1,
      RANKING_MONTH VARCHAR(50) CHARACTER SET ISO8859_1 COLLATE ISO8859_1,
      RANKING_YEAR VARCHAR(50) CHARACTER SET ISO8859_1 COLLATE ISO8859_1)
    AS
    BEGIN
      FOR
        SELECT
          '',
          '',
          RANKING_MONTH,
          RANKING_YEAR

        FROM APPLICANT
        WHERE RANKING_MONTH = :M AND RANKING_YEAR = :Y

        GROUP BY
        RANKING_MONTH,
        RANKING_YEAR

        INTO
          :AP_PSTIONLVL_NON,
          :AP_POSTION_NON,
          :RANKING_MONTH,
          :RANKING_YEAR
      DO
        BEGIN
          SUSPEND;
        END

    END;

и

CREATE PROCEDURE PRINT_NON_REF2(
      M VARCHAR(50) CHARACTER SET ISO8859_1 COLLATE ISO8859_1,
      Y VARCHAR(50) CHARACTER SET ISO8859_1 COLLATE ISO8859_1,
      REFERENCE VARCHAR(50) CHARACTER SET ISO8859_1 COLLATE ISO8859_1)
    RETURNS(
      AP_PSTIONLVL_NON VARCHAR(50) CHARACTER SET ISO8859_1 COLLATE ISO8859_1,
      AP_POSTION_NON VARCHAR(50) CHARACTER SET ISO8859_1 COLLATE ISO8859_1,
      RANKING_MONTH VARCHAR(50) CHARACTER SET ISO8859_1 COLLATE ISO8859_1,
      RANKING_YEAR VARCHAR(50) CHARACTER SET ISO8859_1 COLLATE ISO8859_1)
    AS
    BEGIN
      FOR
        SELECT
          AP_PSTIONLVL_NON,
          AP_POSTION_NON,
          RANKING_MONTH,
          RANKING_YEAR

        FROM APPLICANT
        WHERE RANKING_MONTH = :M AND RANKING_YEAR = :Y

        GROUP BY
        AP_PSTIONLVL_NON,
        AP_POSTION_NON,
        RANKING_MONTH,
        RANKING_YEAR

        INTO
          :AP_PSTIONLVL_NON,
          :AP_POSTION_NON,
          :RANKING_MONTH,
          :RANKING_YEAR
      DO
        BEGIN
          SUSPEND;
        END

    END;

1 Ответ

0 голосов
/ 06 мая 2020

Вы можете попробовать следующую конструкцию:

WITH
  Q_2 as (
      SELECT
        AP_PSTIONLVL_NON,
        AP_POSTION_NON,
        RANKING_MONTH,
        RANKING_YEAR
      FROM APPLICANT
      WHERE RANKING_MONTH = :M
        AND RANKING_YEAR = :Y
      GROUP BY
        AP_PSTIONLVL_NON,
        AP_POSTION_NON,
        RANKING_MONTH,
        RANKING_YEAR
  ), 
  Q_1 as (
     SELECT
       '',
       '',
       RANKING_MONTH,
       RANKING_YEAR
     FROM APPLICANT
     WHERE RANKING_MONTH = :M 
       AND RANKING_YEAR = :Y
     GROUP BY
       RANKING_MONTH,
       RANKING_YEAR
 )

SELECT * FROM Q_2 WHERE :REFERENCE=2
   UNION ALL
SELECT * FROM Q_1 WHERE :REFERENCE=1

На что обратить внимание:

  • Создание хранимой процедуры, которая не содержит ничего, кроме одного SELECT, является плохой идеей в Firebird / Interbase. Это отключит работу оптимизатора SQL при присоединении и не добавит ничего ценного. Firebird не MS SQL.
  • Второй запрос был задан первым в цепочке union ed, поскольку это первый запрос, в котором UNION берет имена столбцов и типы данных. Будет Q_1 go первым - возникнет проблема с двумя анонимными столбцами.
  • Некоторые библиотеки доступа к базе данных могут иметь проблемы с несколькими параметрами в запросе с одинаковыми именами. Возможно, вам придется переименовать :M в :M_1 и :M_2, et c. Или нет, протестируйте свою библиотеку.
  • Ваш указанный c язык программирования / библиотека может иметь синтаксис параметров SQL, отличающийся от :name, использованного выше. Тем более, что сам Firebird на уровне SQL поддерживает только безымянные параметры. Проверьте документацию вашей библиотеки. Вы также можете ознакомиться с примерами кода, прочитав https://bobby-tables.com/
  • Прочитать документацию о UNION и CTE (общие выражения таблиц) в https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-dml-select.html
...