问题描述
对于相同代码,我有一个关于SQL和PL/SQL中如何处理事情的问题。
如果我定义了几个类似的简单类型:
然后定义一个简单的函数来获取类型名称(其想法是,我可以获取传入的对象的类型名称,该对象可以是父类型或任意数量的继承类型):
如果我像这样运行:
我获取类型名“.Cild”
这就是我想要的。
如果我像这样运行:
或者在pl/sql上下文中使用SQL
我得到“.PARENT”。
我的问题是:为什么pl/sql和sql引擎处理它的方式不同?在Oracle的未来版本中,我是否可以依靠pl/sql实现来实现此功能(即,这是预期行为,而不是可以在以后修复的“错误”).
先谢了!我从这个网站学到了很多东西。
如果我定义了几个类似的简单类型:
CREATE OR REPLACE TYPE PARENT FORCE IS OBJECT
(
parent_name VARCHAR2(128)
) NOT FINAL;
/
CREATE OR REPLACE TYPE child FORCE UNDER PARENT
(
child_name VARCHAR2(128)
);
/
然后定义一个简单的函数来获取类型名称(其想法是,我可以获取传入的对象的类型名称,该对象可以是父类型或任意数量的继承类型):
CREATE OR REPLACE FUNCTION get_type_name(p_obj PARENT) RETURN VARCHAR2 IS
BEGIN
RETURN sys.anydata.convertobject(obj => p_obj).gettypename;
END get_type_name;
/
如果我像这样运行:
DECLARE
v_child child;
BEGIN
dbms_output.put_line(get_type_name(p_obj => v_child));
END;
我获取类型名“
这就是我想要的。
如果我像这样运行:
SELECT get_type_name(p_obj => child(parent_name => 'parent'
,child_name => 'chld')) type_name
FROM dual;
或者在pl/sql上下文中使用SQL
SELECT get_type_name(p_obj => child(parent_name => 'parent'
,child_name => 'chld')) type_name
into v_type_name
FROM dual;
我得到“
我的问题是:为什么pl/sql和sql引擎处理它的方式不同?在Oracle的未来版本中,我是否可以依靠pl/sql实现来实现此功能(即,这是预期行为,而不是可以在以后修复的“错误”).
先谢了!我从这个网站学到了很多东西。
专家解答
Why do the pl/sql and sql engines handle it differently
他们不应该这样,我建议记录SR。
我倾向于在查看与继承等混合的任何数据时小心谨慎,因为我看到的是这样的情况
这让我怀疑这里有一些问题你可能遇到了一些危险的案子。在处理SQL空间时,您可以通过ISOF“type”子句解决其中的一些问题。
他们不应该这样,我建议记录SR。
我倾向于在查看与继承等混合的任何数据时小心谨慎,因为我看到的是这样的情况
SQL> select sys.anydata.convertobject(parent('x')) from dual;
ERROR:
ORA-22636: collection unpickling failed due to corrupt image
这让我怀疑这里有一些问题你可能遇到了一些危险的案子。在处理SQL空间时,您可以通过ISOF“type”子句解决其中的一些问题。
文章转载自askTom,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




