Вы неправильно использовали climit
в операторе выбора.Я не уверен, кстати, почему вы используете переменную c_credit_check
.
Кажется, что приведенная ниже процедура работает с вышеупомянутым изменением.Для блока исключений я добавил dbms_output
для отображения стека ошибок.Rollback
не требуется, если в теле процедуры нет других DML.В идеале коммит должен находиться в секции вызова и может быть удален, если нет DML
Тестовая таблица / данные
create table demo_customer( custid int,creditlimit number );
insert into demo_customer(custid,creditlimit) values (100,5000);
Процедура
CREATE OR REPLACE PROCEDURE check_available_credit(
c_cust_id IN demo_customer.custid%TYPE,c_purchase_amount IN NUMBER
) AS
climit demo_customer.creditlimit%TYPE;
BEGIN
SELECT creditlimit
INTO climit
FROM demo_customer
WHERE custid = c_cust_id;
IF(c_purchase_amount > climit )
THEN dbms_output.put_line('Amount is too high');
ELSIF ( c_purchase_amount < climit ) THEN
dbms_output.put_line('Amount is perfect');
--COMMIT; --not needed if there are no dmls, move this to calling
--block if there are any.
END IF;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK; --not needed unless there's a dml
dbms_output.put_line(dbms_utility.format_error_stack);
END check_available_credit;
Исполнение
SET SERVEROUTPUT ON
BEGIN
check_available_credit(100,4000);
END;
/
Amount is perfect
PL/SQL procedure successfully completed.