Написание оператора выбора внутри пользовательской функции Oracle - PullRequest
2 голосов
/ 10 ноября 2010

Я довольно новичок в Oracle SQL (хотя я написал немало SQL) и у меня возникают проблемы при встраивании простого оператора SELECT в функцию. Похоже на SQL ABC, но я не могу его получить: (

Я думаю Я использую PL-SQL

Вот что у меня есть:

create or replace FUNCTION GET_GROUP_BY_ID RETURN VARCHAR2
AS my_result
BEGIN

  SELECT fav_group.name 
    INTO my_result 
    FROM fav_group 
   WHERE fav_group.id = 12345

  RETURN my_result;

END GET_GROUP_BY_ID;

Как я уже сказал, я пробовал МНОГИЕ вариации вышеуказанного кода, просматривая примеры кода в Google, но, похоже, не могу сделать это правильно.

Ответы [ 2 ]

11 голосов
/ 10 ноября 2010

Использование:

CREATE OR REPLACE FUNCTION GET_GROUP_BY_ID 
RETURN VARCHAR2 AS

  my_result FAV_GROUP.NAME%TYPE;

BEGIN

  SELECT fav_group.name 
    INTO my_result 
    FROM fav_group 
   WHERE fav_group.id = 12345;

  RETURN my_result;

END GET_GROUP_BY_ID;

Проблема заключалась в том, что my_result использовался в качестве переменной, но никогда не объявлялся.

Я использовал нотацию %TYPE для объявления переменной, поэтому для ее заполнения использовался тот же тип данных, что и для столбца.Если тип данных столбца когда-либо изменяется, переменная автоматически изменяется в соответствии с требованиями - никаких проблем с типом данных после изменений в таблице, если только вы полностью не удалите столбец.

0 голосов
/ 11 ноября 2010

В ответ на мой последний комментарий OMG Ponies ответ выше:

Чтобы получить более одного результата из функции, используйте REF CURSOR

create or replace
PACKAGE BODY REPORTING AS

   FUNCTION GET_GROUP_BY_GID RETURN REF_CURSOR AS

   RESULT_SET REF_CURSOR;

    BEGIN
      OPEN RESULT_SET FOR
      SELECT favorite_group.name
      FROM favorite_group
      WHERE favorite_group.creator_gid = 450160;

      RETURN RESULT_SET;

      EXCEPTION WHEN OTHERS THEN
        RAISE;


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