5

パッケージでハードコーディングされた日付値を宣言できるのに、クエリから値を割り当てられない理由を誰かが理解するのを手伝ってくれますか? ハードコーディングされた値の宣言を示す多くの例 (参考書を含む) を見てきましたが、クエリを介して変数に値を代入する例を見つけることができません。

これは許可されています:

create or replace package body PACKAGE_NAME AS
    tDate DATE := '2012-05-30';
    -- ...procedures follow

これは許可されています:

create or replace package body PACKAGE_NAME AS
    tDate DATE := sysdate;

これは許可されていません:

create or replace package body PACKAGE_NAME AS
    tDate DATE := select MAX(date_) from Table_Name;

私はいくつかの方法を試しましたが、うまくいかなくても大丈夫です。手順自体で必要に応じて使用できます。しかし、なぜこのように値を割り当てることができないのか知りたいtDateですか? 具体的なエラーは次のとおりです。

期待しているときにシンボル「SELECT」に遭遇しました....

ストアド プロシージャでクエリを介して割り当てられた変数値を取得できますが、同じプロセスがパッケージ本体では機能しないようです。

PROCEDURE Proc_Name IS
tDate Date;
BEGIN
SELECT MAX(date_) into tDate from Table_Name;
4

2 に答える 2

11

パッケージ本体にパッケージ初期化ブロックを作成する必要があります。これはPL/SQLパッケージの伝承の比較的難解なビットですが、そこにあり、使用することができます。次に例を示します。

CREATE OR REPLACE PACKAGE TEST_PKG IS
  tDate  DATE;
END TEST_PKG;

ここでは、単一のDATE変数のみを含むパッケージ仕様を作成しました。次に、SELECTステートメントを使用してその変数を初期化する単純な本体を作成します。

CREATE OR REPLACE PACKAGE BODY TEST_PKG IS
  -- package-private variables go first (if any)
(...) 
  -- then the public functions/procedures
(...)
  -- then a final BEGIN-END block which is the package initialization block
BEGIN
  SELECT SYSDATE
    INTO tDATE
    FROM DUAL;
EXCEPTION  -- you can have exception handlers in your initialization block
  WHEN OTHERS THEN
    NULL;  -- pointless here, but this is just an example
    RAISE;
END TEST_PKG;

ここで、以下を実行すると、次のようになります。

begin
  -- Test statements here
  DBMS_OUTPUT.PUT_LINE('TEST_PKG.tDate = ' || TEST_PKG.tDate);
end;

現在の日付を出力する必要があります。

共有してお楽しみください。

于 2012-06-01T14:35:07.447 に答える
0

INTO変数を直接選択するときに使用する必要があります。

select MAX(date_) 
INTO tDate
from Table_Name;
于 2012-06-01T14:09:43.133 に答える