2.7.2.1. GaussDB-Oracle 目标库

本节描述 伪多发 GaussDB-Oracle 目标库的 SQL 兼容情况说明。

目前兼容 505.2 版本。

2.7.2.1.1. MERGE 语句

语法结构

MERGE INTO [ schema. ] { table | view } [ t_alias ]
USING { [ schema. ] { table | view }
      | subquery
} [ t_alias ]
ON ( condition )
[ merge_update_clause ]
[ merge_insert_clause ];

merge_update_clause:
    WHEN MATCHED THEN
        UPDATE SET column = { expr | DEFAULT }
                   [, column = { expr | DEFAULT } ]...
        [ where_clause ]
        [ DELETE where_clause ]

merge_insert_clause:
    WHEN NOT MATCHED THEN
        INSERT [ ( column [, column ]... ) ]
        VALUES ( { expr [, expr ]... | DEFAULT } )
        [ where_clause ]

subquery:
    SELECT [ DISTINCT | ALL ] select_expr_list
    [ FROM from_list ]
    [ WHERE condition ]
    [ GROUP BY group_expression_list [ HAVING condition ] ]
    [ ORDER BY order_expression_list ]
    [ FOR UPDATE [ OF column ]
      [ { NOWAIT | WAIT integer | SKIP LOCKED } ] ]
    [ row_limiting_clause ]

select_expr_list:
    table_name.*
    | table_alias_name.*
    | expr [ [ AS ] column_alias_name ]

from_list:
    DUAL
    | table_reference [, table_reference ... ]

table_reference:
    simple_table
    | joined_table
    | pivot_clause
    | unpivot_clause

simple_table:
    table_name [ table_alias_name ]
    | ( select_stmt ) [ table_alias_name ]
    | ( table_reference_list )

joined_table:
    table_reference [ INNER ] JOIN simple_table [ join_condition ]
    | table_reference outer_join_type JOIN simple_table join_condition

outer_join_type:
    { LEFT | RIGHT | FULL } [ OUTER ]

join_condition:
    ON expression

group_expression_list:
    group_expression [, group_expression ... ]

group_expression:
    expression

order_expression_list:
    order_expression [, order_expression ... ]

order_expression:
    expression [ ASC | DESC ]

row_limiting_clause:
    [ OFFSET offset { ROW | ROWS } ]
    [ FETCH { FIRST | NEXT } [ { rowcount } ] { ROW | ROWS } { ONLY } ]

pivot_clause:
    PIVOT (
        aggregate_function ( expr ) [ [ AS ] alias ]
        [, aggregate_function ( expr ) [ [ AS ] alias ] ... ]
        pivot_for_clause
        pivot_in_clause
    )

pivot_for_clause:
    FOR { column }

pivot_in_clause:
    IN (
        { { expr | ( expr [, expr ... ] ) } [ [ AS ] alias ] ... }
        [, { { expr | ( expr [, expr ... ] ) } [ [ AS ] alias ] ... } ]
    )

unpivot_clause:
    UNPIVOT (
        { column }
        pivot_for_clause
        unpivot_in_clause
    )

unpivot_in_clause:
    IN (
        { column | ( column [, column ... ] ) }
    )

操作模式

MERGE 语句支持以下操作组合:

  • 只更新(仅 WHEN MATCHED)

  • 只插入(仅 WHEN NOT MATCHED)

  • 更新 + 插入(同时包含 WHEN MATCHED 和 WHEN NOT MATCHED)

不支持的语法特性

  1. 带序列(sequence)的 INSERT 不准确

    Oracle 中使用 sequence.NEXTVAL 的 MERGE 语句转换不准确:

    MERGE INTO t1 t
    USING (
        SELECT seq_test.NEXTVAL AS new_id, dept_id
        FROM t2
    ) s
    ON (t.id = s.dept_id)
    WHEN NOT MATCHED THEN
        INSERT (id, department_id)
        VALUES (s.new_id, s.dept_id);
    

    限制说明:USING 子查询中的 sequence.NEXTVAL 无法被转换,所以查询结果可能不准确。

  2. 子查询后不能跟 PIVOT 或 UNPIVOT

    使用 PIVOT 或 UNPIVOT 的子查询作为 MERGE 的源数据时不支持:

    SELECT *
    FROM (
        SELECT emp_id, income_type, amount
        FROM t
    ) PIVOT (
        SUM(amount) FOR income_type IN ('BASE', 'BONUS')
    );
    

    限制说明:MERGE 的 USING 子句可以包含 PIVOT 或 UNPIVOT 操作,但 FROM 不能是子查询。

  3. UNPIVOT 中不能使用 AS 常量

    UNPIVOT 子句中不支持使用 AS 指定常量:

    UNPIVOT (
        amount FOR income_type IN (
            base_salary AS 'BASE',
            bonus AS 'BONUS'
        )
    )
    

    限制说明:UNPIVOT 的 IN 子句中不支持 AS '常量' 的写法。

  4. 不支持 FALSE 表达式 + DUAL + UPDATE 的 MERGE

    使用 DUAL 表和虚假条件(如 1 = 0)的 MERGE 语句不支持:

    MERGE INTO table t
    USING DUAL ON (1 = 0)
    WHEN NOT MATCHED THEN INSERT ...
    

    限制说明:当使用 DUAL 作为源表且条件永远为 FALSE 时,多发比对将无法匹配到有效结果。

2.7.2.1.2. SELECT 语句

(待详细补充...)

2.7.2.1.3. INSERT 语句

(待详细补充...)

2.7.2.1.4. UPDATE 语句

(待详细补充...)

2.7.2.1.5. DELETE 语句

(待详细补充...)