Можно ли написать функцию SQL в Oracle, чтобы возвращать больше, чем типы данных? - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь разобраться в функциях SQL в Oracle, мне было интересно, можно ли написать функцию SQL, которая может возвращать Number или Varchar2 в зависимости от условий в программе.

Ответы [ 2 ]

3 голосов
/ 06 августа 2020

Вы можете СОРТИРОВАТЬ это, используя возвращаемый тип ANYDATA. Но вызывающий запрос или блок PL / SQL должны использовать оператор CASE для оценки возвращаемого типа, чтобы что-то с ним сделать. Очень простая демонстрация ниже.

    CREATE OR REPLACE FUNCTION AnyData_Test
      (
       p_Value_In            IN      VARCHAR2
      )
      RETURN AnyData
AS
      ad_Test_Var            ANYDATA;
BEGIN
      CASE
            WHEN p_Value_In = 'Varchar2' THEN ad_Test_Var := SYS.ANYDATA.ConvertVarchar2('VC2');
            WHEN p_Value_In = 'Number'   THEN ad_Test_Var := SYS.ANYDATA.ConvertNumber(123);
            ELSE                              ad_Test_Var := SYS.ANYDATA.ConvertDate(SYSDATE);
      END CASE;
      RETURN ad_Test_Var;
END AnyData_Test;
/

SELECT
      AnyData.GetTypeName(AnyData_Test('Varchar2'))    AS Return_Type_V
     ,AnyData.AccessVarchar2(AnyData_Test('Varchar2')) AS Return_Type_V_Value
     --
     ,AnyData.GetTypeName(AnyData_Test('Number'))      AS Return_Type_N
     ,AnyData.GetTypeName(AnyData_Test('Nope'))        AS Return_Type_D
FROM dual
;
      
SELECT
      CASE AnyData.GetTypeName(AnyData_Test('Varchar2'))
            WHEN 'SYS.VARCHAR2' THEN AnyData.AccessVarchar2(AnyData_Test('Varchar2'))
            ELSE 'Other'
      END AS Quick_Test
FROM dual;
1 голос
/ 06 августа 2020

Oracle функций могут быть сколь угодно сложными, и вы можете применять столько logi c, сколько захотите. Очень простой c пример функции с logi c внутри

  • Функция допускает только два параметра, один как varchar, а другой как число
  • C2 может быть только A или B. Другое значение является ошибкой
  • Функция, основанная на этом, возвращает число, которое является суммой c1 +10, если это A, +100, если это B.

Давайте заставим это работать

SQL> create or replace function my_example ( c1 in number , c2 in varchar2 ) return 
number
is
        begin
        if c2 = 'A'
        then
           return c1 + 10 ;
        elsif c2 = 'B'
        then
  2    3    4    5    6    7    8    9             return c1 + 100 ;
        else
           raise_application_error ( -20001, 'c1 only allows A or B' );
 10   11   12   end if;
end;
 13   14  /

Function created.

SQL> select my_example( 1 , 'A' ) from dual ;

MY_EXAMPLE(1,'A')
-----------------
               11

SQL>  select my_example( 1 , 'B' ) from dual ;

MY_EXAMPLE(1,'B')
-----------------
              101

SQL>

UPDATE

Если вы хотите вернуть любое количество строк, используйте return varchar2

SQL> create or replace function my_example ( c1 in number , c2 in varchar2 ) return varchar2
  2  is
  3     begin
        if c2 = 'A'
        then
           return c1 + 10 ;
  4    5    6    7      elsif c2 = 'B'
  8     then
  9        return c1 + 100 ;
 10     elsif c2= 'C'
        then
                return 'Alfa' ;
 11   12   13   else
           raise_application_error ( -20001, 'c1 only allows A or B' );
        end if;
end;
/ 14   15   16   17

Function created.

SQL> select my_example( 1 , 'C' ) from dual ;

MY_EXAMPLE(1,'C')
--------------------------------------------------------------------------------
Alfa

SQL> select my_example( 1 , 'A' ) from dual ;

MY_EXAMPLE(1,'A')
--------------------------------------------------------------------------------
11

SQL>  select my_example( 1 , 'B' ) from dual ;

MY_EXAMPLE(1,'B')
--------------------------------------------------------------------------------
101

Затем вы также можете применить (начиная с версии 12.2) стандартную функцию VALIDATE_CONVERSION, чтобы определить, является ли возврат исходной функции строкой или числом.

SQL> select validate_conversion ( my_example( 1 , 'B' ) as number ) from dual ;

VALIDATE_CONVERSION(MY_EXAMPLE(1,'B')ASNUMBER)
----------------------------------------------
                                             1

SQL> select validate_conversion ( my_example( 1 , 'C' ) as number ) from dual ;

VALIDATE_CONVERSION(MY_EXAMPLE(1,'C')ASNUMBER)
----------------------------------------------
                                             0

SQL>

1 означает истинное число, 0 означает, что это не число

...