захват данных столбца с использованием процедур - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь принять два параметра. идентификатор клиента и сумма покупки. Сумма покупки не указана в таблице, на которую я буду ссылаться. он будет сравниваться с кредитным лимитом, назначенным указанному идентификатору клиента, и будет делать вывод в дБмс по этике: кредит слишком мал для разрешенной суммы или ее штрафа.

У меня проблемы с реализацией процедуры получения параметра суммы покупки и сравнения его с фактическим кредитным лимитом в таблице

create or replace PROCEDURE check_available_credit(
c_cust_id IN demo_customer.custid%TYPE,
c_purchase_amount IN NUMBER
) AS c_credit_check VARCHAR(50);

climit       demo_customer.creditlimit%type;

BEGIN
SELECT climit
    INTO c_credit_check--PLACE INTO PROCEDURE
    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;
        END IF;
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        END check_available_credit;

Я буду использовать 100 для custid и 4000 для суммы покупки. это приведет к тому, что клиент получит кредитный лимит 5000, поэтому он должен сообщить, что «сумма идеальна»

1 Ответ

0 голосов
/ 23 апреля 2019

Вы неправильно использовали 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...