oracle 得到变量类型,PL/SQL Challenge 每日一题:2013-12-24 获取变量类型

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;

/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值