-------------------------------------------------------------------------------------------------------------
-- 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'