7.3 数据库特征

7.3.1 数据库功能

Table 7-2 数据库功能

数据库

纲要

视图

身份列

顺序

储存过程

函数

触发器

Instead of 触发器

IBM DB2 UDB 7

X

X

X

0

X1

X1

X

0

IBM DB2 UDB 8

X

X

X

0

X1

X1

X

X

Informix IDS 9

X

X

X2

0

X3

X

X

0

MS SQL 7

X

X

X

0

X

0

X

0

MS SQL 8

X

X

X

0

X

X

X

X

MySQL 4

0

0

X4

0

0

0

0

0

Oracle 8i、9i、10g

X

X

0

X

X

X

X

X

Postgres 7

X

X

X5

X

X

X

X6

X6

Sybase ASE 12

X

X

X

0

X

0

X

0

1 DB2 原本就支持以 Java 编写的储存过程或函数。 要使用本机 SQL 过程语言编写过程,请在数据库服务器上安装 C 编译器。

2 Informix 身份列关键字为 SERIAL8

3 Informix 储存过程无法返回值。

4 MySQL 身份列关键字为 AUTO_INCREMENT

5 可以使用 Postgres 顺序对象为主键列提供默认值,从而有效地模拟身份列。

Postgres 有一个称为《规则》的本机构造。 可以使用该构造有效地模拟触发器和 Instead of 触发器。 该构造还支持使用以各种过程编程语言编写的触发器或 Instead of 触发器。

7.3.2 当前时戳语句

下表列出了用于按数据库检索当前日期和时间的 SQL 语句:

Table 7-3 时戳语句

数据库

当前时戳语句

ANSI 兼容

IBM DB2 UDB

SELECT (CURRENT TIMESTAMP) FROM SYSIBM.SYSDUMMY1 FETCH FIRST 1 ROW ONLY

Informix IDS

SELECT FIRST 1 (CURRENT YEAR TO FRACTION(5)) FROM INFORMIX.SYSTABLES

MSSQL

SELECT (CURRENT_TIMESTAMP)

MySQL

SELECT (CURRENT_TIMESTAMP)

Oracle

SELECT (SYSDATE) FROM SYS.DUAL

PostgreSQL

SELECT (CURRENT_TIMESTAMP)

Sybase ASE

SELECT GETDATE()

7.3.3 储存过程和函数 JDBC 调用语法

下表列出了用于调用储存过程或函数的 SQL 语法。 该语法可用于格式化嵌入式 SQL 语句中的过程和函数调用。

Table 7-4 调用储存过程或函数

数据库

储存过程/函数 JDBC 调用语法

IBM DB2 UDB

{call schema-name.procedure-name(parameter-list)}

Informix IDS

EXECUTE [PROCEDURE | FUNCTION] schema-name.routine-name(parameter-list)

MSSQL

EXECUTE schema-name.procedure-name(parameter-list)

MySQL

(NA)

Oracle1

CALL schema-name.procedure-name(parameter-list)

PostgreSQL

SELECT schema-name.procedure-name(parameter-list)

Sybase ASE

EXECUTE schema-name.procedure-name(parameter-list)

1 Oracle 的 JDBC 实现不支持将函数作为一个字符串来调用。

7.3.4 Left Outer Join 运算符

下表按数据库列出外部连接运算符。

Table 7-5 外部连接运算符

数据库

Left Outer Join 运算符

ANSI 兼容

IBM DB2 UDB

LEFT OUTER JOIN

Informix IDS

LEFT OUTER JOIN

MSSQL

*=

MySQL

LEFT OUTER JOIN

Oracle

(+)

PostgreSQL

LEFT OUTER JOIN

Sybase ASE

*=

NOTE:从版本 10g 开始,Oracle 支持与 ANSI 兼容的 LEFT OUTER JOIN 运算符。

7.3.5 未定界标识符的大小写问题

Table 7-6 未定界标识符的大小写问题

数据库

是否区分大小写?

IBM DB2 UDB

Informix IDS

MSSQL

MySQL

Oracle

PostgreSQL

Sybase ASE

7.3.6 支持的事务隔离级别

Table 7-7 支持的事务隔离级别

数据库

未提交的读

提交的读

可重复读

可序列化

URL

IBM DB2 UDB

0

X

X1

X

X

设置 JDBC 事务隔离级别

MySQL(InnoDB 表类型)

0

X

X

X1

X

InnoDB 事务隔离级别

Oracle

0

0

x、1.

0

X

JDBC 事务优化

PostgreSQL

0

02

X1

02

X

事务隔离

1 这是该数据库的默认隔离级别。 2 可对其进行设置,但是它将化名为支持的隔离级别。

7.3.7 提交关键字

下表确定支持的数据库的提交关键字:

Table 7-8 提交关键字

数据库

提交关键字

IBM DB2 UDB

COMMIT

Informix IDS

COMMIT WORK1

MSSQL

GO

MySQL

COMMIT

Oracle

COMMIT

PostgreSQL

COMMIT

Sybase ASE

GO

1 用于日志记录数据库和 ANSI 兼容的数据库。 非日志记录数据库不支持事务。

7.3.8 IBM DB2 通用数据库 (UDB)

下表列出了该数据库的属性。

Table 7-9 IBM DB2 UDB 的属性

属性

当前时戳语句

SELECT (CURRENT TIMESTAMP) FROM SYSIBM.SYSDUMMY1 FETCH FIRST 1 ROW ONLY

储存过程/函数调用语法

{call schema-name.procedure-name(parameter-list)}

是否区分大小写?

提交关键字

COMMIT

Left Outer Join Operator

LEFT OUTER JOIN

动态默认值

下表列出 Driver for JDBC 在运行时隐式设置的数据库兼容性参数。 不要显式覆盖这些设置。

Table 7-10 动态配置的 IBM DB2 通用数据库设置

显示名称

标签名称

当前时戳语句:

current-timestamp-stmt

SELECT (CURRENT TIMESTAMP) FROM SYSIBM.SYSDUMMY1 FETCH FIRST 1 ROW ONLY

时戳转换程序类:

time-translator-class

com.novell.nds.dirxml.driver.jdbc.db.DB2Timestamp

已知问题

7.3.9 Informix 动态服务器 (IDS)

下表列出了该数据库的属性。

Table 7-11 Informix 动态服务器的设置

属性

当前时戳语句

SELECT FIRST 1 (CURRENT YEAR TO FRACTION(5)) FROM INFORMIX.SYSTABLES

储存过程/函数调用语法

EXECUTE [PROCEDURE | FUNCTION] schema-name.procedure-name(parameter-list)

是否区分大小写?

提交关键字

COMMIT WORK1

Left Outer Join Operator

LEFT OUTER JOIN

1 用于日志记录数据库和 ANSI 兼容的数据库。 非日志记录数据库不支持事务。

动态默认值

下表列出 Driver for JDBC 在运行时隐式设置的数据库兼容性参数。 不要显式重写这些设置。

Table 7-12 动态配置的 Informix 动态服务器设置

显示名称

标签名称

当前时戳语句:

current-timestamp-stmt

SELECT FIRST 1 (CURRENT YEAR TO FRACTION(5)) FROM INFORMIX.SYSTABLES

已知问题

  • 除非在创建表时将小数位数(小数点右边的位数)显式设置为 0,否则不能将 NUMERICDECIMAL 列用作主键。 默认情况下,小数位数设置为 255。

7.3.10 Microsoft SQL Server

下表列出了该数据库的属性:

Table 7-13 Microsoft SQL Server 的设置

属性

当前时戳语句

SELECT (CURRENT_TIMESTAMP)

储存过程/函数调用语法

EXECUTE schema-name.procedure-name(parameter-list)

是否区分大小写?

提交关键字

GO

Left Outer Join Operator

*=

动态默认值

下表列出 Driver for JDBC 在运行时隐式设置的数据库兼容性参数。 不要显式重写这些设置。

Table 7-14 动态配置的 Microsoft SQL Server 设置

显示名称

标签名称

Add default values on insert?

add-default-values-on-view-insert

true

Left outer-join operator:

left-outer-join-operator

*=

7.3.11 MySQL

下表列出了该数据库的属性。

Table 7-15 MySQL 的设置

属性

当前时戳语句

SELECT (CURRENT_TIMESTAMP)

储存过程/函数调用语法

(NA)

是否区分大小写?

提交关键字

COMMIT

Left Outer Join Operator

LEFT OUTER JOIN

动态默认值

下表列出在运行时为该数据库动态配置的数据库兼容性参数。

Table 7-16 动态配置的 MySQL 设置

显示名称

标签名称

是否支持元数据检索中的纲要?

supports-schemas-in-metadata-retrieval

false

已知问题

  • 最初将 TIMESTAMP 列设置为 0 或 NULL 后,更新时该列将始终设置为当前日期和时间。 为了对该行为进行补偿,建议将 Identity Vault 时间和时戳语法映射到 DATETIME 列。

7.3.12 Oracle

下表列出了该数据库的属性:

Table 7-17 Oracle 设置

属性

当前时戳语句

SELECT (SYSDATE) FROM SYS.DUAL

储存过程/函数调用语法

CALL schema-name.procedure-name(parameter-list)

是否区分大小写?

提交关键字

COMMIT

Left Outer Join Operator

(+)

动态默认值

下表列出 Driver for JDBC 在运行时隐式设置的数据库兼容性参数。 不要显式重写这些设置。

Table 7-18 动态配置的 Oracle 设置

显示名称

标签名称

Left outer-join operator

left-outer-join-operator

(+)

Exclude filter expression

exclude-table-filter

BIN\$.{22}==\$0

Lock statement generator class

lock-generator-class

com.novell.nds.dirxml.driver.jdbc.db.lock.OraLockGenerator

NOTE:默认的排除过滤器用于从同步纲要中省略 Oracle 10g 中可见的已丢弃表。

限制

  • 触发器中不能参照 LONGLONG RAWBLOB 列。 不能在触发器(包括 Instead of 触发器)中使用 :NEW 限定符参照这些类型的列。

7.3.13 PostgreSQL

下表列出了该数据库的属性:

Table 7-19 PostgreSQL 的设置

属性

当前时戳语句

SELECT (CURRENT_TIMESTAMP)

储存过程/函数调用语法

SELECT schema-name.procedure-name(parameter-list)

是否区分大小写?

提交关键字

COMMIT

Left Outer Join Operator

LEFT OUTER JOIN

已知问题

  • PostgreSQL 不支持 <check-object-password> 事件。 通过将项手动插入到 pg_hba.conf 文件来控制鉴定。

7.3.14 Sybase Adaptive Server Enterprise (ASE)

下表列出了该数据库的属性:

Table 7-20 Sybase ASE 的设置

属性

当前时戳语句

SELECT GETDATE()

储存过程/函数调用语法

EXECUTE schema-name.procedure-name(parameter-list)

是否区分大小写?

提交关键字

GO

Left Outer Join Operator

*=

动态默认值

下表列出 Driver for JDBC 在运行时隐式设置的数据库兼容性参数。 不要显式重写这些设置。

Table 7-21 动态配置的 Sybase ASE 设置

显示名称

标签名称

Current timestamp statement

current-timestamp-stmt

SELECT GETDATE()

Left outer-join operator

left-outer-join-operator

*=

Timestamp Translator class

time-translator-class

com.novell.nds.dirxml.driver.jdbc.db.SybaseTimestamp

已知问题

  • 将填充和截断二进制值。

    要确保对二进制值发生 ANSI 兼容的填充和截断行为,请确保二进制列类型(不是 IMAGE)符合以下准则:

    • 这些类型的大小正好是映射到它们的 eDirectory™ 特性的大小。
    • 这些类型带有限制 NOT NULL
    • 这些类型将添加到发布者和订购者创建策略。

    如果这些类型带有限制 NULL,则对于 eDirectory 来说很重要的尾随零将被截断。 如果二进制列的大小超出各自的 eDirectory 特性的大小,则对值追加额外的 0。

    建议的解决方案是同步二进制值时只使用 IMAGE 数据类型。

  • DATETIME 分之一秒将被舍入。 Sybase 时戳最多可精确到 1/300 秒(约 0.003 秒)。 数据库服务器将舍入至最接近的 1/300 秒,而不是最接近的 1/1000 秒(0.001 秒或 1 毫秒)。
  • 时戳格式为专有格式。