如果我有类型为foo的子类bar,foo中的方法怎么能看到它实际上是从bar的实例化运行的呢。 例如:
CREATE OR REPLACE
TYPE foo AS OBJECT
(
mxyzptlk NUMBER, -- Because PL/SQL demands you have an attribute defined.
MEMBER FUNCTION get_actual_class_name
RETURN VARCHAR2
) NOT FINAL;
/
CREATE OR REPLACE
TYPE bar UNDER foo
(
) NOT FINAL;
/
DECLARE
baz bar;
BEGIN
DBMS_OUTPUT.PUT_LINE(baz.get_actual_class_name); -- I would hope to get 'bar' back.
END;
/
在PL / SQL OOP中是否可以进行内省?
答案 0 :(得分:1)
由于Oracle处理继承的方式,要弄清楚超类型并不容易,正如@Bob Jarvis所提到的那样,你应该真正考虑时间和性能的提升。
就Oracle而言,您正在调用foo.get_actual_class_name,可以在此处找到更多信息:http://docs.oracle.com/cd/B14117_01/appdev.101/b10807/08_subs.htm#sthref1046
使用DBMS_UTILITY.FORMAT_CALL_STACK我们可以找出调用过程和行。从那里你有很多解析来获取变量名称并解析它被声明的位置以找到实际类型。
如何使用FORMAT_CALL_STACK获取调用过程名称和行号的示例在http://www.oracle-developer.net/content/utilities/stk.sql