#oracle #plsql #oracle-sqldeveloper
#Oracle #plsql #oracle-sqldeveloper
Вопрос:
Моя цель — вернуть оператор типа «Доступно Star wars: 11 на полке», но когда я запрашиваю функцию, мой вывод возвращает это утверждение для каждого идентификатора фильма, а не только для того, который вводит функция. Я знаю, что упускаю из виду что-то простое, но мне просто нужен мой вызов, чтобы получить инструкцию для предоставленного идентификатора фильма. (С использованием SQL Developer)
CREATE OR REPLACE FUNCTION QTY_MSG_SF
(p_movieID mm_movie.movie_id %TYPE)
RETURN VARCHAR2
AS
lv_message_txt VARCHAR2(50);
lv_title_txt mm_movie.movie_title%TYPE;
lv_qty_num MM_MOVIE.MOVIE_QTY%TYPE;
BEGIN
SELECT movie_title, movie_qty
INTO lv_title_txt, lv_qty_num
FROM mm_movie
WHERE movie_id = p_movieID;
IF (lv_qty_num > 0) THEN
lv_message_txt := (lv_title_txt || ' is available: ' || lv_qty_num || ' on the shelf');
ELSE
lv_message_txt := (lv_title_txt || ' is not available');
END IF;
RETURN lv_message_txt;
END QTY_MSG_SF;
Мой вызов:
SELECT qty_msg_sf(2)
FROM mm_movie;
Комментарии:
1. Эта функция может возвращать только одну строку. Невозможно вернуть несколько строк за один вызов — так что проблема, вероятно, в вашем вызывающем коде. Пожалуйста, обновите свой вопрос кодом, который вы используете для вызова этой функции.
Ответ №1:
но когда я запрашиваю функцию, мой вывод возвращает этот оператор для каждого идентификатора фильма, а не только тот, который вводит функция. Я знаю, что упускаю из виду что-то простое,
Ваш код правильный, но похоже, что, вероятно, вы вызываете его неправильно или все идентификаторы фильмов в таблице одинаковы. Смотрите ниже демонстрацию вашего кода, который работает так, как я ожидал.
create table mm_movie(movie_id number,movie_title varchar2(50), movie_qty number);
/
insert into mm_movie values (1,'WarDogs',11);
insert into mm_movie values (2,'Star War',19);
/
Select * from mm_movie;
/
CREATE OR REPLACE FUNCTION QTY_MSG_SF(p_movieID mm_movie.movie_id %TYPE)
RETURN VARCHAR2 AS
lv_message_txt VARCHAR2(50);
lv_title_txt mm_movie.movie_title%TYPE;
lv_qty_num MM_MOVIE.MOVIE_QTY%TYPE;
BEGIN
SELECT movie_title,
movie_qty
INTO lv_title_txt,
lv_qty_num
FROM mm_movie
WHERE movie_id = p_movieID;
IF (lv_qty_num > 0)
THEN
lv_message_txt := (lv_title_txt || ' is available: ' || lv_qty_num ||
' on the shelf');
ELSE
lv_message_txt := (lv_title_txt || ' is not available');
END IF;
RETURN lv_message_txt;
END QTY_MSG_SF;
Выполнение
SQL>Select QTY_MSG_SF(2) from dual;
Col
---
Star War is available: 19 on the shelf
SQL>Select QTY_MSG_SF(1) from dual;
Col
---
WarDogs is available: 11 on the shelf
Комментарии:
1. Спасибо, я вызывал это непосредственно из таблицы mm_movie. вместо dual. Dual действительно работает, хотя я не уверен на 100%, почему.
2.
I was calling this directly from the table mm_movie.
— В этом случае вы получили бы результат столько раз, сколько у вас есть строк в вашей таблицеmm_movie
, но результаты были бы одинаковыми. Не так ли? Мы используем,Dual
поскольку знаем, что этоDummy
таблица с 1 строкой и 1 столбцом, поэтому мы получаем результат один раз.