Функция, которая принимает входной параметр и возвращает данные, создана с ошибками компиляции - PullRequest
0 голосов
/ 03 декабря 2018

Создать функцию с именем 'find_balance', которая принимает invoice_id в качестве входных данных и возвращает balance_status типа varchar.
Имя функции: find_balance Входной параметр: invoice_id in intВыходная переменная: balance_status с типом данных varchar

Правила проектирования:

  1. Если баланс данного идентификатора счета равен нулю, тоотобразить статус «Платеж был завершен»
  2. Если остаток на указанном счете-фактуре больше нуля, отобразить статус в виде суммы «еще не оплачено».Я написал следующий запрос:

CREATE OR REPLACE FUNCTION find_balance (invoice_id IN INTEGER)  
   RETURN VARCHAR2  
IS  
   c_find_balance   NUMBER (5, 2);  
   balance_status  VARCHAR (255);  
BEGIN  
   SELECT find_balance  
     INTO c_find_balance  
     FROM shipment_entity  
    WHERE id = invoice_id;  

   IF c_find_balance == 0  
   THEN  
      balance_status := 'The payment has been Completed';  
   ELSE  
      IF c_find_balance > 0  
      THEN  
         balance_status := find_balance'yet to be paid';  
      END IF;  
   END IF;  

   RETURN (c_find_balance);  
END;  
/  

1 Ответ

0 голосов
/ 03 декабря 2018

Вы довольно близки к решению;Интересно, почему вы сами это не исправили.

Пример таблицы и данных:

SQL> create table shipment_entity
  2    (id number,
  3     find_balance number
  4    );

Table created.

SQL> insert into shipment_entity values (1, 100);

1 row created.

SQL> insert into shipment_entity values (2, 0);

1 row created.

Функция: Я отметил, что вы сделали неправильно (строки 5, 12, 18, 22):

SQL> CREATE OR REPLACE FUNCTION find_balance (invoice_id IN INTEGER)
  2     RETURN VARCHAR2
  3  IS
  4     c_find_balance   NUMBER (5, 2);
  5     balance_status  VARCHAR2 (255);         --> VARCHAR2, not VARCHAR
  6  BEGIN
  7     SELECT find_balance
  8       INTO c_find_balance
  9       FROM shipment_entity
 10      WHERE id = invoice_id;
 11
 12     IF c_find_balance = 0                   --> =, not ==
 13     THEN
 14        balance_status := 'The payment has been Completed';
 15     ELSE
 16        IF c_find_balance > 0
 17        THEN
 18           balance_status := c_find_balance || ' yet to be paid';  --> missing concatenation; wrong variable name
 19        END IF;
 20     END IF;
 21
 22     RETURN (balance_status);                --> balance_status, not c_find_balance
 23  END;
 24  /

Function created.

Тестирование:

SQL> select find_balance(1) res1,
  2         find_balance(2) res2
  3  from dual;

RES1
--------------------------------------------------------------------------------
RES2
--------------------------------------------------------------------------------
100 yet to be paid
The payment has been Completed


SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...