#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
@WilliamRobertson3. Независимо от того, предпочитаете ли вы называть это предложением или утверждением, в процедуре все, что у вас есть
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
логически являются положительными целыми числами.