0

以为我遵循了创建模式,但正文不会编译。我想要完成的是开发一个包来定期运行一个程序,以确定在什么时间和日期使用超过 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;
/

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

4

1 回答 1

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 作为变量名(我不知道,但这可能是您的一些编译问题),所以我已经重命名了它们。此外,您忘记结束您的功能。我认为您在函数中 SELECT 的 FROM 子句中的表名中缺少下划线,并且您的函数中没有 RETURN 语句,这是您必须拥有的。

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

正如 Egor 所指出的,这不是一个现实的功能,我不确定你的意图。该功能应该做什么?

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

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;
于 2013-03-23T22:01:04.230 回答