创建包以跟踪使用的磁带

时间:2013-03-23 21:51:59

标签: oracle plsql oracle11g plsqldeveloper

以为我曾遵循创建模式,但正文无法编译。我想要完成的是开发一个程序包来定期运行一个程序,以确定在15个以上的时间和日期正在使用中.Oracle 11g。

需要进入表格的唯一其他数据插入到sysdate中。

      CREATE OR REPLACE 
PACKAGE TAPES_USED AS 
function TAPESCOUNT(count number) return number;
procedure INSERT_TAPES_COUNT(sysdate date, count NUMBER);
END TAPES_USED;
/

-----------------------------------------

CREATE OR REPLACE 
PACKAGE body TAPES_USED AS 
function TAPESCOUNT(count number) return number as count number;
begin
select count(*)
into
count
from DEV.TAPES_IN USE where count(*) > 15;
procedure INSERT_TAPES_COUNT(sysdate date, count NUMBER)as
begin
INSERT INTO  DEV.TAPES_USED VALUES
  (sysdate, count);
end INSERT_TAPES_COUNT;
END TAPES_USED;
/

任何人都可以提供任何帮助或建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

CREATE OR REPLACE 
PACKAGE BODY tapes_used AS 
FUNCTION tapescount(in_ct NUMBER) RETURN NUMBER IS 
  ct NUMBER;
  BEGIN
    SELECT COUNT(*)
      INTO ct
      FROM dev.tapes_in_use;
    IF ct > in_ct THEN
      RETURN ct;
    ELSE
      RETURN NULL;
    END IF;
  END tapescount;

  PROCEDURE insert_tapes_count(sysdt date, ct NUMBER) IS
  BEGIN
    INSERT INTO  dev.tapes_used VALUES (sysdt, ct);
  END insert_tapes_count;
END tapes_used;
/

你应该避免使用COUNT和SYSDATE之类的保留字作为变量名(我不知道,但这可能是你编译的一些问题),所以我重命名了它们。此外,你忘了END你的功能。我认为你在函数中SELECT的FROM子句中缺少表名中的下划线,并且你的函数中没有RETURN语句,你必须拥有它。

一般来说,函数应接受一个或多个输入参数并返回单个值。您没有在函数中使用输入参数。我已经实现了一个建议的参数。

正如叶戈尔所说,这不是一个现实的功能,我不确定你的意图。应该做什么功能?

也许您希望您的功能返回超出计数的日期/时间?您还可以将所有内容组合到一个过程中:

PROCEDURE ck_tape_ct(min_tape_ct NUMBER) IS
  ct NUMBER;
BEGIN
  SELECT COUNT(*)
    INTO ct
    FROM dev.tapes_in_use;
  IF ct > min_tape_ct THEN
    INSERT INTO dev.tapes_used VALUES(SYSDATE, ct);
  END IF;
END;