varchar2列上的间隔分区

时间:2017-07-12 11:06:36

标签: oracle partitioning varchar

我有一个包含大量数据的大表 - 历史和当前。

我有一个自动作业,可以将旧数据从某些表移到历史表

(然后从源中删除)。

所以我想建立一个

  

间隔分区

从该表中获取旧数据的表。

问题是源中的base-date-column是这种模式中的varchar2:

  

2017/07

新表列数据类型必须与源相同。

因此,当我尝试创建区间分区表时,我无法对其进行范围调整。

如果您尝试使用

,则会出现错误
  

TO_DATE

我该怎么办?

这是源表:

void clippingTest(HDC dc, int x, int y, std::wstring const &text, int mode1, int mode2){
  SaveDC(dc);

  HBRUSH redBrush = CreateSolidBrush(RGB(255, 0, 0));
  HBRUSH greenBrush = CreateSolidBrush(RGB(0, 255, 0));
  HBRUSH blueBrush = CreateSolidBrush(RGB(0, 0, 255));

  LOGFONT lf = {0};
  lf.lfHeight = -MulDiv(12, GetDeviceCaps(dc, LOGPIXELSY), 72);
  std::wstring const faceName = L"Arial";
  wcscpy_s(lf.lfFaceName, LF_FACESIZE, faceName.c_str());
  HFONT font = CreateFontIndirect(&lf);

  RECT rect = {x, y, x + 700, y + 650};
  FillRect(dc, &rect, greenBrush);

  BeginPath(dc);
    Ellipse(dc, x, y, x + 400, y + 400);
    //drawStar(dc, x, y);
  EndPath(dc);
  SelectClipPath(dc, RGN_COPY);

  BeginPath(dc);
    Ellipse(dc, x + 300, y, x + 700, y + 400);
    //drawStar(dc, x, y);
  EndPath(dc);
  SelectClipPath(dc, mode1);

  BeginPath(dc);
    Ellipse(dc, x + 150, y + 250, x + 550, y + 650);
    //drawStar(dc, x + 300, y);
  EndPath(dc);
  SelectClipPath(dc, mode2);

  SetPolyFillMode(dc, ALTERNATE);
  FillRect(dc, &rect, blueBrush);

  BeginPath(dc);
    Rectangle(dc, rect.left, rect.top, rect.right, rect.bottom);
  EndPath(dc);
  SelectClipPath(dc, RGN_COPY);

  SelectObject(dc, font);
  DrawText(dc, text.c_str(), text.length(), &rect, DT_CENTER | DT_TOP);

  RestoreDC(dc, -1);
}

这就是我想要做的但却得到错误:

    CREATE TABLE 
DATA_01( 
APPLICATION   VARCHAR2(10 BYTE),
PROCESS       VARCHAR2(100 BYTE),
SNAPSHOT_MONTH VARCHAR2(7 BYTE)
);

感谢。

1 个答案:

答案 0 :(得分:1)

定义虚拟列并将其用于分区:

CREATE TABLE 
HISTORY_01 ( 
    APPLICATION   VARCHAR2(10 BYTE) NOT NULL ENABLE,
    PROCESS       VARCHAR2(100 BYTE),
    SNAPSHOT_MONTH VARCHAR2(7 BYTE),
    PARTITION_KEY TIMESTAMP GENERATED ALWAYS AS (TO_TIMESTAMP(snapshot_month, 'yyyy/mm')) VIRTUAL
)
PARTITION BY RANGE (PARTITION_KEY) 
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH')) 
(  
   PARTITION p_until_01_1900 VALUES LESS THAN (TIMESTAMP '1900-01-01 00:00:00')
);