1

以下の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": 識別子が無効です。

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

EXEC procname('29-JAN-2011');
4

2 に答える 2

6

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

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

したがって、コードは次のようになります。

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 ステートメントを指定し、USING 構文で実行すると、はるかに効率的です。いくつかの変数を SELECT する必要があることに注意してください。

于 2011-06-04T02:52:59.873 に答える
1

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

于 2011-06-04T02:38:45.720 に答える