in

SDT Community Server

SDT Forums, Blogs, Photos server.

wego

Oracle 泛型使用

------------------------------------------------------------------------------------------------------------- 

--  procedure part

FUNCTION IIF (p_bool IN BOOLEAN, p_result1 IN ANYDATA, p_result2 IN ANYDATA)
   RETURN ANYDATA
IS
   atype                ANYTYPE;
   data_type_argument   EXCEPTION;
BEGIN
   IF p_result1.gettype (atype) <> p_result2.gettype (atype)
   THEN
      RAISE data_type_argument;
   END IF;

   CASE p_result1.gettype (atype)
      WHEN DBMS_TYPES.typecode_number
      THEN
         RETURN CASE
            WHEN p_bool
               THEN ANYDATA.convertnumber (p_result1.accessnumber)
            ELSE ANYDATA.convertnumber (p_result2.accessnumber)
         END;
      WHEN DBMS_TYPES.typecode_varchar2
      THEN
         RETURN CASE
            WHEN p_bool
               THEN ANYDATA.convertnvarchar2 (p_result1.accessvarchar2)
            ELSE ANYDATA.convertnvarchar2 (p_result2.accessvarchar2)
         END;
      WHEN DBMS_TYPES.typecode_date
      THEN
         RETURN CASE
            WHEN p_bool
               THEN ANYDATA.convertdate (p_result1.accessdate)
            ELSE ANYDATA.convertdate (p_result2.accessdate)
         END;
   END CASE;
EXCEPTION
   WHEN data_type_argument
   THEN
      DBMS_OUTPUT.put_line
          ('The data type of the ''IIF'' function both result parameter is different');
      RETURN NULL;
END;

 

-------------------------------------------------------------------------------------------------------------

--  caller part 

v_str                   VARCHAR2 (50)
         := iif (1 > 2,
                 ANYDATA.convertvarchar2 ('Yes'),
                 ANYDATA.convertvarchar2 ('No')
                ).accessnvarchar2;         

-- 类似于 C# 使用 string v_str = iif<string> (1> 2, 'Yes', 'No');


v_num                NUMBER
         := iif (1 > 2, ANYDATA.convertnumber (1), ANYDATA.convertnumber (0)).accessnumber;   

-- 类似于 C# 使用 int v_num = iif<int> (1> 2, 1, 0);

 

DBMS_OUTPUT.put_line (v_str);       -- output 'No' 

DBMS_OUTPUT.put_line (v_num);     -- output '0'

                                                                                  

 

 

Published May 07 2008, 11:48 AM by wego
Filed under:

Comments

No Comments
Copyright SDT, 2006-2009. All rights reserved.