2013-09-02 8 views
1

QUERY сам объясняет.Query Blocks с SELECT INTO

DECLARE 
    ID NUMBER (10); 
    ISFIRST NUMBER (1); 
BEGIN 

    SELECT M.ID, M.ISFIRST 
    INTO ID, ISFIRST 
    FROM MERCHANT M 
    WHERE M.PHONE = :1; 

    IF (ISFIRST=1) THEN 
     SELECT * FROM CUSTOMER C WHERE C.ISFIRST=1 AND C.MERCHANTID = ID; 
    ELSE 
     SELECT * FROM CUSTOMER C WHERE C.ISFIRST=0 AND C.MERCHANTID = ID; 
    END IF; 

END; 

Этот запрос дает мне "PLS-00428: клаузула INTO, как ожидается, в этом ЗЕЬЕСТ". Мне нужно выбрать данные из таблицы CUSTOMER в зависимости от MERCHANT.ISFIRST и MERCHANT.ID. Любое обходное решение или небольшое объяснение, что пошло не так, было бы оценено.

PS: Проблема решена с помощью оператора UNION ALL. Этот вопрос нужно закрыть.

+0

Почему не просто иметь 'WHERE C.ISFIRST = ISFIRST'? – Gabe

+0

Здесь нет необходимости ОБРАТИТЬ Ваши вопросы. Кроме того, не помещайте информацию о теге в свой заголовок. Система маркировки здесь очень хороша в классификации вещей и не нуждается в помощи. :-) Пожалуйста, см. [Если вопросы включают «теги» в их названиях?] (Http://meta.stackexchange.com/q/19190/172661). Благодарю. –

ответ

2

The SELECT заявления не имеют ничего плохого, кроме , что вы не делаете ничего с ними. Я имею в виду последние два. Что вы хотите, чтобы они сделали? Произвести результат, который будет отброшен? PL/SQL не позволяет этого.

Чтобы проверить это, вы можете выбрать одно поле и сделать SELECT {aField} INTO {aVariable} вместо SELECT *.

IF(ISFIRST = 1) THEN 
     SELECT {aField} INTO {aVariable} FROM CUSTOMER C WHERE C.ISFIRST=1 AND C.MERCHANTID = ID; 
    ELSE 
     SELECT {aField} INTO {aVariable} FROM CUSTOMER C WHERE C.ISFIRST=0 AND C.MERCHANTID = ID; 
    END IF; 

Не забудьте объявить {aVariable} !!!

+0

Запрос блока не работает. Все, что мне нужно от QUERY, - это получить данные из таблицы CUSTOMER, как я уже упоминал. Я предположил, что этот запрос даст мне набор данных из таблицы CUSTOMER, но вместо этого он дает мне сообщение об ошибке. Выполнение действий с результатом не будет обрабатываться в запросе. Я собираюсь использовать результат в коде C#. – Naagii

+0

@NarankhuuBoldbaatar Это совершенно другой вопрос. Я не могу ответить на это в комментарии. У меня есть место, чтобы сказать, что двумя основными решениями являются функции трубопровода и курсоры как возвращаемый тип. Google для «Как вернуть набор строк из процедуры Oracle PL/SQL». –

+0

Я обработал этот запрос блока, поскольку это был единственный запрос SELECT. Как правило, независимо от того, что возвращает один запрос запроса, который обрабатывается кодом C++, он возвращается в форму C# как таблицу данных. К сожалению, у меня нет большого опыта работы с PL/SQL и у меня нет доступа к разделу кода на C++. @Mario Rossi, теперь мой вопрос становится довольно простым. Что возвращает один оператор SELECT? Курсор? – Naagii

0

Я думаю, что этот запрос будет делать то же самое:

SELECT C.* 
FROM CUSTOMER C 
INNER JOIN MERCHANT M ON C.MERCHANTID = M.ID AND 
         C.ISFIRST = M.ISFIRST AND 
         M.PHONE = :1;