是否允许在oracle中编写sql函数以返回多个数据类型?

xyhw6mcr  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(251)

我试图了解oracle中的sql函数,我想知道是否有可能编写一个sql函数,它可以根据程序中的条件返回一个数字或varchar2。

jhdbpxl9

jhdbpxl91#

可以使用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;
vltsax25

vltsax252#

oracle函数可以任意复杂,也可以任意应用逻辑。一个包含逻辑的函数的非常基本的例子
该函数只允许两个参数,一个作为varchar,另一个作为number
c2只能是a或b。其他值为错误
基于它的函数返回一个数,如果是a,则返回c1+10的和;如果是b,则返回+100的和。
让我们努力吧

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>

更新
如果要返回任意数量的字符串,请使用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表示不是数字

相关问题