Хранимая процедура, возвращающая число, когда она что-то находит

#oracle #stored-procedures #plsql

Вопрос:

Я пытаюсь создать хранимую процедуру для поиска клиента в таблице, возвращающую 1, если он что-то нашел, и 0, если это не так. У меня есть идея использовать исключение для обработки части 0, но я не знаю, как вернуть нужное число.

 CREATE OR REPLACE PROCEDURE FIND_CUSTOMER 
(
  CUSTOMER_ID IN NUMBER 
, FOUND OUT NUMBER 
) AS 
BEGIN
SELECT CUST_NO
FROM CUSTOMERS
WHERE CUST_NO = customer_id;

EXCEPTION 
WHEN no_data_found 
THEN found := 0; 
END FIND_CUSTOMER;
 

Куда мне поместить оператор возврата, чтобы он работал должным образом ? Заранее спасибо.

Комментарии:

1. Чтобы вернуть значение, вам нужно создать функцию, а не процедуру. Затем вы вернете переменную, которую вы заполнили a select into . Если вам действительно нужна процедура, заполните found ее и не используйте никаких return предложений.

2. Я думаю, что ОП просит return statement , но не для return clause @WilliamRobertson

3. Независимо от того, предпочитаете ли вы называть это предложением или утверждением, в процедуре все, что у вас есть return; , — это то, что, похоже, не то, чего они хотят.

Ответ №1:

Просто пропустил предложение INTO для оператора SELECT. Вы можете воссоздать процедуру, подобную этой

 CREATE OR REPLACE PROCEDURE find_customer(
                                          customer_id customer.cust_no%TYPE,
                                          found       OUT INT
                                         ) AS                                         
BEGIN
  SELECT SIGN(cust_no)
    INTO found
    FROM customer
   WHERE cust_no = customer_id;

EXCEPTION
  WHEN no_data_found THEN
    found := 0;
END;
/
 

или предпочитаете создавать, как показано ниже, с помощью простого неявного курсора, где даже не требуется предложение INTO и обработка исключений, а только значение инициализации(ноль), используемое для параметра out, например

 CREATE OR REPLACE PROCEDURE find_customer(
                                          customer_id customer.cust_no%TYPE,
                                          found       OUT INT
                                         ) AS
BEGIN
  found := 0;
  FOR c IN
    (
      SELECT SIGN(cust_no) AS fnd
        FROM customer
       WHERE cust_no = customer_id
    )
  LOOP
    found := c.fnd;
  END LOOP;
END;
/
 

Я использовал SIGN() функцию для того, чтобы вернуть значение (1), предполагая, что все значения cust_no логически являются положительными целыми числами.