134
2楼得奖
Choice 1 (17547) l_anytype anytype;
l_typecode PLS_INTEGER;
BEGIN
l_typecode := object_in.gettype (l_anytype);
l_type_name := CASE l_typecode
WHEN DBMS_TYPES.TYPECODE_NUMBER THEN 'SYS.NUMBER'
WHEN DBMS_TYPES.TYPECODE_VARCHAR2 THEN 'SYS.VARCHAR2'
WHEN DBMS_TYPES.TYPECODE_DATE THEN 'SYS.DATE'
ELSE 'UNKNOWN'
END;
ANYDATA.gettype 返回类型码, 然后这个码和DBMS_TYPES 包的常量匹配,并显示所需输出.
83%
Choice 2 (17548) l_anytype anytype;
l_typecode NUMBER;
BEGIN
l_typecode := object_in.gettype (l_anytype);
SELECT type_name
INTO l_type_name
FROM all_types
WHERE typecode = l_typecode;
ANYDATA.gettype 返回类型码, 它是PLS_INTEGER. 但数据库引发 "invalid number" 异常, 因为TYPECODE列的类型是VARCHAR2. 无论如何, ALL_TYPES 视图 不包含标量类型信息.
57%
Choice 3 (17549) [别用] l_cur NUMBER;
l_count INTEGER;
BEGIN
l_cur := dbms_sql.open_cursor;
dbms_sql.parse(
l_cur
, q'[SELECT SYS.ANYDATA.getTypeName(:x) FROM dual]'
, dbms_sql.NATIVE
);
dbms_sql.define_column(l_cur, 1, l_type_name, 400);
dbms_sql.bind_variable(l_cur, ':x', object_in);
l_count := dbms_sql.execute_and_fetch (l_cur);
dbms_sql.COLUMN_VALUE(l_cur, 1, l_type_name);
dbms_sql.close_cursor(l_cur);
ANYDATA用于动态 SQL的绑定变量是可以的. SQL中也能用ANYDATA的静态函数. 这个选项很好地说明了这些功能, 但对要解决的问题过于复杂 .
63%
Choice 4 (17550) [推荐解法] BEGIN
l_type_name := object_in.gettypename;
最佳选择. 使用内置类型方法.
48%
Choice 5 (17551) l_anytype anytype;
BEGIN
l_type_name := object_in.gettype (l_anytype);
ANYDATA.gettype 返回类型码. 该选项显示9 - VARCHAR2的类型码.
71%
Choice 6 (17552) l_anytype anytype;
l_typecode PLS_INTEGER;
TYPE typeinfo_rec IS RECORD (
prec PLS_INTEGER
, SCALE PLS_INTEGER
, len PLS_INTEGER
, csid PLS_INTEGER
, csfrm PLS_INTEGER
, schema_name VARCHAR2(30)
, type_name VARCHAR2(30)
, version VARCHAR2(30)
, count PLS_INTEGER
);
l_typeinfo typeinfo_rec;
BEGIN
l_typecode := object_in.gettype (l_anytype);
l_typecode := l_anytype.GetInfo(l_typeinfo.prec,
l_typeinfo.scale,
l_typeinfo.len,
l_typeinfo.csid,
l_typeinfo.csfrm,
l_typeinfo.schema_name,
l_typeinfo.type_name,
l_typeinfo.VERSION,
l_typeinfo.count);
l_type_name := l_typeinfo.type_name;
报错:ORA-30625: Method Dispatch on NULL SELF Argument Is Disallowed.该方法可用于对象类型, 但不可用于内置标量类型.
测试脚本
我编写了下列不完整的函数:
CREATE OR REPLACE PROCEDURE plch_show_type (
object_in IN anydata
) AS
l_type_name VARCHAR2(400);
/*CODE*/
dbms_output.put_line(l_type_name);
END plch_show_type;
/
用哪个选项代替/*CODE*/ 注释后,执行下面的块会 显示"SYS.VARCHAR2" ?
DECLARE
l_anydata anydata;
BEGIN
l_anydata := anydata.convertvarchar2('');
plch_show_type (l_anydata);
END;
/