PL / SQL как вернуть всю запись - PullRequest
0 голосов
/ 09 января 2020

Я хочу сделать функцию, которая принимает определенное значение. Затем это значение ищется в трех столбцах, если оно найдено, то оно возвращается, если нет, то функция будет прервана.

Я прошу советы о том, как я могу ее решить, я хочу вернуть вся запись.

create or replace FUNCTION BUS_PROV_GET_TEST(valueGet IN VARCHAR2)
    RETURN 
         BUS_PROV_CONF%ROWTYPE 
         IS
         V_ROW BUS_PROV_CONF%ROWTYPE ;
    BEGIN
    DECLARE
        V_BUS_PROV  BUS_PRO_CONF.bus_provider%TYPE; 
        V_TRA_NAME   bus_prov_conf.tr_name%TYPE; 
        V_CU_ID bus_prov_conf.cu_id%TYPE;
    BEGIN
         SELECT *
          INTO V_ROW
          FROM BUS_PROV_CONF
         WHERE bus_prov = valueGet
           AND Upper(BUS_PROV) = Upper (valueGet)
          ;
    EXCEPTION
        WHEN no_data_found THEN
            BEGIN 
                SELECT *
                  INTO V_ROW
                  FROM BUS_PROV_CONF
                 WHERE tra_na = valueGet
                   AND Upper(TRA_NA) = Upper (valueGet)
                   ;
            EXCEPTION
            WHEN no_data_found THEN
                BEGIN 
                    SELECT *
                      INTO V_ROW
                      FROM BUS_PROV_CONF
                     WHERE cu_id = valueGet
                       AND Upper(CU_ID) = Upper (valueGet)
                       ;
                EXCEPTION
                    WHEN no_data_found
                    then
                     raise_application_error(-20000, 'Not found');
                END; 
            END;
           END;
    END BUS_PROV_GET_TEST; 

Таблица выглядит следующим образом:

create TABLE "BUS_PROV_CONF" 
(
BUS_PROV varchar2(256),
T_NAME varchar2(256),
C_ID varchar2(256),
NOT_TYPE varchar2(256),
PRO_TYPE varchar2(256),
BILL_AC_ID varchar2(256),
MAIL_ADD varchar2(256)
);

Звезда в SELECT подчеркнута, и я получаю PLS-00382.

Ответы [ 2 ]

1 голос
/ 10 января 2020

Я думаю, что лучший подход здесь - использовать курсоры. Я попытался переписать код и вот что у меня есть. Попробуйте это.

Не уверен, что это сработает, хотя у меня не было возможности запустить это.

create or replace FUNCTION BUS_PROV_GET_TEST(valueGet IN VARCHAR2) RETURN bus_prov_conf%ROWTYPE 
IS
  V_ROW bus_prov_conf%ROWTYPE;
  V_BUS_PROV  bus_provi_conf.bus_prov%TYPE; 
  V_TRAD_NAME   bus_prov_conf.trad_name%TYPE; 
  V_CUS_ID bus_prov_conf.cus_id%TYPE;

  cursor c1 is
    SELECT *
      INTO V_ROW
      FROM BUS_PROV_CONF
     WHERE bus_prov = valueGet
       AND Upper(BUS_PROV) = Upper(valueGet);

  cursor c2 is
    SELECT *
      INTO V_ROW
      FROM BUS_PROV_CONF
     WHERE trad_name = valueGet
       AND Upper(TRAD_NAME) = Upper(valueGet);

  cursor c3 is
    SELECT *
      INTO V_ROW
      FROM BUS_PROV_CONF
     WHERE cus_id = valueGet
       AND Upper(CUS_ID) = Upper(valueGet);

  c1_r c1%rowtype;
  c2_r c2%rowtype;
  c3_r c3%rowtype;

BEGIN  
  open c1;
  fetch c1 into c1_r;
  if c1%notfound then
    open c2;
    fetch c2 into c2_r;
    if c2%notfound then
      open c3;
      fetch c3 into c3_r;
      if c3%notfound then
        raise_application_error(-20000, 'Not found');
      else 
        V_ROW := c3_r;
      end if; 
      close c3%rowtype;        
    else
      V_ROW := c2_r;
    end if;
    close c2;
  else
    V_ROW := c1_r;
  end if;
  close c1

  return v_row;
EXCEPTION
  when others then
    if c1%isopen then
      close c1;
    end if;

    if c2%isopen then
      close c2;
    end if;

    if c3%isopen then
      close c3;
    end if;
    raise;
END BUS_PROV_GET_TEST; 
1 голос
/ 09 января 2020

У вас есть дополнительный НАЧАТЬ и ОБЪЯВИТЬ в своем коде. Ключевое слово IS - это все, что вам нужно до объявления.

Кроме того, возможно, было бы более целесообразно использовать один запрос, который использует операторы UNION или OR для разных столбцов, вместо того, чтобы полагаться на перехват исключений? Просто мысль.

create or replace FUNCTION BUSINESS_PROVIDER_GET_TEST(valueGet IN VARCHAR2)
  RETURN  business_provider_configuration%ROWTYPE IS
    V_ROW business_provider_configuration%ROWTYPE ;
    V_BUSINESS_PROVIDER  business_provider_configuration.business_provider%TYPE; 
    V_TRADING_NAME   business_provider_configuration.trading_name%TYPE; 
    V_CUSTOMER_ID business_provider_configuration.customer_id%TYPE;
  BEGIN
    SELECT *
      INTO V_ROW
      FROM BUSINESS_PROVIDER_CONFIGURATION
     WHERE business_provider = valueGet
       AND Upper(BUSINESS_PROVIDER) = Upper (valueGet)
    union
    SELECT *
      FROM BUSINESS_PROVIDER_CONFIGURATION
     WHERE trading_name = valueGet
       AND Upper(TRADING_NAME) = Upper (valueGet)
    union
    SELECT *
      FROM BUSINESS_PROVIDER_CONFIGURATION
     WHERE customer_id = valueGet
       AND Upper(CUSTOMER_ID) = Upper (valueGet);
  EXCEPTION
    WHEN no_data_found THEN
    raise_application_error(-20000, 'Not found');
 END BUSINESS_PROVIDER_GET_TEST; 
...