我正在努力弄清楚我们应该在甲骨文的11g PL / SQL中解决的这项作业,但是我和我的四个朋友都没有找到解决这个问题的方法,我们希望有人更有才华比我们会给我们一些关于它的指示和/或评论。
让我们从有问题的作业开始(它分为两个部分,这是我们无法弄清楚的最后一部分):
首先,创建一个使用DBMS_UTILITY.GET_TIME获取当前时间的过程,然后执行复杂的计算。最后,显示获得结果/达到答案花费的时间(以秒为单位)。
我们通过创建一个计算素数的for循环来解决这个问题(花费大约5秒来计算从1到5000的每个素数),然而,最后一部分说明了这一点:
现在,创建一个包含此复杂计算的包,然后重新编写您的过程,以便它在该计算的“包方法”中调用。您的程序现在只测量开始时间,通过计算调用包,并显示获得结果/达到答案花费的时间(以秒为单位)。
因此,回顾一下:该过程将测量程序包进行计算所需的时间。这就是我们陷入困境的地方。网上没有太多关于此的信息,但我的代码如下:
SET SERVEROUTPUT ON
CREATE OR REPLACE PROCEDURE time_measure_procedure
AS
time_start NUMBER;
time_end NUMBER;
time_diff NUMBER;
BEGIN
time_start := dbms_utility.get_time;
--This is where I'd presumably call in the
--package into the procedure, whereas the time
--will be measured until the calculation is done.
heavy_calculation_package;
time_end := dbms_utility.get_time;
time_diff := ( time_end - time_start ) / 100;
dbms_output.Put_line('Time it took: ' || time_diff || ' seconds.');
END time_measure_procedure;
/
CREATE OR REPLACE PACKAGE BODY heavy_calculation_package
AS
PROCEDURE time_measure_procedure
IS
x NUMBER;
counter NUMBER;
BEGIN
--This is the prime number calculation, which
--we're supposed to call into the procedure.
FOR n IN 1 .. 5000 LOOP
counter := 0;
x := Floor(n / 2);
FOR i IN 2 .. x LOOP
IF ( MOD(n, i) = 0 ) THEN
counter := 1;
END IF;
END LOOP;
IF ( counter = 0 ) THEN
dbms_output.Put_line(n ||' is a prime number.');
END IF;
END LOOP;
END time_measure_procedure;
END heavy_calculation_package;
/
我收到的错误通常是:
对象package_heavy_calc无效 如果没有它的规范,就无法编译package_heavy_calc的主体
有没有人知道为什么这不起作用?任何提示或指针都很可爱!
答案 0 :(得分:3)
您需要让包处于有效状态才能调用它。在这种情况下,您需要首先声明包:
CREATE OR REPLACE PACKAGE package_heavy_calc
AS
PROCEDURE heavy_calc;
END PACKAGE_HEAVY_CALC;
你可以拥有一个没有身体的包裹,但没有没有包裹的身体。您可以通过将代码放在包头中来完成此操作。为了您的目的,声明包和包体更容易。
旁边的命名对于良好的可读代码至关重要。我会将你的软件包PKG_MATH和程序P_CALC_PRIME_NUMBERS命名为,所以当你调用它时,你就知道它的作用。然而,命名就像运动队一样,每个人都有一个最喜欢的球队,而且风格可能完全不同。
答案 1 :(得分:0)
请添加软件包规格,然后尝试。下面是一个片段 会帮助你。
CREATE OR REPLACE PACKAGE package_heavy_calculation
AS
PROCEDURE heavy_calc;
END package_heavy_calculation;
CREATE OR REPLACE PACKAGE BODY package_heavy_calculation
AS
PROCEDURE heavy_calc
IS
x NUMBER;
counter NUMBER;
BEGIN
--This is the prime number calculation, which
--we're supposed to call into the procedure.
FOR n IN 1 .. 5000
LOOP
counter := 0;
x := Floor(n / 2);
FOR i IN 2 .. x
LOOP
IF ( MOD(n, i) = 0 ) THEN
counter := 1;
END IF;
END LOOP;
IF ( counter = 0 ) THEN
dbms_output.Put_line(n ||' is a prime number.');
END IF;
END LOOP;
END heavy_calc;
END package_heavy_calculation;