1

如果我有 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 中是否可以进行自省?

4

1 回答 1

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

于 2012-06-18T18:32:17.780 回答