Не можете да тествате типа въз основа на спецификацията на функцията, но можете да тествате типа на предадените обекти с помощта на IS OF( type)
оператор или SYS_TYPEID
функция
:
Настройка на схема на Oracle 11g R2 :
CREATE type my_weird_type IS OBJECT( a NUMBER) NOT FINAL/CREATE TYPE my_weird_subtype UNDER my_weird_type( b NUMBER)/CREATE FUNCTION getType( i_type my_weird_type) RETURN VARCHAR2ISBEGIN IF i_type IS OF( my_weird_subtype ) THEN RETURN 'subtype'; ELSIF i_type IS OF( my_weird_type) THEN RETURN 'type'; ELSE RETURN 'други'; END IF;END;/CREATE FUNCTION getType2( i_type my_weird_type) RETURN VARCHAR2IS o_type USER_TYPES.TYPE_NAME%TYPE;BEGIN SELECT type_name INTO o_type FROM user_types WHERE typeid =SYS_TYPEID( i_type); RETURN o_type;EXCEPTION WHEN NO_DATA_FOUND THEN RETURN NULL;END;/създайте таблица test_my_weird_type( стойност my_weird_type)/INSERT INTO test_my_weird_type (стойност)SELECT my_weird_type(1) FROM DUAL UNION ALLSELECT my_weird_subtype(2,3) FROM DUAL UNION ALLSELECT NULL FROM DUAL/
Заявка 1 :
SELECT t.value.a AS a, TREAT( t.value AS my_weird_subtype).b AS b, getType( value), getType2( value )FROM test_my_weird_type t
<предварителен код>| A | B | GETTYPE(СТОЙНОСТ) | GETTYPE2(СТОЙНОСТ) ||--------|--------|----------------|--------- ---------|| 1 | (нула) | тип | MY_WEIRD_TYPE || 2 | 3 | подтип | MY_WEIRD_SUBTYPE || (нула) | (нула) | други | (null) |