2011-06-04 18 views
1

で作業していない:PL/SQL - TO_DATEは、私がしたいので、のようなprocの下に私を実行することができるように実行即時パラメータ

exec procname('29-JAN-2011'); 

procのコードは次のとおりです。

PROCEDURE procname(pardate VARCHAR2) IS 

    vardate DATE := to_date(pardate, 'DD-MON-YYYY'); 
    SQLS VARCHAR2(4000); 

BEGIN  

    SQLS := 'SELECT cola, colb 
      FROM tablea 
      WHERE TRUNC(coldate) = TRUNC(TO_DATE('''||pardate||''',''DD/MON/YYYY''))'; 

    EXECUTE IMMEDIATE SQLS; 

END; 

それはエラーを投げ続ける:

ORA-00904: "JAN": invalid identifier.

コンパイルされますが、このコマンドを実行するとエラーがスローされます。

EXEC procname('29-JAN-2011'); 
+0

どの行に?? – GolezTrol

+0

これは実際のコードではありません。それはコンパイルされません。 – GolezTrol

+0

アイデアの皆さん? – poots

答えて

6

入力パラメータを日付にキャストする変数を宣言します。なぜそれを使用しないのですか?

また、日付に適用されたTRUNC()はtime要素を削除します。あなたが渡している値に時間がないので、あなたはここでそれを必要としません。

だから、あなたのコードは次のようになります。

PROCEDURE procname(pardate VARCHAR2) IS 

    vardate DATE := to_date(pardate, 'DD-MON-YYYY'); 
    SQLS VARCHAR2(4000) := 'select cola, colb FROM tablea 
      WHERE TRUNC(coldate) = :1'; 

    l_a tablea.cola%type; 
    l_b tablea.colb%type; 
BEGIN  
    EXECUTE IMMEDIATE SQLS 
     into l_a, l_b 
     using vardate; 
END; 

バインド変数を使用して、動的SQLステートメントを指定して使用した構文を使用して実行するには、多くの方が効率的です。我々はまだいくつかの変数にSELECTをしなければならないことに注意してください。

+1

副作用として、trunc()はインデックスをcoldateで使用することを避けるかもしれません。彼は、 "1と:2 + 0.99999の間でどこで冷やすか"というトリックを、ヴァルダート、ヴァルダートを使って考えるかもしれません。 – Samuel

1

to_dateへの2回の呼び出しで、2つの異なる表記法を使用しています。私はそれらのうちの1つ(2番目)が間違っていると思います。

+0

論理が正しいので、正しい構文を入力してください。 – poots

+0

DD-MON-YYYYとDD/MON/YYYYがあります。入力はスラッシュではなくダッシュを使用しているので、2番目のものは間違っていると思います。 – GolezTrol

+0

言語設定の問題でもあります。 1月がJANに短縮されていない国に住んでいますか? – GolezTrol

関連する問題