|
最快答对且答案未经编辑的puber将获得彩蛋章一枚(编辑过的答案不算),其他会员如果提供有价值的分析、讨论也可获得彩蛋章一枚。
以往旧题索引:
http://www.itpub.net/thread-1499223-1-1.html
原始出处:
http://www.plsqlchallenge.com/
作者:Steven Feuerstein
难度:高
我创建了如下的对象类型来帮我计算PL/SQL代码的执行时间:
CREATE OR REPLACE TYPE plch_timer_t AS OBJECT
(
timer_name VARCHAR2 (2000),
start_time INTEGER,
MEMBER PROCEDURE start_timer,
MEMBER PROCEDURE stop_timer
);
/
CREATE OR REPLACE TYPE BODY plch_timer_t
AS
MEMBER PROCEDURE start_timer
IS
BEGIN
SELF.start_time := DBMS_UTILITY.get_time;
END;
MEMBER PROCEDURE stop_timer
IS
BEGIN
DBMS_OUTPUT.put_line (
DBMS_UTILITY.get_time - start_time);
END;
END;
/
有了这个类型定义,我可以用如下方法来使用它:
DECLARE
l_timer plch_timer_t :=
plch_timer_t ('plch_proc performance', NULL);
PROCEDURE plch_proc IS
BEGIN
null;
END;
BEGIN
l_timer.start_timer;
plch_proc;
l_timer.stop_timer;
END;
/
但我不想在调用timer_t构造函数的时候传递NULL参数;那是start_timer过程里面的设置。哪些选项提供了修改plch_timer_t定义的方法,从而使得下列代码块能够成功执行?
DECLARE
l_timer plch_timer_t :=
plch_timer_t ('plch_proc performance');
PROCEDURE plch_proc IS
BEGIN
null;
END;
BEGIN
l_timer.start_timer;
plch_proc;
l_timer.stop_timer;
END;
/
(A)
CREATE OR REPLACE TYPE plch_timer_t AS OBJECT
(
timer_name VARCHAR2 (2000),
PRIVATE start_time INTEGER,
MEMBER PROCEDURE start_timer,
MEMBER PROCEDURE stop_timer
);
/
(B)
CREATE OR REPLACE TYPE plch_timer_t AS OBJECT
(
timer_name VARCHAR2 (2000),
start_time INTEGER DEFAULT NULL,
MEMBER PROCEDURE start_timer,
MEMBER PROCEDURE stop_timer
);
/
(C)
把这个加入到类型规格(type specification)定义:
CONSTRUCTOR FUNCTION plch_timer_t (
self IN OUT plch_timer_t,
timer_name_in IN VARCHAR2)
RETURN SELF AS RESULT,
把这个加入到类型体(type body)定义:
CONSTRUCTOR FUNCTION plch_timer_t (
self IN OUT plch_timer_t,
timer_name_in IN VARCHAR2)
RETURN SELF AS RESULT
IS
BEGIN
self.timer_name := timer_name_in;
RETURN;
END;
(D)
把这个成员函数加入到类型规格(type specification)定义:
MEMBER FUNCTION plch_timer_at (timer_name_in IN VARCHAR2)
RETURN SELF AS RESULT
把这个加入到类型体(type body)定义:
MEMBER FUNCTION plch_timer_t (timer_name_in IN VARCHAR2)
RETURN SELF AS RESULT
IS
BEGIN
self.timer_name := timer_name_in;
RETURN;
END;
|
|