将包调用到一个过程,Oracle PL / SQL

时间:2016-03-07 13:18:16

标签: oracle plsql oracle11g

我正在努力弄清楚我们应该在甲骨文的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的主体

有没有人知道为什么这不起作用?任何提示或指针都很可爱!

2 个答案:

答案 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;