2012-06-18 56 views
1

如果我有一個子類bar,它是foo類型,foo中的某個方法如何從bar的實例化實際運行時看到它。 例如:Oracle PL/SQL OOP,獲取實例化的類名稱

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中是否可以自省?

+3

的答案取決於你多麼想解決這個問題,多少你想勾搭試圖解決問題。嘗試「做最簡單的事情」,即在foo中,實現'get_actual_class_name'來返回文字'foo'並在bar中實現'get_actual_class_name'來返回文字'bar'。 –

回答

1

由於Oracle處理繼承的方式,找出超類型並不容易,而@Bob Jarvis提到你應該真正考慮將時間和性能打回原點。

至於甲骨文而言,你在呼喚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