Условия между запросами - PullRequest
1 голос
/ 30 апреля 2019

У меня есть два запроса:

SELECT Origin_country_id
  FROM item_supp_country_DIM
 WHERE item = I_ITEM

и

SELECT Origin_country_id
  FROM item_supp_country
 WHERE item = I_ITEM

Я хочу проверить, возвращает ли первый запрос результат - если нет, тогда я хочу использовать свой второйзапрос, чтобы получить результат.

Как мне сделать это в PLSQL как условную вещь?

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Я не скомпилировал это, но более или менее оно должно работать.

По сути, вы можете попытаться прочитать первую таблицу и поймать исключение, а затем попытаться прочитать другую таблицу.Это было бы решением PL/SQL.

CREATE OR REPLACE FUNCTION read_origin_country (i_item IN VARCHAR2)
    RETURN NUMBER
IS
    l_origin_country_id   NUMBER;
BEGIN
    BEGIN
        SELECT Origin_country_id
          INTO l_origin_country_id
          FROM item_supp_country_DIM
         WHERE item = I_ITEM;
    EXCEPTION
        WHEN NO_DATA_FOUND
        THEN
            SELECT Origin_country_id
              INTO l_origin_country_id
              FROM item_supp_country
             WHERE item = I_ITEM;
    END;

    RETURN l_origin_country_id;
END read_origin_country;
0 голосов
/ 06 мая 2019

Существует n альтернатив без использования plsql.

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

SELECT 'item_supp_country_DIM' source_table, Origin_country_id
  FROM item_supp_country_DIM
 WHERE item = :I_ITEM
UNION ALL
SELECT 'item_supp_country' source_table, Origin_country_id
  FROM item_supp_country
 WHERE item = :I_ITEM;

Я не знаю вашу схему или размеры таблиц. Но если у item есть индекс, этот запрос должен быть быстрым.

Testdata:

DROP TABLE ITEM_SUPP_COUNTRY_DIM;
DROP TABLE ITEM_SUPP_COUNTRY;

CREATE TABLE ITEM_SUPP_COUNTRY_DIM
(
    ORIGIN_COUNTRY_ID   NUMBER NOT NULL,
    ITEM                NUMBER
);

CREATE TABLE ITEM_SUPP_COUNTRY
(
    ORIGIN_COUNTRY_ID   NUMBER NOT NULL,
    ITEM                NUMBER
);

INSERT INTO ITEM_SUPP_COUNTRY_DIM values(1, 1);
INSERT INTO ITEM_SUPP_COUNTRY_DIM values(2, 2);
INSERT INTO ITEM_SUPP_COUNTRY values(2, 2);
INSERT INTO ITEM_SUPP_COUNTRY values(3, 3);

Имейте в виду, что если I_ITEM := 2, вы получите две строки результатов.

...