2014-02-07 3 views
0

Я смущен, признав, что это абсолютно нужный вопрос, но я принимаю прибежище в том, что я пришел из мира T-SQL, и это совершенно новая территория для меняВыбор PL/SQL возвращает более одной строки

Это простая таблица, я с 4 записей только

ContractorID ProjectID Стоимость

1    100  1000 
2    100  800 
3    200  1005 
4    300  2000 

Это моя PL функция SQL, которая должна взять подрядчика и идентификатор проекта и возвращает количество часов (10 в этом случай)

create or replace FUNCTION GetCost(contractor_ID IN NUMBER, 
              project_ID in NUMBER) 
    RETURN NUMBER 
IS 
    ContractorCost NUMBER;  

BEGIN 
    Select Cost INTO ContractorCost 
    from Contractor_Project_Table 
    where ContractorID= contractor_ID and ProjectID =project_ID ; 
    return ContractorCost; 
END; 

Но затем с помощью

select GetCost(1,100) from Contractor_Project_Table; 

Это возвращает ту же строку в 4 раза

 
1000 
1000 
1000 
1000 

Что здесь не так? Почему это возвращение 4 строки вместо 1

Спасибо за

+1

'getCost()' вызывается один раз ** для каждой строки ** в 'Contractor_Project_Table', поэтому вы получаете столько строк, сколько содержится в этой таблице. Почему бы вам просто не использовать регулярное соединение - это будет намного эффективнее, чем использование этой функции. –

ответ

2

Поскольку у вас есть 4 строки в Contractor_Project_Table таблице. Используйте этот запрос, чтобы получить одну запись.

select GetCost(1,100) from dual; 
+0

спасибо ... это сработало .... хотя это понятие о том, чтобы поставить двойное в нем звучало немного meh .... но хорошо, оракул - это так, как есть. –

3

Как @a_horse_with_no_name указывает, проблема в том, что Contractor_Project_Table имеет (предположительно) 4 строки таким образом любой SELECT против Contractor_Project_Table, не WHERE пункта всегда будет возвращать 4 строк. Ваша функция вызывается 4 раза, по одной для каждой строки в таблице.

Если вы хотите, чтобы вызвать функцию с одним набором параметров и возвращает одну строку данных, вы, вероятно, хотите, чтобы выбрать из dual таблицы

SELECT GetCost(1, 100) 
    FROM dual 
Смежные вопросы