Ошибка при возврате записи из функции в Oracle PL / SQL - PullRequest
0 голосов
/ 30 марта 2020
DECLARE
TYPE type_supplier IS
RECORD(supp_phone supplier.supplier_phone%TYPE,
        supp_status supplier.supplier_status%TYPE);

FUNCTION fn_supplier(supp_name supplier.supplier_name%TYPE)
RETURN type_supplier
IS supp type_supplier;

BEGIN
    select supplier_phone, supplier_status
    into supp.supp_phone, supp.supp_status
    from supplier 
    where supplier_name = supp_name;
    RETURN supp;
END;

Вопрос в том, чтобы создать функцию, которая возвращает номер телефона и статус для введенного имени поставщика. Таблица поставщиков имеет идентификатор поставщика, имя поставщика, адрес поставщика, адрес поставщика, адрес поставщика, телефон поставщика, статус поставщика. Я получаю сообщение об ошибке в приведенном выше коде как:

Error report -
ORA-06550: line 16, column 4:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

   begin function pragma procedure
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

Я не знаю, как вернуть несколько значений из функции PL / SQL. Я использую тип записи для этого, но получаю сообщение об ошибке.

Я открыт для любого решения, изменений или альтернативных методов ..

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

В PL / SQL обычно выполняется возврат открытого курсора, через который вызывающий абонент может затем пройти. Например:

FUNCTION fn_supplier(supp_name supplier.supplier_name%TYPE)
  RETURN SYS_REFCURSOR
IS
  csr  SYS_REFCURSOR
BEGIN
  OPEN csr FOR
    SELECT SUPPLIER_PHONE, SUPPLIER_STATUS
      FROM SUPPLIER
      WHERE SUPPLIER_NAME = pinSupplier_name;

  RETURN csr;
END fn_supplier;

Тогда вызывающая функция выглядит примерно так:

DECLARE
  csrSupplier       SYS_REFCURSOR;
  vSupplier_phone   SUPPLIER.SUPPLIER_PHONE%TYPE;
  vSupplier_status  SUPPLIER.SUPPLIER_STATUS%TYPE;
BEGIN  -- some anonymous
  csrSupplier := fn_supplier('Cthulhu, Inc.');  -- why deal with the lesser evil?

  LOOP
    FETCH csrSupplier INTO vSupplier_phone, vSupplier_status;
    EXIT WHEN cv%NOTFOUND;

    DBMS_OUTPUT.PUT_LINE('Phone=' || vSupplier_phone ||
                         '  Status=' || vSupplier_status);
  END LOOP;

  CLOSE csrSupplier;
END;
0 голосов
/ 30 марта 2020

Ваше объявление TYPE неверно.

Вы можете использовать тип OBJECT и использовать его следующим образом:

create TYPE type_supplier IS
OBJECT(supp_phone supplier.supplier_phone%TYPE,
        supp_status supplier.supplier_status%TYPE);
/

FUNCTION fn_supplier(supp_name supplier.supplier_name%TYPE)
RETURN type_supplier
IS supp type_supplier;

BEGIN
    select supplier_phone, supplier_status
    into supp.supp_phone, supp.supp_status
    from supplier 
    where supplier_name = supp_name;
    RETURN supp;
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...