SQL 方言
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
尽管jOOQ尽量代表SQL标准,但许多功能都是特定于给定数据库及其“SQL方言”的。 jOOQ使用org.jooq.SQLDialect
枚举类型对此进行建模。
SQL方言是配置的主要属性之一。 从DSLContext创建的查询在渲染SQL和绑定绑定值时,将采用特定于方言的行为。
jOOQ API的某些部分仅由受支持的SQL方言的给定子集正式支持。 例如,Oracle CONNECT BY子句由Oracle和Informix数据库支持,并使用org.jooq.Support
注解进行注解,如下所示
/** * Add an Oracle-specific <code>CONNECT BY</code> clause to the query */ @Support({ SQLDialect.INFORMIX, SQLDialect.ORACLE }) SelectConnectByConditionStep<R> connectBy(Condition condition);
未用org.jooq.Support
注解进行注解的jOOQ API方法,或者使用Support注解进行了注解,但没有任何SQL方言的jOOQ API方法,可以在所有SQL方言中安全使用。 这方面的一个例子是SELECT语句工厂方法
/** * Create a new DSL select statement. */ @Support SelectSelectStep<R> select(Field<?>... fields);
jOOQ的SQL子句模拟功能
上述Support注解不仅指定哪些数据库本机支持某个功能。 它还指示jOOQ为某些缺少此功能的数据库模拟该功能。 这方面的一个例子是DISTINCT谓词,这是由SQL:1999定义的谓词语法,仅由H2、HSQLDB和Postgres实现
A IS DISTINCT FROM B
然而,jOOQ在所有方言中都支持IS DISTINCT FROM
谓词,因为它的语义可以用等效的CASE表达式来表达。 更多详细信息,请参见手册中关于DISTINCT谓词的部分。
jOOQ和Oracle SQL方言
Oracle SQL比许多其他SQL方言更具表现力。 它具有许多SQL标准范围之外的独特关键字、子句和函数。 以下是一些例子
- CONNECT BY子句,用于分层查询
- PIVOT关键字,用于创建PIVOT表
- 包,面向对象的用户定义类型,成员过程,如关于存储过程和函数的部分所述
- 高级分析函数,如关于窗口函数的部分所述
jOOQ与Oracle的SQL扩展有着历史渊源。 如果Oracle SQL中支持某些功能,则它很有可能进入jOOQ API
反馈
您对此页面有任何反馈吗? 我们很乐意听到!