2017-06-04 12 views
0

次のタスクが割り当てられました。動的PL/SQLの '日付条件'としてテーブルを作成します

テーブルAにid列と日付列があるとします。 PL/SQLで次のようにプロシージャを作成します。テーブル名(この場合はA)と日付Dをパラメータとして取り込み、日付が< DのAのレコードのみを含むA_bckという名前のバックアップ・テーブルを作成し、テーブルAからすべて削除しますレコードはA_bckに挿入されます。

Here there is my code.

不幸私はこのエラーを取得する:

Error report - 
ORA-00904: "MAY": invalid identifier 
ORA-06512: at line 41 
ORA-06512: at line 80 
00904. 00000 - "%s: invalid identifier" 

私が代わりに日付のいずれかに、私は問題がないことをid列にWHERE条件を使用して同じ結果を達成しようとします。 間違いはどこですか?間違った方法で完全に実装していますか?

+0

日付形式のモデルの問題のようです。これまで何をしていますか? – eaolson

+1

外部リンクは誰にでもアクセスできない場合があります。 – Nitish

答えて

1

あなたが持っている問題は、動的SQLを実行しているときにクエリが文字列として構築されていることです。 Oracleは、指定した日付が実際に日付であることを知らず、単に文字列の一部として扱われています。これを解決するには、次の操作を行うことができる必要があります:

my_query := 'CREATE TABLE ' || table_name_backup || ' AS (SELECT * FROM ' || table_name || ' WHERE table_date < to_date(''' || backup_date || '''))';

これはあなたのために問題を整理する必要があります。副表記として、テーブル名はすべて大文字で格納されているので、おそらく "table_exists"クエリを変更する必要があります。

SELECT COUNT(*) INTO table_exists FROM USER_TABLES WHERE TABLE_NAME = upper(my_table);

編集:整数を使用しているときは、上記の問題を持っていない理由

を説明するために、コメント、以下のさらなる説明は、即時実行使用すると、単に与えられた文字列を実行することを覚えておくことが重要ですSQLクエリ。例えば

:完全に有効なSQLで

select 1 from dual where 1 = 1

:上記の例で

declare 
    x INTEGER := 1; 
    i integer; 
    my_query VARCHAR2(256); 
begin 
    my_query := 'select 1 from dual where 1 = ' || x; 
    EXECUTE IMMEDIATE my_query INTO i; 
end; 

my_queryは次のように実行されることになります。

CREATE TABLE abaco_bck AS (SELECT * FROM abaco WHERE table_date < 27-MAY-17)

それは引用符で包まれた、または明示的に日付に変換されていないと、SQLエンジンから「MAY」を引くしようとしている:あなたの例ではしかし、あなたはこのようなもので終わるし、 27しかし、 "MAY"が何であるかはわかりません。

もう1つ言及したいことは、いくつかの操作では、引用符ではなくバインド変数を使用できることです(ただし、DDLでは使用できません)。

declare 
    lToday DATE := SYSDATE; 
    i   INTEGER; 
    my_query VARCHAR2(256); 
begin 
    my_query := 'select 1 from dual where sysdate = :1'; 
    EXECUTE IMMEDIATE my_query INTO i USING lToday; 
end; 
+0

今、すべて意味があります!したがって、動的SQL文を作成する必要があるたびに、文字列ではない変数は ''でエスケープする必要があります。間違いなく、私は連結が自動的に仕事をしていると思った。しかし、なぜ変数が数値であれば、何のエラーも出ませんか? – peppe

+0

うまくいけばあなたのためにいくつかの説明が追加されました – Chrisrs2292

+0

良い説明。私はやや好きでしょう。 ''どこにtable_date

関連する問題