2013-11-14 4 views
1

Привет, это мое первое сообщение, так жаль, если это было задано раньше. Я пытаюсь создать процедуру, которая добавит интерес к депозитному счету (для конкретного банка) и выведет на экран имена клиентов и новые балансы для депозитной учетной записи. Как бы то ни было, я не могу заставить его работать.Процедура SQL с явным курсором

CREATE OR REPLACE PROCEDURE addInterestNew(bank VARCHAR, interestRate INT out) AS 
CURSOR CustomerBalance IS 
SELECT customerName, balance 
FROM Deposit 
WHERE branchName = bank; 


aCustomerName Deposit.customerName%TYPE; 
newBalance Deposit.balance%TYPE 

BEGIN 
UPDATE DEPOSIT 
SET balance = balance * (1 + (interestRate/100)) 
WHERE branchName = bank; 

FETCH 
OPEN CustomerBalance; 
LOOP 
FETCH CustomerBalance into aCustomerName,newbalance; 
EXIT WHEN CustomerBalance%notfound; 
dbms_output.put_line('CustomerName='||aCustomerName ||'balance='||newBalance); 
END LOOP; 
CLOSE CustomerBalance; 

END; 
/

любая помощь является оценили

благодаря

+0

какая база данных вы используете? Каким образом это не работает, сообщение об ошибке или просто неожиданный результат? Также почему после этого параметр процентной ставки «выйдет»? Похоже, что это должен быть простой параметр. – nickebbitt

+0

, пожалуйста, добавьте подробное описание ошибки в том, что у вас есть или почему результаты, которые вы получили, неверны – LINQ2Vodka

+1

это Oracle (я действительно люблю его% TYPE) – LINQ2Vodka

ответ

0

Кажется, что большая часть кода в порядке, вы просто дополнительный FETCH непосредственно перед открытием курсора, который должен быть удален. Кроме того, после объявления переменной newBalance вам не хватало точки с запятой. Кроме этого, вы указали параметр interestRate как IN OUT, но, похоже, вы его нигде не изменяете. Тем не менее, это должно работать:

CREATE OR REPLACE PROCEDURE addInterestNew(bank VARCHAR, interestRate INT out) AS 

    CURSOR CustomerBalance IS 
    SELECT customerName, balance 
     FROM Deposit 
    WHERE branchName = bank; 

    aCustomerName Deposit.customerName%TYPE; 
    newBalance Deposit.balance%TYPE; 
BEGIN 
    UPDATE DEPOSIT 
    SET balance = balance * (1 + (interestRate/100)) 
    WHERE branchName = bank; 

    OPEN CustomerBalance; 

    LOOP 
    FETCH CustomerBalance into aCustomerName,newbalance; 
    EXIT WHEN CustomerBalance%notfound; 
    dbms_output.put_line('CustomerName='||aCustomerName ||'balance='||newBalance); 
    END LOOP; 

    CLOSE CustomerBalance; 
END; 
/
+0

спасибо, что много работало, и да, я удалил 'out' in параметр не знает, как он туда попал – user2993831

Смежные вопросы