0

作成パターンに従っていると思いましたが、本体がコンパイルされません。私が達成しようとしているのは、プロシージャを定期的に実行するパッケージを開発して、15を超える使用日時を判別することです。Oracle11g。

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ステートメントがありませんでした。

一般的に、関数は1つ以上の入力パラメーターを受け入れ、単一の値を返す必要があります。関数で入力パラメーターを使用していません。提案されたパラメーターを実装しました。

Egorが指摘しているように、これは現実的な機能ではなく、ここでのあなたの意図についてはよくわかりません。機能は何をすることになっていますか?

たぶん、あなたの関数があなたのカウントを超えた日付/時刻を返したいですか?すべてを1つの手順にまとめることもできます。

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 に答える