すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB for OceanBase:テーブルオブジェクトをクエリするための SQL 文

最終更新日:Dec 30, 2025

データ移行または同期タスクを作成する場合、データ転送サービスは、移行または同期オブジェクトを指定した後に、サポートされていないテーブルを自動的に除外します。そのため、識別されたテーブルの数は、実際に移行または同期する必要があるテーブルの数と一致しない場合があります。このトピックでは、テーブルオブジェクトをクエリするための SQL 文について説明します。

テーブルの基本情報をクエリする

さまざまなタイプのデータソースのテーブルの基本情報をクエリするための SQL 文を以下に示します。

  • MySQL データソース

    SELECT
        NULL TABLE_CATALOG,
        TABLE_SCHEMA,
        TABLE_NAME,
        TABLE_ROWS,
        TABLE_COLLATION,
        ENGINE
        FROM
        information_schema.tables
        WHERE
        TABLE_TYPE = 'BASE TABLE'
        AND TABLE_SCHEMA NOT IN(
            'mysql',
            'information_schema',
            'performance_schema'
        )
        AND TABLE_SCHEMA IN ()
        AND TABLE_NAME IN ();
    
  • MySQL 互換モードの OceanBase データソース

    SELECT
        /*+ query_timeout(600000000)*/
        NULL TABLE_CATALOG,
        TABLE_SCHEMA,
        TABLE_NAME,
        TABLE_ROWS,
        TABLE_COLLATION,
        ENGINE
        FROM
        information_schema.tables
        WHERE
        TABLE_TYPE = 'BASE TABLE'
        AND TABLE_SCHEMA NOT IN(
            'mysql',
            'information_schema',
            'performance_schema'
        )
        AND BINARY TABLE_SCHEMA IN ()
        AND BINARY TABLE_NAME IN ();
    
  • Oracle 互換モードの OceanBase データソース

    SELECT
        /*+ query_timeout(600000000)*/
        NULL,
        A.OWNER,
        A.TABLE_NAME,
        A.NUM_ROWS,
        A.PARTITIONED,
        A.IOT_TYPE
    FROM
        ALL_TABLES A
    WHERE
        A.TABLE_NAME IN (
            SELECT
                OBJECT_NAME
            FROM
                ALL_OBJECTS
            WHERE
                UPPER(OBJECT_TYPE) = 'TABLE'
        )
        AND A.OWNER NOT IN ('SYSTEM', 'SYS')
        AND A.TEMPORARY = 'N'
        AND A.OWNER IN ()
        AND A.TABLE_NAME IN ();
    
  • Oracle データソース

    SELECT
        NULL,
        A.OWNER,
        A.TABLE_NAME,
        A.NUM_ROWS,
        A.PARTITIONED,
        A.IOT_TYPE
    FROM
        ALL_TABLES A
    WHERE
        (A.OWNER, A.TABLE_NAME) NOT IN (
            SELECT
                OWNER,
                MVIEW_NAME
            FROM
                ALL_MVIEWS
            UNION
            ALL
            SELECT
                LOG_OWNER,
                LOG_TABLE
            FROM
                ALL_MVIEW_LOGS
        )
        AND A.OWNER NOT IN ('SYSTEM', 'SYS')
        AND A.TEMPORARY = 'N'
        AND A.OWNER IN ()
        AND A.TABLE_NAME IN ();
    
  • PostgreSQL データソース

    SELECT
        TABLE_CATALOG,
        TABLE_SCHEMA,
        TABLE_NAME
        FROM
        information_schema.tables
        WHERE
        TABLE_TYPE = 'BASE TABLE'
        AND TABLE_SCHEMA <> 'pg_catalog'
        AND TABLE_SCHEMA <> 'information_schema'
        AND TABLE_SCHEMA IN ()
        AND TABLE_NAME IN ();  

外部テーブルを除外する

デフォルトでは、データ転送サービスは、データ移行または同期タスクにおいて外部テーブルを除外します。さまざまなタイプのデータソースの外部テーブルを除外するための SQL 文を以下に示します。

  • Oracle データソース

    SELECT NULL,A.OWNER,A.TABLE_NAME,A.NUM_ROWS,A.PARTITIONED,A.IOT_TYPE
            FROM ALL_TABLES A
            WHERE (A.OWNER,A.TABLE_NAME) NOT IN ( SELECT OWNER,MVIEW_NAME FROM ALL_MVIEWS UNION ALL SELECT LOG_OWNER,LOG_TABLE FROM ALL_MVIEW_LOGS)
            AND A.OWNER NOT IN ('SYSTEM','SYS') AND A.TEMPORARY='N' AND A.EXTERNAL != 'YES'
            %s
  • Oracle 互換モードの OceanBase データソース

    SELECT /*HINT*/ NULL,A.OWNER,A.TABLE_NAME,A.NUM_ROWS,A.PARTITIONED,A.IOT_TYPE FROM ALL_TABLES A
            WHERE A.TABLE_NAME IN (
            SELECT OBJECT_NAME FROM ALL_OBJECTS WHERE UPPER(OBJECT_TYPE)='TABLE'
            ) AND A.OWNER NOT IN ('SYSTEM','SYS') AND A.TEMPORARY='N' AND A.EXTERNAL != 'YES'
            %s

標準ビューをクエリする

さまざまなタイプのデータソースの標準ビューをクエリするための SQL 文を以下に示します。

  • MySQL データソース

    SELECT
        TABLE_NAME,
        TABLE_SCHEMA,
        VIEW_DEFINITION
        FROM
        information_schema.views
        WHERE
        TABLE_SCHEMA IN (); 
    
  • MySQL 互換モードの OceanBase データソース

    SELECT
        TABLE_NAME,
        TABLE_SCHEMA,
        VIEW_DEFINITION
    FROM
        information_schema.views
    WHERE
        TABLE_SCHEMA IN ();
    
  • Oracle 互換モードの OceanBase データソース

    SELECT
        VIEW_NAME,
        OWNER
    FROM
        ALL_VIEWS
    WHERE
        OWNER IN ()
    ORDER BY
        VIEW_NAME;
    
  • Oracle データソース

    SELECT
        OBJECT_NAME,
        OWNER
    FROM
        ALL_OBJECTS
    WHERE
        OBJECT_TYPE='VIEW'
    AND
        STATUS='VALID'
    AND
        OWNER IN ();
    

マテリアライズドビューをクエリする

Oracle データソースでマテリアライズドビューをクエリするための SQL 文は次のとおりです。

SELECT
    MVIEW_NAME AS NAME,
    OWNER
FROM
    ALL_MVIEWS
WHERE
    OWNER IN ()
UNION
SELECT
    LOG_TABLE AS NAME,
    LOG_OWNER
FROM
    ALL_MVIEW_LOGS
WHERE
    LOG_OWNER IN ();

プライマリキーを持つテーブルをクエリする

さまざまなタイプのデータソースのプライマリキーを持つテーブルをクエリするための SQL 文を以下に示します。

  • MySQL データソース

    SELECT
        DISTINCT TABLE_NAME,
        TABLE_SCHEMA
    FROM
        information_schema.statistics
    WHERE
        TABLE_SCHEMA IN ()
        AND upper(INDEX_NAME) = 'PRIMARY';
    
  • MySQL 互換モードの OceanBase データソース

    SELECT
        DISTINCT TABLE_NAME,
        TABLE_SCHEMA
    FROM
        information_schema.statistics
    WHERE
        TABLE_SCHEMA IN ()
        AND upper(INDEX_NAME) = 'PRIMARY';
    
  • Oracle データソース

    SELECT
        TABLE_NAME,
        OWNER
    FROM
        ALL_CONSTRAINTS
    WHERE
        OWNER IN ()
        AND STATUS = 'ENABLED'
        AND VALIDATED = 'VALIDATED'
        AND CONSTRAINT_TYPE = 'P';

プライマリキーまたは NULL 以外のユニークキーを持つテーブルをクエリする

さまざまなタイプのデータソースのプライマリキーまたは NULL 以外のユニークキーを持つテーブルをクエリするための SQL 文を以下に示します。

  • MySQL データソース

    SELECT
        DISTINCT TABLE_NAME,
        TABLE_SCHEMA
    FROM
        information_schema.statistics
    WHERE
        TABLE_SCHEMA IN ()
    GROUP BY
        TABLE_SCHEMA,
        TABLE_NAME,
        INDEX_NAME
    HAVING
        count(*) = count(
            IF(
                upper(nullable) != 'YES'
                AND NON_UNIQUE = 0,
                1,
                NULL
            )
        );
    
  • MySQL 互換モードの OceanBase データソース

    SELECT
        DISTINCT TABLE_NAME,
        TABLE_SCHEMA
    FROM
        information_schema.statistics
    WHERE
        TABLE_SCHEMA IN ()
    GROUP BY
        TABLE_SCHEMA,
        TABLE_NAME,
        INDEX_NAME
    HAVING
        count(*) = count(
            IF(
                upper(nullable) != 'YES'
                and NON_UNIQUE = 0,
                1,
                NULL
            )
        );
    
  • Oracle データソース

    SELECT
        TABLE_NAME,
        OWNER
    FROM
        ALL_CONSTRAINTS
    WHERE
        OWNER IN ()
        AND STATUS = 'ENABLED'
        AND VALIDATED = 'VALIDATED'
        AND CONSTRAINT_TYPE = 'P';
    
  • Oracle 互換モードの OceanBase データソース

    SELECT
        /*+ query_timeout(600000000)*/
        DISTINCT TABLE_NAME,
        OWNER
    FROM
        (
            SELECT
                DC.OWNER,
                DC.TABLE_NAME,
                DC.CONSTRAINT_NAME
            FROM
                ALL_CONS_COLUMNS DCC
                JOIN ALL_CONSTRAINTS DC ON DCC.CONSTRAINT_NAME = DC.CONSTRAINT_NAME
                AND DCC.OWNER = DC.OWNER
                JOIN ALL_TAB_COLUMNS DTC ON DCC.COLUMN_NAME = DTC.COLUMN_NAME
                AND DCC.OWNER = DTC.OWNER
                AND DCC.TABLE_NAME = DTC.TABLE_NAME
            WHERE
                DCC.OWNER IN ()
                AND DC.CONSTRAINT_TYPE IN ('U', 'P')
            GROUP BY
                DC.OWNER,
                DC.TABLE_NAME,
                DC.CONSTRAINT_NAME
            HAVING
                COUNT(*) = COUNT(
                    CASE
                        DTC.NULLABLE
                        WHEN 'Y' THEN NULL
                        ELSE 1
                    END
                )
            MINUS
            SELECT
                TABLE_OWNER,
                TABLE_NAME,
                INDEX_NAME
            FROM
                ALL_IND_EXPRESSIONS
            WHERE
                TABLE_OWNER IN ()
        );

一意なインデックスを持つテーブルをクエリする

さまざまなタイプのデータソースの一意なインデックスを持つテーブルをクエリするための SQL 文を以下に示します。

  • Oracle データソース

    SELECT
        DISTINCT A.TABLE_NAME,
        A.TABLE_OWNER
    FROM
        ALL_IND_EXPRESSIONS A
        JOIN ALL_INDEXES B ON A.TABLE_OWNER = B.TABLE_OWNER
        AND A.TABLE_NAME = B.TABLE_NAME
        AND A.INDEX_NAME = B.INDEX_NAME
    WHERE
        A.TABLE_OWNER IN ()
        AND B.UNIQUENESS = 'UNIQUE';
    
  • Oracle 互換モードの OceanBase データソース

    SELECT
        /*+ query_timeout(600000000)*/
        DISTINCT A.TABLE_NAME,
        A.TABLE_OWNER
    FROM
        ALL_IND_EXPRESSIONS A
        JOIN ALL_INDEXES B ON A.TABLE_OWNER = B.TABLE_OWNER
        AND A.TABLE_NAME = B.TABLE_NAME
        AND A.INDEX_NAME = B.INDEX_NAME
    WHERE
        A.TABLE_OWNER IN ()
        AND B.UNIQUENESS = 'UNIQUE';

特定のデータ型を持つテーブルをクエリする

さまざまなタイプのデータソースの特定のデータ型を持つテーブルをクエリするための SQL 文を以下に示します。

  • Oracle データソース

    SELECT
        DISTINCT TABLE_NAME AS TABLENAME,
        OWNER AS DBNAME
    FROM
        all_tab_columns
    WHERE
        OWNER IN ()
        AND DATA_TYPE IN / NOT IN ();
    
  • MySQL データソース

    SELECT
        DISTINCT TABLE_NAME AS TABLENAME,
        TABLE_SCHEMA
    FROM
        information_schema.COLUMNS
    WHERE
        TABLE_SCHEMA IN ()
        AND DATA_TYPE IN / NOT IN ();

プライマリキーと特定のデータ型を持つテーブルをクエリする

さまざまなタイプのデータソースのプライマリキーと特定のデータ型を持つテーブルをクエリするための SQL 文を以下に示します。

  • MySQL 互換モードの OceanBase データソース

    SELECT
        DISTINCT TABLE_NAME,
        TABLE_SCHEMA
    FROM
        information_schema.COLUMNS
    WHERE
        UPPER(COLUMN_KEY) = 'PRI'
        AND TABLE_SCHEMA IN ()
        AND UPPER(COLUMN_TYPE) IN ();
    
  • MySQL データソース

    SELECT
        DISTINCT TABLE_NAME,
        TABLE_SCHEMA
    FROM
        information_schema.COLUMNS
    WHERE
        UPPER(COLUMN_KEY) = 'PRI'
        AND TABLE_SCHEMA IN ()
        AND UPPER(COLUMN_TYPE) IN ();

ラージオブジェクト(LOB)型を持つテーブルをクエリする

さまざまなタイプのデータソースのラージオブジェクト(LOB)型を持つテーブルをクエリするための SQL 文を以下に示します。

  • Oracle データソース

    SELECT
        DISTINCT TABLE_NAME,
        OWNER
    FROM
        ALL_LOBS
    WHERE
        OWNER IN ();
    
  • Oracle 互換モードの OceanBase データソース

    SELECT
        /*+ query_timeout(600000000)*/
        DISTINCT TABLE_NAME,
        OWNER
    FROM
        ALL_TAB_COLUMNS
    WHERE
        DATA_TYPE IN ('BLOB', 'CLOB')
        AND OWNER IN ();

Oracle データベースで row_movement が DISABLED に設定されているテーブルをクエリする

SELECT
    TABLE_NAME,
    OWNER
FROM
    ALL_TABLES
WHERE
    OWNER IN ()
    AND ROW_MOVEMENT = 'DISABLED';

OceanBase データベースで疑似列を含むテーブルのクエリ

  • MySQL 互換モードの OceanBase データソース

    SELECT
        DISTINCT TABLE_NAME,
        TABLE_SCHEMA
    FROM
        information_schema.columns
    WHERE
        TABLE_SCHEMA IN ()
        AND COLUMN_NAME in (
            'OMS_PK_INCRMT',
            'OMS_OBJECT_NUMBER',
            'OMS_RELATIVE_FNO',
            'OMS_BLOCK_NUMBER',
            'OMS_ROW_NUMBER'
        );
    
  • Oracle 互換モードの OceanBase データソース

    SELECT
        DISTINCT TABLE_NAME,
        OWNER
    FROM
        ALL_TAB_COLUMNS
    WHERE
        OWNER IN ()
        AND COLUMN_NAME IN (
            'OMS_PK_INCRMT',
            'OMS_OBJECT_NUMBER',
            'OMS_RELATIVE_FNO',
            'OMS_BLOCK_NUMBER',
            'OMS_ROW_NUMBER'
        );

指定された値よりも多くの列を含むテーブルをクエリする

さまざまなタイプのデータソースの指定された値よりも多くの列を含むテーブルをクエリするための SQL 文を以下に示します。

  • Oracle データソース

    SELECT
        TABLE_NAME,
        OWNER
    FROM
        ALL_TAB_COLUMNS
    WHERE
        OWNER = ?
    GROUP BY
        TABLE_NAME,
        OWNER
    HAVING COUNT(1) > ?;
    
  • Oracle 互換モードの OceanBase データソース

    SELECT
        /*+ query_timeout(600000000)*/
        TABLE_NAME,
        OWNER
    FROM
        ALL_TAB_COLUMNS
    WHERE
        OWNER = ?
    GROUP BY
        TABLE_NAME,
        OWNER
    HAVING COUNT(1) > ?;