あなたが持っている問題は、動的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;
日付形式のモデルの問題のようです。これまで何をしていますか? – eaolson
外部リンクは誰にでもアクセスできない場合があります。 – Nitish