Выход возвращается для каждой строки - PullRequest
0 голосов
/ 14 марта 2019

Моя цель - вернуть оператор типа «Звездные войны доступен: 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 Ответ

0 голосов
/ 14 марта 2019

но когда я запрашиваю функцию, мой вывод возвращает этот оператор для каждого идентификатора фильма, а не только тот, который вводит функция. я знаю Я пропускаю что-то простое,

Ваш код правильный, но, похоже, вы не правильно его называете или все идентификаторы таблицы в таблице совпадают. Ниже приведена демонстрация вашего кода, который работает для меня как ожидалось.

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
...