2017-11-14 8 views
0

私は、selectステートメントでローカル変数として計算された日付を使用するSQLプロシージャーを作成しています。私はOracle SQL開発者を使用しています。私のコードは次のとおりです。select文が存在するときに "エラー(14,48):PL/SQL:ORA-00904: "L_MAX_DT" 無効な識別子"プロシージャー内の変数とselectステートメントの宣言

create or replace PROCEDURE 
            my_procedure 
AS 
BEGIN 
DECLARE 
    l_max_dt DATE; 
BEGIN 
SELECT MAX(TRX_DT) 
INTO l_max_dt 
FROM TABLE 
WHERE 1=1; 
end; 
select * from TABLE where trx_dt = l_max_dt; 
end; 

このコードは私にエラーを与えます。 変数をステートメントで使用するために変数を保存するにはどうすればよいですか?

答えて

0

これはあなたがProcedureと書く方法です。 Syntaxincorrectです。構文について読むHere

CREATE OR REPLACE PROCEDURE my_procedure 
AS 
    l_max_dt DATE; 
    v_var  TABLE2%ROWTYPE; 
BEGIN 
    SELECT MAX (TRX_DT) 
    INTO l_max_dt 
    FROM TABLE1 
    WHERE 1 = 1; 

    -- Assuming the query will retrun only 1 row. 
    SELECT * 
    INTO v_var 
    FROM TABLE2 
    WHERE trx_dt = l_max_dt; 
END; 
+0

l_max_dtでselect文を使用するにはどうすればよいですか? – Caims

+0

@Caimsすでにあなたを紹介しました。更新された投稿を確認します。 – XING

0

問題は有効範囲の1つです。あなたの手続きでは、l_max_dt変数を宣言する入れ子ブロックがあります。コードがそのブロックを終了すると、l_max_dt変数はもはや有効範囲にない - つまり、外側のブロックはそれについて何も知らない。

この例では、ネストされたブロックを持ってする必要はありません - あなたはそうのように、同じブロック内ですべての操作を行うことができます。

create or replace PROCEDURE my_procedure 
AS 
    l_max_dt DATE; 
BEGIN 
    SELECT MAX(TRX_DT) 
    INTO l_max_dt 
    FROM TABLE 
    WHERE 1=1; 

-- commented out as this isn't valid syntax; there is a missing INTO clause 
-- select * 
-- from TABLE where trx_dt = l_max_dt; 
END my_procedure; 

しかし、あなたは、単に一挙に問い合わせを行うことができます - 例えば:

select * 
from your_table 
where trx_dt = (select max(trx_dt) from your_table); 

あなたの手順についてのポイントのカップル:PL/SQLで

  1. 、あなたは暗黙カーソルを使用する場合(つまり、WHあなたはコードの本文に直接select文を入れます)、結果を入れるものが必要です。結果を配列に大量に集めることもできますし、レコードまたは対応するスカラー変数に1つの行(またはNO_DATA_FOUNDとTOO_MANY_ROWSのコードエラー処理)を確実に受け取るようにすることもできます。
  2. プロシージャではselect *を使用しないでください。代わりに、そのテーブルに列を追加したユーザーがプロシージャをエラーで呼び出す可能性があるため、返される列を明示的に指定する必要があります。この "ルール"には例外がありますが、明示的に列を記述するのは良い習慣です。
関連する問題