1

データベースのバージョン: オラクル 11.2.0.2

シナリオ : プロシージャを使用してレンジ パーティションの作成を自動化しようとしています。以下はそのためのコードです。エラーなしで作成されます。しかし、実行するとエラーが発生します。変数に渡される値が正しくないと思います。さまざまなSQLを試しましたが、何もうまくいきませんでした.誰かがこの手順で私を助けてくれますか.

SQL> CREATE OR REPLACE PROCEDURE MONTHLY_PARTITION as
  2
  3    v_partition_name varchar2(30);
  4    v_limit TIMESTAMP with local time zone;

  5    6  begin
  7
  8    select to_char(trunc(add_months(sysdate,1),'MM'),'MonYYYY')
  9    into v_partition_name
 10    from dual;
 11
 12    SELECT TO_TIMESTAMP(TO_CHAR(ADD_MONTHS(current_timestamp, 2), 'YYYYMMDD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS')  into v_limit from dual;
 13
 14  execute immediate 'ALTER TABLE TEST ADD PARTITION ' || v_partition_name || ' VALUES LESS    THAN (TIMESTAMP ' || v_limit || ')';
 15
 16  end;
 17  /

Procedure created.

SQL> show errors
No errors.
SQL>
SQL> exec MONTHLY_PARTITION;
BEGIN MONTHLY_PARTITION; END;

*
ERROR at line 1:
ORA-14019: partition bound element must be one of: string, datetime or interval literal, number, or MAXVALUE
ORA-06512: at "MONTHLY_PARTITION", line 14
ORA-06512: at line 1
4

3 に答える 3

2

あなたが持っているものは実際に大丈夫です。ほんの少しのデータ型エラーだけです!

変数をDDLに接続するときvarchar2ではなく、として持つ必要があります。timestamp

すなわち:

SQL> create table TEST(dte timestamp)
  2  partition by range (dte)
  3  (PARTITION TODAY VALUES LESS THAN (TIMESTAMP'2012-02-01 00:00:00'));

Table created.

SQL> CREATE OR REPLACE PROCEDURE MONTHLY_PARTITION as
  2
  3   v_partition_name varchar2(30);
  4   v_limit varchar2(30);
  5
  6    begin
  7
  8   select to_char(trunc(add_months(sysdate,1),'MM'),'MonYYYY')
  9   into v_partition_name
 10   from dual;
 11
 12   SELECT TO_CHAR(ADD_MONTHS(current_timestamp, 2), 'YYYY-MM-DD HH24:MI:SS')  into v_limit from dual;
 13
 14  execute immediate 'ALTER TABLE TEST ADD PARTITION ' || v_partition_name || ' VALUES LESS THAN (TIMESTAMP''' || v_limit || ''')';
 15
 16  end;
 17  /

Procedure created.

SQL> exec monthly_partition

PL/SQL procedure successfully completed.

SQL> select partition_name from user_tab_partitions where table_name = 'TEST';

PARTITION_NAME
------------------------------
TODAY
MAR2013

ADD_MONTHS(current_timestamp, 2)また、現在の式が月に切り捨てられていないことにも注意してください。あなたもそれをやりたいですか?すなわちtrunc(ADD_MONTHS(current_timestamp, 2), 'mm')

于 2013-02-06T00:18:02.910 に答える
1

これを文字列変数に割り当てます。

    str := 'ALTER TABLE TEST ADD PARTITION ' || v_partition_name 
       || ' VALUES LESS THAN (TIMESTAMP ' || v_limit 
       || ')';

それから

dbms_output.PUT_LINE( str );
execute immediate str;

出力 str が sql plus から意図したとおりに実行されるかどうかを確認します

于 2013-02-05T21:53:37.560 に答える
0

パーティションの値は固定する必要があり、手動で処理する必要があります。パーティションの値を指定するときに式を使用することはできません。

于 2013-02-05T21:53:01.963 に答える