Gblog

おもにTips

SYS_NC00004$

列名です。

GoldenGateのフィジビリティチェックで、SYS_NC00004$ なる列があったので調べてみたところ、どうやらファンクション索引を付けた場合に自動で仮想列ができるようです。

こんな感じ

SQL> create table test1 (id number , col1  char(1), col2 char(1) );

Table created.

SQL> insert into test1 values (1,'x','z');

1 row created.

SQL> commit;

Commit complete.

SQL> create index test1_i1  on test1( col1 || '-' || col2);

Index created.

SQL> select COLUMN_ID,TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH,VIRTUAL_COLUMN,HIDDEN_COLUMN
  2  from user_tab_cols
  3  where table_name ='TEST1'
  4  order by 1;

 COLUMN_ID TABLE_NAME           COLUMN_NAME          DATA_TYPE  DATA_LENGTH VIRTUAL_C HIDDEN_CO
---------- -------------------- -------------------- ---------- ----------- --------- ---------
         1 TEST1                ID                   NUMBER              22 NO        NO
         2 TEST1                COL1                 CHAR                 1 NO        NO
         3 TEST1                COL2                 CHAR                 1 NO        NO
           TEST1                SYS_NC00004$         CHAR                 3 YES       YES

VIRTUAL_COLUMN=YES(仮想列)で、HIDDEN_COLUMN=YES(非表示列)で作成されるようです。

 

ちなみに、非表示列は user_tab_columns では表示されません。

SQL> select TABLE_NAME,COLUMN_NAME,DATA_TYPE from dba_tab_columns where table_name ='TEST1' ;

TABLE_NAME           COLUMN_NAME          DATA_TYPE
-------------------- -------------------- ----------
TEST1                ID                   NUMBER
TEST1                COL1                 CHAR
TEST1                COL2                 CHAR

 

仮想列を明示的に作ると。。。

CREATE TABLE test2 (id number , col1  char(1), col2 char(1), col3 as ( col1 || '-' || col2) );
insert into test2 values (1,'x','z');
commit;
create index test2_i1  on test2(col3);

...

 COLUMN_ID TABLE_NAME           COLUMN_NAME          DATA_TYPE  DATA_LENGTH VIRTUAL_C HIDDEN_CO
---------- -------------------- -------------------- ---------- ----------- --------- ---------
         1 TEST2                ID                   NUMBER              22 NO        NO
         2 TEST2                COL1                 CHAR                 1 NO        NO
         3 TEST2                COL2                 CHAR                 1 NO        NO
         4 TEST2                COL3                 CHAR                 3 YES       NO

 

仮想列で通常の列と同様に表示されます。

 

ちなみにどちらのケースも、ファンクション索引になります。

SQL> col INDEX_NAME for a20
SQL> col INDEX_TYPE for a30
SQL> select index_name, index_type from ind ;

INDEX_NAME           INDEX_TYPE
-------------------- ------------------------------
TEST1_I1             FUNCTION-BASED NORMAL
TEST2_I1             FUNCTION-BASED NORMAL