以为我曾遵循创建模式,但正文无法编译。我想要完成的是开发一个程序包来定期运行一个程序,以确定在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;
/
任何人都可以提供任何帮助或建议将不胜感激。
答案 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;