Derby リファレンスマニュアル
Version 10.4
Derby Document build:
August 10, 2009, 1:12:00 PM (PDT)
Version 10.4 Derby リファレンスマニュアル
Contents
Copyright •
License •
この文書について •
この文書の目的 •
この文書の読者 •
この文書の構成 •
SQL言語のリファレンス •
大文字小文字と特殊文字 •
SQLの識別子 •
SQL92識別子の規則 •
SQL92識別子 •
列名 •
相関名 •
新しい表名 •
スキーマ名 •
単純列名 •
別名 •
表名 •
ビュー名 •
索引名 •
制約名 •
カーソル名 •
TriggerName •
認証識別子 •
文 •
依存関係 •
ALTER TABLE 文 •
CALL (手続き) 文 •
CREATE 文 •
DECLARE GLOBAL TEMPORARY TABLE 文 •
DELETE 文 •
DROP文 •
GRANT 文 •
INSERT 文 •
LOCK TABLE 文 •
RENAME 文 •
REVOKE 文 •
SET 文 •
SELECT 文 •
UPDATE文 •
SQL 節 •
CONSTRAINT 節 •
FOR UPDATE 節 •
FROM 節 •
GROUP BY 節 •
HAVING 節 •
ORDER BY 節 •
WHERE 節 •
WHERE CURRENT OF 節 •
SQL式 •
選択式 •
TableExpression •
VALUES式 •
式に関する優先順位 •
真偽式 •
動的パラメータ •
JOIN 演算 •
INNER JOIN 演算 •
LEFT OUTER JOIN演算 •
RIGHT OUTER JOIN 演算 •
SQL 問い合わせ •
問合せ •
スカラー副問合せ •
表副問合せ •
組み込み関数 •
標準組込み関数 •
集約 (集合関数) •
ABSとABSVAL関数 •
ACOS 関数 •
ASIN 関数 •
ATAN 関数 •
AVG関数 •
BIGINT関数 •
CASE 式 •
CAST 関数 •
CEILおよびCEILING関数 •
CHAR 関数 •
Concatenation •
COS 関数 •
COUNT 関数 •
COUNT(*) 関数 •
CURRENT DATE 関数 •
CURRENT_DATE関数 •
CURRENT ISOLATION 関数 •
CURRENT SCHEMA関数 •
CURRENT TIME •
CURRENT_TIME関数 •
CURRENT TIMESTAMP関数 •
CURRENT_TIMESTAMP関数 •
CURRENT_USER関数 •
DATE関数 •
DAY 関数 •
DEGREES 関数 •
DOUBLE関数 •
EXP関数 •
FLOOR関数 •
HOUR関数 •
IDENTITY_VAL_LOCAL関数 •
INTEGER関数 •
LCASEあるいはLOWER関数 •
LENGTH関数 •
LNあるいはLOG関数 •
LOG10 関数 •
LOCATE関数 •
LTRIM関数 •
MAX関数 •
MIN関数 •
MINUTE 関数 •
MOD関数 •
MONTH関数 •
NULLIF式 •
PI 関数 •
RADIANS 関数 •
RTRIM関数 •
SECOND関数 •
SESSION_USER関数 •
SIN 関数 •
SMALLINT関数 •
SQRT関数 •
SUBSTR関数 •
SUM関数 •
TAN 関数 •
TIME 関数 •
TIMESTAMP関数 •
TRIM 関数 •
UCASE関数およびUPPER関数 •
USER関数 •
VARCHAR関数 •
XMLEXISTS 演算子 •
XMLPARSE演算子 •
XMLQUERY演算子 •
XMLSERIALIZE 演算子 •
YEAR関数 •
組込みシステム関数 •
SYSCS_UTIL.SYSCS_CHECK_TABLEシステム関数 •
SYSCS_UTIL.SYSCS_GET_DATABASE_PROPERTYシステム関数 •
SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS システム関数 •
組み込みシステム手続き •
SYSCS_DIAG 診断表および関数 •
データ型 •
SQL予約語 •
DerbyのサポートするSQL-92の機能 •
Derbyのシステム表 •
SYSALIASES システム表 •
SYSCHECKSシステム表 •
SYSCOLPERMS システム表 •
SYSCOLUMNSシステム表 •
SYSCONGLOMERATES システム表 •
SYSCONSTRAINTS システム表 •
SYSDEPENDS システム表 •
SYSFILESシステム表 •
SYSFOREIGNKEYSシステム表 •
SYSKEYSシステム表 •
SYSROUTINEPERMS システム表 •
SYSSCHEMAS システム表 •
SYSSTATISTICSシステム表 •
SYSSTATEMENTSシステム表 •
SYSTABLEPERMS システム表 •
SYSTABLES システム表 •
SYSTRIGGERSシステム表 •
SYSVIEWS システム表 •
Derbyの例外メッセージとSQL state •
SQLのエラーメッセージと例外 •
JDBC リファレンス •
java.sqlにある、JDBCの主なクラス、 インターフェイス、メソッド •
java.sql.Driverインターフェイス •
java.sql.DriverManager.getConnection メソッド •
java.sql.Connection インターフェイス •
java.sql.DatabaseMetaData インターフェイス •
java.sql.Statementインターフェイス •
java.sql.CallableStatement インターフェイス •
java.sql.SQLException クラス •
java.sql.PreparedStatementインターフェイス •
java.sql.ResultSet インターフェイス •
java.sql.ResultSetMetaData インターフェイス •
java.sql.SQLWarning クラス •
java.sql.SQLXMLインターフェイス •
SQL型とjava.sql.Typesの対応 •
JDBC 2.0 の機能 •
java.sql.Connection インターフェイス: JDBC 2.0で利用可能なメソッド •
java.sql.DatabaseMetaData インターフェイス: 利用可能なJDBC 2.0のメソッド •
java.sql.PreparedStatementインターフェイス: JDBC2.0で提供されるメソッド •
java.sql.ResultSet •
java.sql.ResultSetMetaData インターフェイス: JDBC 2.0で利用可能なメソッド •
java.sql.Statement インターフェイス: 利用可能なJDBC 2.0のメソッド •
java.sql.BatchUpdateException クラス •
Connected Device ConfigurationおよびFoundation Profile向けのJDBCパッケージ(JSR169) •
JDBC 3.0の機能 •
java.sql.Connectionインターフェイス: JDBC3.0にて利用可能なメソッド •
java.sql.DatabaseMetaData インターフェイス: JDBC 3.0で利用可能なメソッド •
java.sql.ParameterMetaDataインターフェイス:JDBC3.0で利用可能なメソッド •
java.sql.PreparedStatementインターフェイス: JDBC3.0で利用可能なメソッド •
java.sql.Savepoint インターフェイス •
java.sql.Statementインターフェイス: JDBC 3.0で利用可能なメソッド •
JDBC 4.0の機能 •
洗練されたSQLExceptionのサブクラス •
java.sql.Connectionインターフェイス:JDBC4.0で提供される機能 •
java.sql.DatabaseMetaDataインターフェイス: JDBC4.0の機能 •
java.sql.Statementインターフェイス: JDBC 4.0で利用可能な機能 •
javax.sql.DataSource インターフェイス: JDBC 4.0の機能 •
JDBCエスケープの構文 •
呼び出し文のJDBCエスケープキーワード •
JDBCエスケープ構文 •
LIKE節のJDBCエスケープ構文 •
fnキーワードを使ったJDBCエスケープ構文 •
外部結合のJDBCエスケープ構文 •
時刻書式のJDBCエスケープ構文 •
日付書式のJDBCエスケープ構文 •
タイムスタンプ書式のJDBCエスケープ構文 •
データベース接続URLに属性を指定する。 •
bootPassword=key属性 •
collation=collation 属性 •
create=true 属性 •
createFrom=Path属性 •
databaseName=nameofDatabase属性 •
dataEncryption=true属性 •
encryptionKey=key属性 •
encryptionProvider=providerName属性 •
encryptionAlgorithm=algorithm 属性 •
logDevice=logDirectoryPath 属性 •
newEncryptionKey=key 属性 •
newBootPassword=newPassword 属性 •
password=userPassword •
restoreFrom=path属性 •
rollForwardRecoveryFrom=path 属性 •
shutdown=true属性 •
territory=ll_CC 属性 •
traceDirectory=path 属性 •
traceFile=path 属性 •
traceFileAppend=true 属性 •
traceLevel=value 属性 •
upgrade=true attribute •
user=userName 属性 •
ssl=sslMode 属性 •
属性を指定せずにデータベースに接続する •
J2EEへの準拠:Java Transaction APIとjavax.sql インターフェイス •
JTA API •
製品に関する但し書き •
javax.sql:JDBCインターフェイス •
Derby API •
スタンドアローンのツールとユーティリティ •
JDBCの実装クラス •
JDBC driver •
データソースのクラス •
ユーティリティ的なインターフェイス •
利用可能な地域情報 •
Derbyの制限事項 •
データベース設定値の制限 •
DATE、TIMEとTIMESTAMPの制限 •
識別子の長さ制限 •
数値の制限 •
並びの制限 •
XMLの制限 •
Trademarks •
•
Derby リファレンスマニュアル
Apache Software FoundationDerby リファレンスマニュアルApache Derby
Copyright
Copyright 2004-2008 The Apache Software Foundation
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
Related information
License
License
The Apache License, Version 2.0

                                   Apache License
                               Version 2.0, January 2004
                            http://www.apache.org/licenses/

       TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

       1. Definitions.

          "License" shall mean the terms and conditions for use,
          reproduction, and distribution as defined by Sections 1 through
          9 of this document.

          "Licensor" shall mean the copyright owner or entity authorized
          by the copyright owner that is granting the License.

          "Legal Entity" shall mean the union of the acting entity and all
          other entities that control, are controlled by, or are under
          common control with that entity. For the purposes of this
          definition, "control" means (i) the power, direct or indirect,
          to cause the direction or management of such entity, whether by
          contract or otherwise, or (ii) ownership of fifty percent (50%)
          or more of the outstanding shares, or (iii) beneficial ownership
          of such entity.

          "You" (or "Your") shall mean an individual or Legal Entity
          exercising permissions granted by this License.

          "Source" form shall mean the preferred form for making
          modifications, including but not limited to software source code,
          documentation source, and configuration files.

          "Object" form shall mean any form resulting from mechanical
          transformation or translation of a Source form, including but
          not limited to compiled object code, generated documentation,
          and conversions to other media types.

          "Work" shall mean the work of authorship, whether in Source or
          Object form, made available under the License, as indicated by a
          copyright notice that is included in or attached to the work
          (an example is provided in the Appendix below).

          "Derivative Works" shall mean any work, whether in Source or
          Object form, that is based on (or derived from) the Work and
          for which the editorial revisions, annotations, elaborations,
          or other modifications represent, as a whole, an original work
          of authorship.  For the purposes of this License, Derivative
          Works shall not include works that remain separable from, or
          merely link (or bind by name) to the interfaces of, the Work
          and Derivative Works thereof.

          "Contribution" shall mean any work of authorship, including
          the original version of the Work and any modifications or
          additions to that Work or Derivative Works thereof, that is
          intentionally submitted to Licensor for inclusion in the Work
          by the copyright owner or by an individual or Legal Entity
          authorized to submit on behalf of the copyright owner. For the
          purposes of this definition,
          "submitted" means any form of electronic, verbal, or written
          communication sent to the Licensor or its representatives,
          including but not limited to communication on electronic mailing
          lists, source code control systems, and issue tracking systems
          that are managed by, or on behalf of, the Licensor for the
          purpose of discussing and improving the Work, but excluding
          communication that is conspicuously marked or otherwise
          designated in writing by the copyright owner as "Not a
          Contribution."

          "Contributor" shall mean Licensor and any individual or Legal
          Entity on behalf of whom a Contribution has been received by
          Licensor and subsequently incorporated within the Work.

       2. Grant of Copyright License. Subject to the terms and conditions
          of this License, each Contributor hereby grants to You a
          perpetual, worldwide, non-exclusive, no-charge, royalty-free,
          irrevocable copyright license to reproduce, prepare Derivative
          Works of, publicly display, publicly perform, sublicense, and
          distribute the Work and such Derivative Works in Source or
          Object form.

       3. Grant of Patent License. Subject to the terms and conditions of
          this License, each Contributor hereby grants to You a perpetual,
          worldwide, non-exclusive, no-charge, royalty-free, irrevocable
          (except as stated in this section) patent license to make, have
          made, use, offer to sell, sell, import, and otherwise transfer
          the Work, where such license applies only to those patent claims
          licensable by such Contributor that are necessarily infringed by
          their Contribution(s) alone or by combination of their
          Contribution(s) with the Work to which such Contribution(s) was
          submitted. If You institute patent litigation against any entity
          (including a cross-claim or counterclaim in a lawsuit) alleging
          that the Work or a Contribution incorporated within the Work
          constitutes direct or contributory patent infringement, then any
          patent licenses granted to You under this License for that Work
          shall terminate as of the date such litigation is filed.

       4. Redistribution. You may reproduce and distribute copies of the
          Work or Derivative Works thereof in any medium, with or without
          modifications, and in Source or Object form, provided that You
          meet the following conditions:

          (a) You must give any other recipients of the Work or
              Derivative Works a copy of this License; and

          (b) You must cause any modified files to carry prominent notices
              stating that You changed the files; and

          (c) You must retain, in the Source form of any Derivative Works
              that You distribute, all copyright, patent, trademark, and
              attribution notices from the Source form of the Work,
              excluding those notices that do not pertain to any part of
              the Derivative Works; and

          (d) If the Work includes a "NOTICE" text file as part of its
              distribution, then any Derivative Works that You distribute
              must include a readable copy of the attribution notices
              contained within such NOTICE file, excluding those notices
              that do not pertain to any part of the Derivative Works, in
              at least one of the following places: within a NOTICE text
              file distributed as part of the Derivative Works; within the
              Source form or documentation, if provided along with the
              Derivative Works; or, within a display generated by the
              Derivative Works, if and wherever such third-party notices
              normally appear. The contents of the NOTICE file are for
              informational purposes only and do not modify the License.
              You may add Your own attribution notices within Derivative
              Works that You distribute, alongside or as an addendum to
              the NOTICE text from the Work, provided that such additional
              attribution notices cannot be construed as modifying the
              License.

          You may add Your own copyright statement to Your modifications
          and may provide additional or different license terms and
          conditions for use, reproduction, or distribution of Your
          modifications, or for any such Derivative Works as a whole,
          provided Your use, reproduction, and distribution of the Work
          otherwise complies with the conditions stated in this License.

       5. Submission of Contributions. Unless You explicitly state
          otherwise, any Contribution intentionally submitted for
          inclusion in the Work by You to the Licensor shall be under the
          terms and conditions of this License, without any additional
          terms or conditions.  Notwithstanding the above, nothing herein
          shall supersede or modify the terms of any separate license
          agreement you may have executed with Licensor regarding such
          Contributions.

       6. Trademarks. This License does not grant permission to use the
          trade names, trademarks, service marks, or product names of the
          Licensor, except as required for reasonable and customary use
          in describing the origin of the Work and reproducing the content
          of the NOTICE file.

       7. Disclaimer of Warranty. Unless required by applicable law or
          agreed to in writing, Licensor provides the Work (and each
          Contributor provides its Contributions) on an "AS IS" BASIS,
          WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
          implied, including, without limitation, any warranties or
          conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or
          FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for
          determining the appropriateness of using or redistributing the
          Work and assume any risks associated with Your exercise of
          permissions under this License.

       8. Limitation of Liability. In no event and under no legal theory,
          whether in tort (including negligence), contract, or otherwise,
          unless required by applicable law (such as deliberate and
          grossly negligent acts) or agreed to in writing, shall any
          Contributor be liable to You for damages, including any direct,
          indirect, special, incidental, or consequential damages of any
          character arising as a result of this License or out of the use
          or inability to use the Work (including but not limited to
          damages for loss of goodwill, work stoppage, computer failure or
          malfunction, or any and all other commercial damages or losses),
          even if such Contributor has been advised of the possibility of
          such damages.

       9. Accepting Warranty or Additional Liability. While redistributing
          the Work or Derivative Works thereof, You may choose to offer,
          and charge a fee for, acceptance of support, warranty, indemnity,
          or other liability obligations and/or rights consistent with this
          License. However, in accepting such obligations, You may act only
          on Your own behalf and on Your sole responsibility, not on behalf
          of any other Contributor, and only if You agree to indemnify,
          defend, and hold each Contributor harmless for any liability
          incurred by, or claims asserted against, such Contributor by
          reason of your accepting any such warranty or additional
          liability.

       END OF TERMS AND CONDITIONS

       APPENDIX: How to apply the Apache License to your work.

          To apply the Apache License to your work, attach the following
          boilerplate notice, with the fields enclosed by brackets "[]"
          replaced with your own identifying information. (Don't include
          the brackets!)  The text should be enclosed in the appropriate
          comment syntax for the file format. We also recommend that a
          file or class name and description of purpose be included on the
          same "printed page" as the copyright notice for easier
          identification within third-party archives.

       Copyright [yyyy] [name of copyright owner]

       Licensed under the Apache License, Version 2.0 (the "License");
       you may not use this file except in compliance with the License.
       You may obtain a copy of the License at

           http://www.apache.org/licenses/LICENSE-2.0

       Unless required by applicable law or agreed to in writing, software
       distributed under the License is distributed on an "AS IS" BASIS,
       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
       implied.  See the License for the specific language governing
       permissions and limitations under the License.

この文書について
Derbyの文書については、はじめてのDerbyを参照してください。文書の一覧や、文書の体裁上の取り決め、詳細が書かれています。
この文書の目的
このDerby リファレンスマニュアルは、Derbyのリファレンスです。 この文書には、DerbyのSQL言語や、DerbyにおけるJDBCの実装、Derbyのシステムカタログ、Derbyのエラーメッセージ、Derbyの属性や、SQLのキーワードの説明があります。
この文書の読者
この文書は、Derbyを使う人のためのリファレンスです。特にアプリケーションの開発者に向けて書かれています。 SQLの標準やJavaというプログラミング言語に慣れていないDerbyのユーザは、このリファレンスの対応する項目を読めば得られる情報があるでしょう。
「Derbyで、こういうことをするにはどうすればよいのか」とか、Derbyの概念とかを知りたいならば、Derby ディベロッパーズ ガイドを読むと良いでしょう。
この文書の構成
この文書には以下の節があります。

• |  | SQL言語のリファレンス DerbyのSQL言語のリファレンスです。 文、関数、そのほかの構文上の情報が書かれています。
• |  | SQL予約語 SQL-92標準外の、SQLのキーワードを説明します。
• |  | DerbyのサポートするSQL-92の機能 SQL-92の機能のうち、Derbyが実現しているものと実現していないものを一覧します。
• |  | Derbyのシステム表 Derbyのシステムカタログのリファレンスです。
• |  | Derbyの例外メッセージとSQL state Derbyの例外メッセージについての情報が書かれています。
• |  | JDBC リファレンス Derbyが実装するJDBCのインターフェイスの情報がJDBC 2.0 の機能も含めて書かれています。
• |  | データベース接続URLに属性を指定する。 DerbyのJDBCデータベース接続URLにおいて、実現されている属性の情報が書かれています。
• |  | J2EEへの準拠:Java Transaction APIとjavax.sql インターフェイス Java Transaction APIにおいて、Derbyが実現している機能について書かれています。
• |  | Derby API Derby独自のAPIについての説明があります。

SQL言語のリファレンス
DerbyはSQL-92のうち主要な機能のサブセットおよび、幾つかのSQL-99の機能を実現しています。
この節では、文、組み込み関数、データ型、式、特殊文字などの説明を通して、SQL言語の概観を紹介します。
大文字小文字と特殊文字
JDBCのクラスやメソッドにSQL文の文字列を渡して、DerbyにSQLを発行することができます。 SQL文の文字列に可能な文字セットはUnicodeです。この文字列には、次の規則が適用されます。

• |  | 二重引用符でSQL-92に定義されている特殊識別子をデリミトして、デリミトされた識別子とすることができます。
• |  | 一重引用符で文字の列を区切ることができます。
• |  | 文字の列にて一重引用符またはアポストロフィーをあらわすには、一重引用符を2つ並べます。(言い方を変えれば、一重引用符は一重引用符のエスケープ文字です。) 二重引用符にはエスケープ文字が必要ではありません。二重引用符をあらわすには、単に二重引用符を使ってください。ただし、Javaのプログラムでは、二重引用符はバックスラッシュによるエスケープが必要であることを気に留める必要があります。 例:
    -- 一重引用符はエスケープ文字です-- 一重引用符に対して

    VALUES 'Joe''s umbrella'
    -- ijでは二重引用符はエスケープされません。
    VALUES 'He said, "hello!"'

    n = stmt.executeUpdate(
        "UPDATE aTable setStringcol = 'He said, \"hello!\"'");
• |  | SQLのキーワードは大文字小文字を区別しません。例えば、SELECTというキーワードは、SELECT、Select、select、sELECTのいずれでも書くことができます。
• |  | SQL-92の書き方による識別子は大文字小文字を区別しません。(SQL92識別子を参照してください。)ただしデリミトされた識別子はそうではありません。
• |  | Javaの書き方による識別子は常に大文字小文字を区別します。
• |  | *は、SelectExpression.にてワイルドカード文字です。ワイルドカードの*を参照してください。 この文字は同時に情報演算子でもあります。そのほかの場合この文字は、0回以上の繰り返しを表す、構文のメタ文字です。
• |  | %と_は、LIKE演算子に続く文字の列にて使われると、ワイルドカード文字となります。(これはエスケープされなかった場合です。)詳細は真偽式を参照してください。
• |  | SQL-92の仕様に沿って一行あるいは複数行のコメントを書くことができます。一行のコメントは二つのダッシュ(--)で始まり改行文字で終わります。複数行の改行は前後を囲う書き方で、スラッシュ・スター(/*)で始まり、スター・スラッシュ(*/)で終わります。この書き方では入れ子となる場合があることを留意してください。コメントの開始文字と終了文字の間にある、あらゆる文字は無視されます。

SQLの識別子
識別子とは、ある言語においてキーワードやコマンドとは異なる、ユーザが作成した情報をあらわすものです。識別子は表、ビュー、索引、列、制約のような、ユーザがデータベースに作成したディクショナリの情報をあらわすことがあります。ここで、これらの情報をディクショナリの情報とわれわれが呼ぶのは、Derbyがデータディクショナリとも呼ばれる、システム表にこれらの情報を記録するからです。 SQLの仕様は、こういった情報を特定の文で別名により扱う方法を用意しています。
識別子は、その種類に応じてそれぞれの規則にそっていなければなりません。ディクショナリの情報の識別子の場合、SQL-92が定義する識別子の規則に沿わなければなりません。このことより、ディクショナリの情報の識別子のことをSQL92識別子と呼びます。.
SQL92識別子の規則
通常の識別子は二重引用符によって囲われていません。デリミトされた識別子は二重引用符によって囲まれています。
通常の識別子は文字で始まり、文字、アンダースコア(_)、0-9の数字しか含みません。ここで文字と0-9の数字とは、Unicodeの全文字と0-9の数字を含みますが、Derbyは、識別子を構成する文字がデータベースのロケールで利用可能であることを保障するものではありません。
デリミトされた識別子は二重引用符の間にどのような文字でも持つことができます。 また識別氏を囲う二重引用符は、識別子の始まりと終わりを明示しているだけであり、それ自身は識別子とみなされません。またデリミトされた識別子の最後にある空白文字列は、無視されて切り捨てられます。Derbyはデリミトされた識別子にある連続した二つの二重引用符を、ひとつの二重引用符とみなします。このみなされた二重引用符はデリミトされた識別子の一部として扱われます。
デリミトされた識別子の中のピリオドはディクショナリの情報をあらわす識別子の一部であり、識別子の間の区切りではありません。
ですから、次の例にて、

    "A.B"

は、ディクショナリの情報ですが、

    "A"."B"

は、他のディクショナリの情報で限定されたディクショナリの情報です。(つまり、A表のB列としてあらわされた情報であるということです。)
SQL92識別子
SQL92識別子とは、SQL-92に沿ってディクショナリの情報をあらわす識別子です。SQL-92では、ディクショナリの情報をあらわす識別子は、128文字以内かつ(二重引用符によりデリミトされていなければ)システムにより大文字への変換が行われるため、大文字小文字が区別されないことになっています。また、デリミトされない限り識別子とはできない予約語があります。もし128文字以上の名前を使おうとすると、SQLException X0X11が挙がります。
Derbyには、SQL-92で定められている以外にもキーワードがあります。(SQL予約語を参照。)
例

    -- この例ではシステムカタログに格納されビュー名は
    -- ANIDENTIFIERです。
    CREATE VIEW AnIdentifier (RECEIVED) AS VALUES 1
    -- この例ではシステムカタログに格納されたビュー名の
    -- 大文字小文字は損なわれません。
    CREATE VIEW "ACaseSensitiveIdentifier" (RECEIVED) AS VALUES 1

以降の節にて、SQL92識別子によりディクショナリの情報をあらわす時の規則を説明します。
ディクショナリの情報を名前で限定する
ディクショナリの情報は、他のディクショナリの情報の一部となることがあり、そのとき情報をそれぞれのディクショナリの名前で限定できます。このとき構成は次の構成との間で、ピリオドで区切られます。SQL92識別子ははドットで区切られます。名前で限定することにより、ディクショナリの情報名があいまいになることを防ぐことができます。
列名
SQLの構文ではさまざまな文脈で、列の名前を表名や相関名により限定することができます。
一方で文脈によっては列名を表名や相関名で限定できず、単純列名を使わなければならない場合もあります。 そのような文脈とは、

• |  | 表の作成(CREATE TABLE 文)
• |  | カーソルの更新可能な列の特定
• |  | SELECT式にある列の相関名(選択式を参照)
• |  | TableExpressionにある列の相関名 (TableExpressionを参照)

更新可能な列には相関名を使うことができません。仮に使えば、SQL例外が起きます。たとえば、

    SELECT c11 AS col1, c12 AS col2, c13 FROM t1 FOR UPDATE of c11,c13

という例にて、相関名をc11のcol1に使えません。なぜなら、 c11はFOR UPDATE に存在するからです。一方で相関名をc12に使うことができます。なぜなら、これはFOR UPDATEに存在しないからです。
構文

    [ { table-Name | correlation-Name } . ] SQL92Identifier

例

    -- C.Country は
    相関名により限定された
    --列名です。
    SELECT C.Country
    FROM APP.Countries C

相関名
相関名はFROM句にあるテーブルについて与える事ができ、新しい名前、別名となります。相関名をスキーマ名で限定することはできません。
相関名は更新可能な列に使うことはできません。仮に使えばSQL例外が発生します。 例えば、

    SELECT c11 AS col1, c12 AS col2, c13 FROM t1 FOR UPDATE of c11,c13

という例では、相関名をc11のcol1に使うことはできません。なぜなら、c11はFOR UPDATEにある列だからです。 それに対して相関名をc12に使うことはできます。これはFOR UPDATEにないからです。
構文

    SQL92識別子

例

    -- Cは相関名です。
    SELECT C.NAME
    FROM SAMP.STAFF C

新しい表名
新しい表名は、新しく名前のついた表をあらわします。新しい表名をスキーマ名で限定することはできません。
構文

    SQL92識別子

例

    -- FlightBooks は新しい表名です。スキーマ名はありません。
    RENAME TABLE FLIGHTAVAILABILITY TO FLIGHTAVAILABLE

スキーマ名
スキーマ名はスキーマをあらわします。スキーマにはそのほかのディクショナリの情報があります。これには表や索引が含まれて居ます。スキーマによりデータベースにある表等のディクショナリの情報の部分集合に名前を与えることができます。
スキーマは明示的に作成、破棄できます。デフォルトのユーザースキーマはAPPというスキーマです。(これは接続時にユーザ名が与えられなかったときに使われます。) SYSで始まるスキーマには情報を作成することができません。
スキーマ名により表への参照を限定することができます。スキーマ名が指定されなければ、暗黙のうちにデフォルトのスキーマ名により表が限定されます。 システム表を参照するには、SYSで限定しなければなりません。システム表についてのより詳細な情報については、Derbyのシステム表を参照してください。
スキーマはディクショナリの情報が持つ階層構造において最も上位に位置します。したがって、スキーマ名を限定することはできません。
Syntax

    SQL92識別子

例

    -- SAMP.EMPLOYEE はスキーマ名で限定された表名です。
    SELECT COUNT(*) FROM SAMP.EMPLOYEE
    -- システムカタログの名前は、そのスキーマであるSYSで限定しなければなりません。
    SELECT COUNT(*) FROM SYS.SysColumns

単純列名
表名や相関名で限定できない文脈で列をあらわすとき、単純列名が使われます。 このような文脈は、CREATE TABLE文の列定義のような、限定の必要が無い場合が当てはまります。
構文

    SQL92識別子

例

    -- country は単純列名です。
    CREATE TABLE CONTINENT (COUNTRY VARCHAR(26) NOT NULL PRIMARY KEY,
    COUNTRY_ISO_CODE CHAR(2), REGION VARCHAR(26))

別名
表やビューは別名であらわす事ができます。 別名はスキーマ名で限定することができます。
構文

    [ スキーマ名. ] SQL92識別子

表名
表名は表をあらわします。表名はスキーマ名で限定することができます。
構文

    [ スキーマ名. ] SQL92識別子

例

    -- SAMP.PROJECT はスキーマ名のある表名です。
    SELECT COUNT(*) FROM SAMP.PROJECT

ビュー名
ビュー名は表またはビューをあらわします。ビュー名はスキーマ名で限定することができます。
構文

    [ スキーマ名. ] SQL92識別子

Example

    -- これはスキーマ名のあるビュー名です。
    SELECT COUNT(*) FROM SAMP.EMP_RESUME

索引名
索引名は索引をあらわします。索引はスキーマにあるので、その名前をスキーマ名で限定することができます。システム表の索引はSYSスキーマにあります。
構文

    [ スキーマ名 . ] SQL92識別子

例

    DROP INDEX APP.ORIGINDEX;
    -- OrigIndexはスキーマ名のない索引名です。
    CREATE INDEX ORIGINDEX ON FLIGHTS (ORIG_AIRPORT)

制約名
制約名は限定できません。
構文

    SQL92識別子

例

    -- country_fk2 は制約名です。
    CREATE TABLE DETAILED_MAPS (COUNTRY_ISO_CODE CHAR(2)
    CONSTRAINT country_fk2 REFERENCES COUNTRIES)

カーソル名
カーソル名はカーソルをあらわします。SQL言語によりカーソルに名前を割り当てることはできません。その代わり、JDBC APIによってカーソルに名前を割り当てたり、システムが命名した名前を取得することができます。より詳細については、Derby ディベロッパーズ ガイドを参照してください。 カーソルに名前を割り当てれば、SQL文にてその名前を使うことができます。
カーソル名は限定できません。
構文

    SQL92識別子

例

    stmt.executeUpdate("UPDATE SAMP.STAFF SET COMM = " +
    "COMM + 20 " + "WHERE CURRENT OF " + ResultSet.getCursorName());

TriggerName
トリガ名によりユーザが作成したトリガを参照することができます。
構文

    [ スキーマ名 . ] SQL92識別子

例

    DROP TRIGGER TRIG1

認証識別子
Derbyのシステムではユーザ名を、認証識別子と呼びます。接続の要求にて認証識別子が記述されている場合、これはユーザ名を表します。ユーザの既定のスキーマは、その認証識別子と同じです。 認証の仕組みでは、ユーザ名の大文字小文字を区別することができますが、Derbyの認証の仕組みではデリミトされない限りは、大文字小文字は区別されません。 より詳細な情報は、Derby ディベロッパーズ ガイドを参照してください。
構文

    SQL92識別子

Example

    CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(
        'derby.database.fullAccessUsers', 'Amber,FRED')

文
本節は言語の高レベルな構造と、それから言語の部分について、マニュアルを提供します。 たとえばCREATE INDEX文は高レベルの文です。これをユーザはJDBCのインターフェイスを通して直接実行することができます。本節にはSQLの節についても書かれています。これは、高レベルの文ではなく、直接実行することはできませんが、高レベルの文の一部となることができます。例えばORDER BY節やWHERE節は節です。最後に本節には、式について書かれています。式は文に置くことができる複雑な構文です。例えば、Select式や表副問い合わせ等が式です。 これらの節や式には、リファレンスとして使いやすいよう、それぞれにマニュアルの頁が用意されています。
特に何も書かれていなければ、文と記された全ての高レベルの文は、JDBCのインターフェイスを介して、実行する事あるいは用意して実行することが可能です。 一方、個々の式について、高レベルの文として実行可能か否かこのマニュアルにて書かれています。
本節では文の利用についての一般的な情報や、個々の文についての説明が書かれています。
依存関係
Derby は準備済み文の依存関係を追跡します。準備済み文とは実行前にコンパイルされたSQL文の事です。典型的なシナリオとして、これらは準備(プレコンパイル)された後、複数回実行されます。
準備済み文はディクショナリの情報や、それ自身から参照する他の文に依存します。(ディクショナリの情報とは、表・列・制約・索引・ビュー・トリガのことです。) 準備済み文が依存しているディクショナリの情報や文が、破棄されたり変更されたりすると、内部的に準備済み文は無効となり、Derbyは準備済み文が実行されるとき、自動的に再コンパイルを行おうとします。 もしこのとき、準備済み文の再コンパイルが失敗すると、実行は失敗します。 しかしながら、もし何らかの対応を行って(無くなった表を復活させるなどして)失われた依存性を元に戻せるのなら、失敗した準備済み文を成功裏に実行することができます。これは、Derbyが再実行が要求されたとき、再コンパイルを自動的に行うからです。
お互いに依存した文-UPDATE WHERE CURRENT文は参照する文に依存します。依存する文を破棄すると、UPDATE WHERE CURRENT文は無効になります。
さらに準備済み文の結果がオープンしている場合、ある種のDDL文の実行を妨げます。
それぞれの文に対応したマニュアルの頁には、その文が準備された場合、どのようなことをすると無効になるのかが書かれています。
ここにDerbyのijというツールを使って例を示します。

    ij> CREATE TABLE mytable (mycol INT);
    0 rows inserted/updated/deleted
    ij> INSERT INTO mytable VALUES (1), (2), (3);
    3 rows inserted/updated/deleted
    -- この例ではijのprepareコマンドを使います。
    -- このコマンドにより文が準備されます。
    ij> prepare p1 AS 'INSERT INTO MyTable VALUES (4)';
    -- p1はmytableに依存します;
    ij> execute p1;
    1 row inserted/updated/deleted
    -- Derbyは再コンパイルせずに文を実行します。
    ij> CREATE INDEX i1 ON mytable(mycol);
    0 rows inserted/updated/deleted
    -- 新しい索引のため、p1は一時的に無効となります。
    ij> execute p1;
    1 row inserted/updated/deleted
    -- Derbyは自動的にp1を再コンパイルして、実行します。
    ij> DROP TABLE mytable;
    0 rows inserted/updated/deleted
    -- Derbyでは以下のように表を破棄することができます。
    -- これはp1の結果が閉じているからです。
    -- しかしながらp1は一時的に無効となります。
    ij> CREATE TABLE mytable (mycol INT);
    0 rows inserted/updated/deleted
    ij> INSERT INTO mytable VALUES (1), (2), (3);
    3 rows inserted/updated/deleted
    ij> execute p1;
    1 row inserted/updated/deleted
    -- p1は無効となっているので、Derbyは実行の前に再コンパイルを行います。
    -- 再コンパイルは成功して、文は実行できます。
    ij> DROP TABLE mytable;
    0 rows inserted/updated/deleted
    -- p1は無効です。
    -- 今度は最コンパイルしようとしても失敗するので、
    -- 実行も失敗です。
    ij> execute p1;
    ERROR 42X05: Table/View 'MYTABLE' does not exist.

ALTER TABLE 文
The ALTER TABLE 文により次のことが可能です。

• |  | 表に列を追加する。
• |  | 表に制約を追加する。
• |  | 表の列を破棄する。
• |  | 表にある制約を破棄する。
• |  | VARCHAR, CHAR VARYING, and CHARACTER VARYING 列の幅を増やす。
• |  | 表に定義された行レベルのロックを上書きする。(あるいは上書きされた内容を破棄する。)
• |  | 識別子列の増分値や開始値を変更する。
• |  | 列がNull可であるか否か変更する。
• |  | 列の規定値を変更する。

構文

    ALTER TABLE 表名
    {
        ADD COLUMN 列定義 |
        ADD CONSTRAINT節 |
        DROP [ COLUMN ] 列名 [ CASCADE | RESTRICT ]
        DROP { PRIMARY KEY | FOREIGN KEY 制約名 | UNIQUE
    	 制約名 | CHECK 制約名 | CONSTRAINT 制約名 }
        ALTER [ COLUMN ] 列定義変更 |
        LOCKSIZE { ROW | TABLE }
    }

列定義

    単純列名データ型
    [ 列単位制約 ]*
    [ [ WITH ] DEFAULT 既定制約式 ]

既定制約式の詳細については、列の既定を参照してください。
列定義変更

    列名 SET DATA TYPE VARCHAR(integer) |
    column-name SET INCREMENT BY 定整数 |
    column-name RESTART WITH 定整数 |
    column-name [ NOT ] NULL |
    column-name [ WITH ] DEFAULT 既定値

列定義変更のSET INCREMENT BY 定整数により、識別子列のとる連続した値の間隔が設定されます。識別子列がとる次の値は、最後にとられた値に増分が加算された値となります。この場合列にはあらかじめIDENTITY属性が定義されていなければなりません。
RESTART WITH 定整数により、識別子列がとる次の値が設定されます。RESTART WITHは、GENERATED BY DEFAULTが定義された、一意キーを持つ識別子列のある表に使うと便利です。GENERATED BY DEFAULTは明示的に値を挿入することおよび、暗黙的にシステムが発番した値を挿入することのいずれをも許すため、明示的に挿入された値がシステムが発番する値との間で競合する事がありえます。この競合を回避するために、RESTART WITHにより識別子列で次に発番される値を設定する事ができるのです。自動的に発番された値と手動で挿入された情報がある、次の例について考えてみてください。

    CREATE TABLE tauto(i INT GENERATED BY DEFAULT AS IDENTITY, k INT)
    CREATE UNIQUE INDEX tautoInd ON tauto(i)
    INSERT INTO tauto(k) values 1,2

システムは自動的に識別子列に対して数値を発番します。しかしながら、あなたは手動で識別子列に幾つかの値を挿入しなければなりませんでした。

    INSERT INTO tauto VALUES (3,3)
    INSERT INTO tauto VALUES (4,4)
    INSERT INTO tauto VALUES (5,5)

識別子列にはこの時点で1から5の値があります。ここであなたがシステムに値を発番させると、システムは3という値を発番します。この値により一意キー例外が発生します。なぜなら3という値は既に手動で挿入されてしまっているからです。手動で値を挿入したので後処理として、識別子列に対してRESTART WITH 6 のALTER TABLE文を発行します。

    ALTER TABLE tauto ALTER COLUMN i RESTART WITH 6

ALTER TABLE は表を参照するいかなるビューにも影響しません。これはSELECT一覧に"*"を持っていても然りです。新しく追加された列がビューから見えるようにする為には、ビューを破棄して作り直さなければなりません。
列の追加
追加する列の列定義は、構文の上でCREATE TABLE文の列と同じです。ですから、列の制約をALTER TABLE ADD COLUMN文の新しい列に書くこともできます。しかしながら、既存のテーブルにNOT NULL制約のある列を追加することは、その列に既定値を与えた場合のみ可能です。さもなければ、ALTER TABLE文が実行されたとき、例外が発生します。
CREATE TABLEと同様、列定義に一意あるいは主キー制約がある場合、列はnull値をとることができません。したがって、NOT NULL属性も必要です。(SQLSTATE 42831)
Note: 表に明示的な列一覧が指定されないUPDATEトリガが定義されていた場合、その表に列を追加すると、追加された列はUPDATEトリガの暗黙的な更新列一覧に追加されます。さらに新しい列を拾うことができるよう、推移変数への全ての参照は無効となります。
制約の追加
ALTER TABLE ADD CONSTRAINTにより表ごとの制約が既存の表に追加されます。あらゆる種類の表ごとの制約がALTER TABLEで追加できます。ただし、既存の表への制約の追加には次の機能上の制限があります。

• |  | 外部キーやチェック制約が既存の表に追加されるときDerbyは既存の行が制約に違反しないか、表を調べます。もしいずれかの行が制約に違反する場合、Derbyは例外を投げて制約は追加されません。
• |  | 主キーに含まれるあらゆる列はnullでない値をとらなければならず、また一意でなければなりません。 ALTER TABLE ADD UNIQUEやPRIMARY KEYは、単一の列による主キーを定義する簡単な方法を提供します。もしPRIMARY KEYがCという列の定義に書かれたされた場合、これはPRIMARY KEY(C)という別の節に書いたのと同じです。列はnullの値をとってはならないので、NOT NULL属性も指定されなければなりません。

制約の構文についての詳細は、CONSTRAINT 節を読んでください。 ADD TABLE ADD CONSTRAINTという書き方にて、制約を追加する場合は、表毎の制約の構文に従ってください。
列の破棄
ALTER TABLE DROP COLUMNにより、表から列を破棄できます。
COLUMNというキーワードは無くてもかまいません。
CASCADEやRESTRICTも、無くてかまいません。どちらも指定しなかった場合、既定はCASCADEです。
RESTRICTの場合、依存しているスキーマの情報が無効になるならば、列の破棄は失敗します。
CASCADEの場合、列の破棄と併せて、無効になるスキーマの情報も破棄されます。
DROP COLUMN RESTRICTが失敗する原因となるスキーマの情報には、次が含まれます。 ビュー、トリガ、主キー制約、外部キー制約、一意キー制約、チェック制約、列権限。破棄する列に依存するいずれかの情報があれば、DROP COLUMN RESTRICTは失敗します。
表にひとつしかない列は、破棄することができません。
sqlAuthorizationが真である場合、列を削除することはできません。(DERBY-1909を参照してください。) )
列が索引にて使われているか否かにかかわらず、列の破棄はCASCADE/RESTRICTのどちらでも同じように行われます。列が破棄されるとき、索引にあるその列が取り除かれます。その列が索引にあるただひとつの列であった場合、索引全体が破棄されます。
制約の破棄
ALTER TABLE DROP CONSTRAINTにより表の制約を破棄できます。名前付けしていない制約を破棄するためには、SYS.SYSCONSTRAINTSに記録されている自動生成された制約の名前をデリミトされた識別子として指定する必要があります。
主キー・一意性・外部キー制約を破棄すると、その制約が機能するために存在している索引が破棄されます。(この索引は支援索引とも呼ばれます。)
列の変更
列定義変更により、名前のある列を変更できます。可能な変更内容は以下のとおりです。

• |  | VARCHAR列の長さを増やすことができます。VARCHARというキーワードの代わりに、CHARACTER VARYINGやCHAR VARYINGを使うことができます。 これらの列の幅を増やすためには、データ型と新しいサイズを列名の後に書きます。 列の幅を減らしたり、データ型を変更したりする事はできません。主キーの一部や、外部キー制約から参照されている一意キー、外部キー制約の一部である列の幅は変更できません。
• |  | 識別子列のとる連続した値の間隔を指定することができます。 識別子列のとる連続した値の間隔を設定するためには、定整数を与えます。あらかじめ列には識別子属性が与えられていなければなりません。(SQLSTATE 42837)もし表に既に行がある場合、列のSET INCREMENT defaultが加算された値は変更されません。
• |  | 列のNullへの制約の変更 列がNullをとる事への制約を変更できます。 NOT NULL制約を既存の列に与えることができます。これを行う場合、既存のNULL値が表のその列に存在してはなりません。 NOT NULL制約を既存の列から取り除くことができます。これを行う場合、その列がPRIMARY KEYやUNIQUEの制約にて使われている列であってはなりません。
• |  | 列の既定値を変更する

既定値の設定
新規の列に既定値を与えることができます。既定値とは値が指定されなかった場合に列に挿入される値です。もし明示的に既定値が与えられていなかった場合、列の既定値はNULLです。もし新しい列に既定値を与えた場合、表にある既存の行はその新列に既定値をとることとなります。
既定値のより詳細な情報については、CREATE TABLE 文を参照してください。
表のロック粒度の変更
もしあなたのシステムが既定の設定である行毎のロックを行うのであれば、LOCKSIZE節により表の行毎のロックを上書きすることができます。(一方あなたのシステムが表ごとのロックを行うよう設定されている場合、DerbyがLOCKSIZE節に対して例外を投げなかったとしても、ロックの粒度を行単位のロックに変更することはできません。) 表の行毎のロックを上書きするには、表にロックの設定を行います。 もし表が表毎のロックで作成された場合、ALTER TABLE文にてLOCKSIZE節を使うことで、その設定を行毎の設定に戻すことができます。これが便利な場合もあるのですが、その詳細については、Derbyのチューニングを参照してください。
例

    -- 既存の表に列ごとの制約のある列を追加する。
    -- 表に既存行があった場合、既存行の新列はNULLをとるので、
    -- 例外が発生する。
    ALTER TABLE CITIES ADD COLUMN REGION VARCHAR(26)
    CONSTRAINT NEW_CONSTRAINT CHECK (REGION IS NOT NULL);

    -- 既存の表に一意性制約を追加する。
    -- 重複したキーがあった場合、例外が発生する。
    ALTER TABLE SAMP.DEPARTMENT
    ADD CONSTRAINT NEW_UNIQUE UNIQUE (DEPTNO);

    -- Cities表に外部キー制約を追加する。
    -- 行が制約を満たすか検証されて、
    -- もし制約を満たさない行が見つかった場合、
    -- 制約は追加されない。
    ALTER TABLE CITIES ADD CONSTRAINT COUNTRY_FK
    Foreign Key (COUNTRY) REFERENCES COUNTRIES (COUNTRY);

    -- 主キー制約を表に追加する。
    -- 最初に表が作成される。
    CREATE TABLE ACTIVITIES (CITY_ID INT NOT NULL,
    SEASON CHAR(2), ACTIVITY VARCHAR(32) NOT NULL);
    -- もし主キーとした列にnullや重複した値がある場合、
    -- この制約を追加することはできない。
    ALTER TABLE Activities ADD PRIMARY KEY (city_id, activity);

    -- もし依存する情報が無ければ、city_id列が破棄される。
    ALTER TABLE Cities DROP COLUMN city_id RESTRICT;
    -- 依存する情報と併せて、city_id列が破棄される。
    ALTER TABLE Cities DROP COLUMN city_id CASCADE;

    -- CITIES表の主キー制約を破棄する。
    ALTER TABLE Cities DROP CONSTRAINT Cities_PK;
    -- CITIES表の外部キー制約を破棄する。
    ALTER TABLE Cities DROP CONSTRAINT COUNTRIES_FK;
    -- 既定値を1にとるDEPTNO列を追加する。
    ALTER TABLE SAMP.EMP_ACT ADD COLUMN DEPTNO INT DEFAULT 1;
    -- VARCHAR型の列幅を増やす。
    ALTER TABLE SAMP.EMP_PHOTO ALTER PHOTO_FORMAT SET DATA TYPE VARCHAR(30);
    -- 表のロック粒度を変更する。
    ALTER TABLE SAMP.SALES LOCKSIZE TABLE;

    -- MANAGER列のNOT NULL制約を破棄する。
    ALTER TABLE Employees ALTER COLUMN Manager NULL;
    -- SSN列にNOT NULL制約を追加する。
    ALTER TABLE Employees ALTER COLUMN ssn NOT NULL;

    -- SALARY列の既定値を変更する。
    ALTER TABLE Employees ALTER COLUMN Salary DEFAULT 1000.0

文の結果
ALTER TABLE 文により変更する表に依存する全ての文は、次回の実行にて再コンパイルされます。もし変更する表を参照する、開いたカーソルがある場合、ALTER TABLEは許可されません。
CALL (手続き) 文
CALL (手続き)文により手続きを呼ぶことができます。 手続きへの呼び出しは値を返しません。
構文

    CALL 手続名 ( [ 式 [, 式]* ] )

例

    CREATE PROCEDURE SALES.TOTAL_REVENUE(IN S_MONTH INTEGER,
    IN S_YEAR INTEGER, OUT TOTAL DECIMAL(10,2))
    PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA EXTERNAL NAME
    'com.acme.sales.calculateRevenueByMonth';
    CALL SALES.TOTAL_REVENUE(?,?,?);

CREATE 文
関数、索引、手続き、スキーマ、別名、表、トリガ、ビューのCREATE文が使えます。
CREATE FUNCTION 文
CREATE FUNCTION文により、式で利用できるJava関数を作成できます。
関数の所有者および、データベースの所有者は、自動的に関数へのEXECUTE権限を手に入れます。加えて、他のユーザへの権限付与の権限も手に入れます。関数とデータベースの所有者から、関数の実行権限を剥奪することはできません。
構文

    CREATE FUNCTION 関数名 ( [ 関数の引数
       [, FunctionParameter] ] * ) RETURNS 返却データ型 [ 関数の要素 ] *

関数名

    [ スキーマ名. ] SQL92識別子

スキーマ名が与えられなかった場合、デフォルトは現在のスキーマとなります。限定された関数名にて、スキーマ名はSYSで始まってはなりません。
関数の引数

    [ 引数名 ] データ型

引数名は関数にて一意である必要があります。
データ型の構文は、データ型に書かれています。
Note: CREATE FUNCTION文のパラメータにできないデータ型があります。それは、BLOB、CLOB、LONG VARCHAR、LONG VARCHAR FOR BIT DATAやXML等です。
返却データ型

    表型 | データ型

データ型の構文はデータ型に記述されています。
表型

    TABLE( 列要素 [, 列要素 ]* )

表関数の返り値の型です。現在利用できるのはDerbyの表関数の形式のみです。 これらはJDBCのResultSetを返す関数です。 より詳細な情報は、Derby ディベロッパーズ ガイドに記述された「Derbyの表関数のプログラミング」を参照してください。
列要素

    SQL92識別子データ型

データ型の構文は、データ型に記述されています。
Note: 表関数から返却する情報の列の型を、XMLとすることはできません。
関数の要素

     {
    | LANGUAGE { JAVA }
    | EXTERNAL NAME 文字列
    | PARAMETER STYLE パラメータの種類
    | { NO SQL | CONTAINS SQL | READS SQL DATA }
    | { RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT }
     }

LANGUAGE
JAVA- 関数はJavaのクラスにあるpublic staticなメソッドとして呼ばれます。
EXTERNAL NAME string
文字列により、関数が実行されたときに呼ばれるJavaのメソッドが記述されます。この文字列は次の書式です。

    クラス名.メソッド名

これは空白を含んではなりません。
パラメータの種類

    JAVA | DERBY_JDBC_RESULT_SET

関数はJava言語およびSQLルーチンの仕様に沿って、引数を値渡しします。INOUTとOUTの引数は変更後の値を返せるように、要素がひとつの配列として渡されます。さらに結果セットはJavaのメソッドのパラメータを経て、配列に渡したjava.sql.ResultSet[]型の要素により返すことができます。
Derby は長い列の型(これは例えばLong VarcharやBLOB等のことです。)をサポートしません。 これらの長い列の型を使おうとすると、エラーが発生します。
Derbyの表関数の場合、PARAMETER STYLEは常にDERBY_JDBC_RESULT_SETで、これ以外の値とすることはできません。表関数とは表型を返す関数で、JDBCのResultSetを返すメソッドに対応します。 それ以外の場合は、PARAMETER STYLEは常にJAVAです。
NO SQL, CONTAINS SQL, READS SQL DATA
により関数がSQLを発行するか否か。もしするならどのようなSQLを発行するかを記述します。
CONTAINS SQL
関数により変更も更新も行わないSQL文を実行できます。 関数にて許可されていない文が実行された場合、違うというエラーが返ります。
NO SQL
関数はSQLを実行できません。
READS SQL DATA
関数は情報の更新を行わないSQLを実行することができます。 関数にて許可されていない文が実行された場合、違うというエラーが返ります。 これは既定です。
RETURNS NULL ON NULL INPUT or CALLED ON NULL INPUT
入力の引数をnullにして関数が呼ばれるかをあらわします。その場合はnull値と扱います。
RETURNS NULL ON NULL INPUT
入力の引数のうちいずれかがnullであった場合、関数は呼ばれません。そのときの帰り値はnullとなります。
CALLED ON NULL INPUT
関数は入力の引数をnullにして呼ぶことができます。この場合は関数がnullの引数をとっても動作するようにコーディングされていなければなりません。関数はnullあるいはそれ以外の値を返すことができます。これは既定です。
関数の要素はどのような順序で現れてもかまいませんが、それぞれの要素は一回しか現れてはなりません。関数の定義にはこれらの要素が必要です。

• |  | LANGUAGE
• |  | PARAMETER STYLE
• |  | EXTERNAL NAME

Example

    CREATE FUNCTION TO_DEGREES(RADIANS DOUBLE) RETURNS DOUBLE
    PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA
    EXTERNAL NAME 'java.lang.Math.toDegrees'

CREATE INDEX 文
CREATE INDEX文により表に索引を作成できます。 索引は表のひとつ以上の列に作成できます。
構文

    CREATE [UNIQUE] INDEX 索引名
    ON 表名 ( 単純列名 [ ASC | DESC ]
        [ , 単純列名 [ ASC | DESC ]] * )

The Derbyにて索引に可能な列の最大数は16です。
索引名は128文字を超えてはなりません。
同じ列が単一のCREATE INDEX文に2つ以上あってはなりません。なお異なる索引であれば、同じ列をもってかまいません。
Derbyは索引を使って、情報の操作を行う文の効率を向上します。(Derbyのチューニングを参照してください。)。 さらにUNIQUEの索引により、情報が整合性を保っているか検証する事ができます。
索引名はスキーマにて一意です。(データベースシステムによっては、同じスキーマの異なるテーブルに同じ名前の索引を持つことができますが、Derbyは違います。) 索引と表の片方にスキーマ名が明示されて、もう片方に明示されなかった場合、索引と表は同じスキーマにあるものとされます。索引と表の両方にスキーマ名が明示されて、それぞれのスキーマ名が異なっていた場合、例外が発生します。表にも索引にもスキーマ名が明示されなかった場合、現在のスキーマが使われます。
既定でDerbyは索引をそれぞれの列に対して昇順で作成します。列名の後にASCと書いても既定の振る舞いと同じように動作します。 列名の後にDESCと書くと、索引を作るときにDerbyはその列を降順で扱います。 降順を列に指定することで、昇順と降順が混ざった並び順あるいは降順の問い合わせや、索引のある列の最大値や最小値を選択する問い合わせが、効率よく実行されることを期待できます。
限定された索引名を指定する場合、スキーマ名はSYSで始まってはなりません。
索引と制約
一意性・主キー・外部キー制約を作成すると、制約を適用または支援する索引が作成されます。(このような索引のことを支援索引と呼びます。)もし列や列の集合に、UNIQUEないしPRIMARY KEYの制約が存在している場合、それらの列に索引を作成することはできません。Derbyは既にその索引をシステムが決めた名前で作成しています。制約を支援する索引にシステムが与えた名前は、索引の名前でシステム表に問い合わせれば、簡単に見つけることができるでしょう。 既にUNIQUEの索引が存在している列の集合に、主キーまたは一意性制約を追加すると、同じ列の集合に複数の索引が造られることとなります。一つがもともとあったUNIQUEの制約でもう一つが、制約に併せて作成された支援索引です。
FLIGHTS_PKという名前の制約を支援する索引を見つけるには次のようにします。

    SELECT CONGLOMERATENAME FROM SYS.SYSCONGLOMERATES,
    SYS.SYSCONSTRAINTS WHERE
    SYS.SYSCONGLOMERATES.TABLEID = SYSCONSTRAINTS.TABLEID
    AND CONSTRAINTNAME = 'FLIGHTS_PK'

    CREATE INDEX OrigIndex ON Flights(orig_airport);
    -- 金額は通常大きな値から小さな値の順で並べられるので、
    -- 索引を降順で作成します。
    CREATE INDEX PAY_DESC ON SAMP.EMPLOYEE (SALARY);
    -- 索引をより大きいページサイズで作成します。
    call SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.storage.pageSize','8192');
    CREATE INDEX IXSALE ON SAMP.SALES (SALES);
    call SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.storage.pageSize',NULL);

ページサイズとキーサイズ
Note: 索引にあるキーの列サイズの合計は、ページサイズの半分以下で無ければなりません。もし既存行に作成しようとしている索引のキー列の合計が索引のページサイズの半分より大きな行があるならば、索引の作成は失敗します。このエラーは索引を作成したとき、表の既存行が基準に合わないときのみ発生します。索引が作成された後は、基準のキーサイズを超えた行の挿入が失敗します。
文の依存
SELECT、INSERT、UPDATE、UPDATE WHERE CURRENT、DELETEやDELETEの準備済み文は、その表がCREATE INDEX文の対象となった場合、索引の作成とともに無効になります。一方表について開いているカーソルは影響を受けません。
CREATE PROCEDURE 文
CREATE PROCEDURE文によりCALL PROCEDUREで実行可能な、Javaの手続きを作成できます。
手続きやデータベースの所有者は自動的にEXECUTE権限を持つものとされ、また他のユーザに権限を付与することができます。EXECUTE権限は手続きやデータベースの所有者から剥奪できません。
構文

    CREATE PROCEDURE 手続名 ( [ 手続きの引数
       [, 手続きの引数] ] * )
    [ 手続きの要素 ] *

手続名

    [ スキーマ名. ] SQL92識別子

スキーマ名が指定されなかった場合、現在のスキーマが既定となります。手続名を限定する場合、スキーマ名はSYSで始まってはなりません。
手続の引数

    [ { IN | OUT | INOUT } ] [ 引数名 ] データ型

引数の既定はINです。引数名は手続にて一意である必要があります。
データ型の構文はデータ型に記述されています。
Note: BLOB、CLOB、LONG VARCHAR、LONG VARCHAR FOR BIT DATAやXMLのようなデータ型はCREATE PROCEDURE文にて引数と定義できません。
手続の要素

     {
    | [ DYNAMIC ] RESULT SETS INTEGER
    | LANGUAGE { JAVA }
    | EXTERNAL NAME string
    | PARAMETER STYLE JAVA
    | { NO SQL | MODIFIES SQL DATA | CONTAINS SQL | READS SQL DATA }
     }

DYNAMIC RESULT SETS 数値
手続に見積もられる結果の上限を与えます。既定は結果無し(0)です。
LANGUAGE
JAVA- 手続はJavaのクラスにあるpublic staticなメソッドとして呼ばれます。
EXTERNAL NAME 文字列
文字列 により手続が実施されたときのJavaのメソッドが記述されます。これは次の書式となります。

    クラス名.メソッド名

この名前には空白があってはなりません。
PARAMETER STYLE
JAVA - 手続はJavaとSQLルーチンの仕様に沿って、値渡しにより引数を扱います。INOUTおよびOUTの引数は値を呼び出し側に戻せるように、要素を一つだけ持つ配列により渡されます。結果はJavaのメソッドにjava.sql.ResultSet[]の型で追加された、唯一つの要素を持つパラメータにより呼び出し側に戻されます。
Derby は長い列の型(例えばLong Varchar, BLOB等のことです。)をサポートしません。 もしこれらの長い列の型のうちの一つを使うと例外が発生します。
NO SQL, CONTAINS SQL, READS SQL DATA, MODIFIES SQL DATA
手続がSQL文を発行するか否か、またするならばどのようなSQL文を発行するかを表します。
CONTAINS SQL
読み込みも変更も行わないSQL文を手続に持たせることができることを表します。サポートされていない文では異なるというエラーが発生します。これは既定です。
NO SQL
手続ではいかなるSQL文も実行できません。
READS SQL DATA
変更を行わないSQL文を手続に持たせることができることをあらわします。サポートされていない文では異なるというエラーが発生します。
MODIFIES SQL DATA
手続でサポートされていない、あらゆるSQL文を手続から実行できることを表します。
手続の要素はどのような順序でも出現することができますが、それぞれの種類の要素は一度までしか現れてはなりません。手続にはこれらの定義が無ければなりません。

• |  | LANGUAGE
• |  | PARAMETER STYLE
• |  | EXTERNAL NAME

例

    CREATE PROCEDURE SALES.TOTAL_REVENUE(IN S_MONTH INTEGER,
    IN S_YEAR INTEGER, OUT TOTAL DECIMAL(10,2))
    PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA EXTERNAL NAME
    'com.acme.sales.calculateRevenueByMonth'

CREATE SCHEMA 文
スキーマにより情報を論理的に一つの集合に分類すること、および、一意な名前空間を提供する事ができます。
構文

    CREATE SCHEMA { [ スキーマ名 AUTHORIZATION ユーザ名 ] | [ スキーマ名 ] |
    [ AUTHORIZATION ユーザ名 ] }

CREATE SCHEMA 文によりスキーマを作成することができます。スキーマ名は128文字を超えてはなりません。スキーマ名はデータベースの内で一意で無ければなりません。
CREATE SCHEMA文はデータベースないしシステムにおいて、derby.database.sqlAuthorizationがtrueとなっている場合、アクセス制御の対象となります。データベース所有者だけが現在のユーザ名とは異なる名前のスキーマを作成することができます。またデータベース所有者だけが現在のユーザ名とは異なる

    AUTHORIZATION user-name

を指定できます。 derby.database.sqlAuthorization属性についてのより詳細な情報は、Derbyのチューニングを参照してください。
CREATE SCHEMAの例
飛行機に関連した表をおくスキーマを作成して、anitaという認証識別子にスキーマの全ての情報を操作する権限を与えるには次のようにします。

    CREATE SCHEMA FLIGHTS AUTHORIZATION anita

従業員に関連した表をおくスキーマを作成するには次のようにします。

    CREATE SCHEMA EMP

takumiというスキーマ名がそのまま認証識別子であるスキーマを作成するには次のようにします。

    CREATE SCHEMA AUTHORIZATION takumi

EMPとFLIGHTSの各スキーマにavailabilityという表を作成するには次のようにします。

    CREATE TABLE FLIGHTS.AVAILABILITY
    	(FLIGHT_ID CHAR(6) NOT NULL, SEGMENT_NUMBER INT NOT NULL,
    	FLIGHT_DATE DATE NOT NULL, ECONOMY_SEATS_TAKEN INT,
    	BUSINESS_SEATS_TAKEN INT, FIRSTCLASS_SEATS_TAKEN INT,
    	CONSTRAINT FLT_AVAIL_PK
    	PRIMARY KEY (FLIGHT_ID, SEGMENT_NUMBER, FLIGHT_DATE))

    CREATE TABLE EMP.AVAILABILITY
    	(HOTEL_ID INT NOT NULL, BOOKING_DATE DATE NOT NULL, ROOMS_TAKEN INT,
    	CONSTRAINT HOTELAVAIL_PK PRIMARY KEY (HOTEL_ID, BOOKING_DATE))

CREATE SYNONYM 文
CREATE SYNONYM文によって同じスキーマあるいは異なるスキーマに存在する表やビューに別名を与える事ができます。 さらに別名に別名を与えて、入れ子の別名を作成することもできます。 別名は元の限定された表やビューの名前に代わり、SELECT、INSERT、UPDATE、DELETEやLOCK TABLE文にて利用できます。存在しない表やビューへの別名を作成することも可能ですが、別名を利用する前までに対象の表やビューは存在していなければなりません。
別名は表やビューと同じ名前空間を共有します。同じスキーマに既にある表と同じ名前で別名を作ることはできません。同様に既に存在する別名と同じ名前の表やビューを作成することはできません。
別名は作成時にまだ存在していない表やビューにも作成することができます。もし表やビューが存在していなければ、そのことを警告されます。(SQLSTATE 01522) DML文で別名を使うときには参照する情報は存在していなければなりません。
入れ子になった別名(他の別名への別名)を作成することはできますが、参照関係が循環するような別名を作成しようとするとエラーとなります。(SQLSTATE 42916)
別名はシステムスキーマに定義できません。'SYS'で名前が始まるあらゆるスキーマはシステムスキーマとみなされ、Derbyにおいて予約されています。
一時表への別名は作成できません。一時表に別名を定義しようとするとエラーとなります。(SQLSTATE XCL51)
構文

    CREATE SYNONYM 別の名 FOR { ビュー名 | 表名 }

文中の別の名は、対象の表やビューに与える別名です。一方で、ビュー名や表名は、対象の表やビューの元の名前です。
例
CREATE SYNONYM SAMP.T1 FOR SAMP.TABLEWITHLONGNAME
CREATE TABLE 文
CREATE TABLE文により表を作成します。表には列および制約があって、情報が沿うべき規則が決められています。表ごとの制約は列の集合ないしは列を指定します。列にはデータ型が決まっていて、列の制約(列ごとの制約)があります。
表やデータベースの所有者は自動的に以下の権限を持ち、また他のユーザにこれらの権限を与える事ができます。

• |  | INSERT
• |  | SELECT
• |  | REFERENCES
• |  | TRIGGER
• |  | UPDATE

これらの権限を表やデータベースの所有者から剥奪することはできません。
制約についての情報は、CONSTRAINT 節を参照してください。
列には既定値を与えることができます。既定値とは値が指定されなかったとき、列に挿入される値です。明示されない場合列の既定値はNULLです。詳細は列の既定値を参照してください。
SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTYというシステムの手続を呼ぶことで、ページサイズのような記録の属性を設定することができます。
表を限定する場合、スキーマ名はSYSで始まってはなりません。
構文
CREATE TABLEには二通りの書き方があります。これは、列の定義と制約を指定しようとするか、問い合わせ式の結果に基づき列を定義するかによります。

    CREATE TABLE 表名
        ( {列定義 | 表毎制約}
        [ , {列定義 | 表毎制約} ] * )
      |
          [ ( 列名 [ , 列名 ] * ) ]
          AS 問い合わせ式
          WITH NO DATA
       }

例

    CREATE TABLE HOTELAVAILABILITY
         (HOTEL_ID INT NOT NULL, BOOKING_DATE DATE NOT NULL,
    	ROOMS_TAKEN INT DEFAULT 0, PRIMARY KEY (HOTEL_ID, BOOKING_DATE));
    -- 表で主キーを定義することで、2列からなる主キーを定義できます。
    PRIMARY KEY (hotel_id, booking_date))
    -- 識別子列の属性を、INTEGERの列に与え、
    -- さらに列に主キー制約を定義します。
    CREATE TABLE PEOPLE
    	(PERSON_ID INT NOT NULL GENERATED ALWAYS AS IDENTITY
    	CONSTRAINT PEOPLE_PK PRIMARY KEY, PERSON VARCHAR(26));
    -- 識別子列の属性を、SMALLINTの列に与え、
    -- 初期値を5に増分値を5に設定します。
    CREATE TABLE GROUPS
    	(GROUP_ID SMALLINT NOT NULL GENERATED ALWAYS AS IDENTITY
    	(START WITH 5, INCREMENT BY 5), ADDRESS VARCHAR(100), PHONE VARCHAR(15));

Note: さまざまな制約を使った、より多くのCREATE TABLE文の例がCONSTRAINT 節にあります。
CREATE TABLE ... AS ...
もう一つのCREATE TABLE文の書き方は、問い合わせで列の名前と/あるいは列のデータ型を指定します。問い合わせ結果の列は、新しい表の各列を作成するときにモデルとして利用されます。
新しい表に列名が指定されなかった場合、問い合わせの結果の全列が、新しい表に同じ名前と対応するデータ型で作成されます。 ひとつあるいはそれ以上の列の名前が新しい表に指定された場合、問い合わせ式の結果には同数の列が無ければなりません。問い合わせ結果の列のデータ型は新しい表の対応する列に引き継がれます。
WITH NO DATA節は問い合わせ結果行のデータは使われず、列の名称と型だけが利用されることを表します。 WITH NO DATAは必ず指定してください。今後のリリースにて、DerbyでもWITH DATAを指定して、問い合わせ式の結果を新規作成された表に挿入するように出来るようになるかもしれません。しかし現在のリリースでは、WITH NO DATAの文しか処理されません。
例

    -- 既存の表の全列とデータ型を使って新しい表を作成する。
    CREATE TABLE T3 AS SELECT * FROM T1 WITH NO DATA;
    -- 列に名前を指定して表を作成する。そのデータ型は既存表の列に沿ったものとする。
    CREATE TABLE T3 (A,B,C,D,E) AS SELECT * FROM T1 WITH NO DATA;
    -- 列に名前を指定して表を作成する。そのデータ型は既存表の指定された列のデータ型に沿ったものとする。
    CREATE TABLE T3 (A,B,C) AS SELECT V,DP,I FROM T1 WITH NO DATA;
    -- この例では問い合わせ式の結果にある列に名前がないが、そのデータ型は新規作成された表にて対応する列のデータ型となる。
    CREATE TABLE T3 (X,Y) AS SELECT 2*I,2.0*F FROM T1 WITH NO DATA;

列定義:

    単純列名データ型
        [ 列毎の制約 ]*
        [ [ WITH ] DEFAULT 既定制約式
           |発番列仕様 ]
        [ 列毎の制約 ]*

データ型の仕様はデータ型にて説明されています。
列毎の制約と表毎の制約は、CONSTRAINT 節にて説明されています。
列の既定値
既定値の定義として、いかなる表への参照もない既定制約式があります。 これに可能であるのは定数、日時の特殊変数、現在のスキーマ、ユーザ、nullです。

    既定制約式:
              NULL
            | CURRENT { SCHEMA | SQLID }
            | USER | CURRENT_USER | SESSION_USER
            | DATE
            | TIME
            | TIMESTAMP
            | CURRENT DATE | CURRENT_DATE
            | CURRENT TIME | CURRENT_TIME
            | CURRENT TIMESTAMP | CURRENT_TIMESTAMP
            | literal

Derbyのリテラル値についての詳細は、データ型を参照してください。
既定制約式におく値は、列と互換性のある型でなければなりません。加えて以下の制約があります。

• |  | USER、CURRENT_USERやSESSION_USERを指定した場合、列の長さは少なくとも8である必要があります。
• |  | CURRENT SCHEMAやCURRENT SQLIDを指定した場合、列の長さは少なくとも128である必要があります。
• |  | 列が整数型である場合、既定値は整数のリテラルである必要があります。
• |  | 列が10進の型である場合、既定値の桁数と精度は列のそれぞれの定義の範囲内である必要があります。

発番列仕様:

    [ GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY
    [ ( START WITH 定整数
    [ ,INCREMENT BY 定整数] ) ]  ]  ]

識別子列属性
SMALLINT、INT、BIGINT型の列に識別子属性があると、Derbyは自動的に列の値に、増加する整数値をあてます。挿入文で列の値が指定されない場合、識別子列属性は既定値と同様に振る舞い、Derbyは列に自動的に値を与えます。 しかしながら、その値は定数ではありません。Derbyは行に挿入する時、自動的に既定値へ加算してゆきます。
IDENTITYというキーワードは列のデータ型が次のいずれの整数である場合にのみ指定可能です。

• |  | SMALLINT
• |  | INT
• |  | BIGINT

Derbyには二種類の識別子列があります。ひとつはGENERATED ALWAYSで、もう一つはGENERATED BY DEFAULTです。
GENERATED ALWAYS
GENERATED ALWAYSの識別子列は列の既定値を、挿入が行われるときごとに増加させて、その増加された値を列に記録します。他の既定値とは違い、GENERATED ALWAYSの識別子列に値を直接挿入したり、その値を変更したりすることはできません。その代わりに識別子列の値にはDEFAULTというキーワードを与えるか、識別子列を挿入する列の一覧からはずすかします。 例を挙げます。

    create table greetings
    	(i int generated always as identity, ch char(50));
    insert into greetings values (DEFAULT, 'hello');
    insert into greetings(ch) values ('bonjour');

GENERATED ALWAYSな識別子列に自動的に発番された値は一意です。また識別子列を作成しても、列に索引は作られません。
GENERATED BY DEFAULT
GENERATED BY DEFAULTの識別子列は、挿入時に列へ明示的な値が与えられなかった場合のみ、既定値を増加させて使います。GENERATED ALWAYSの列とは違い、挿入文にて明示的な値を既定値の変わりに与えることができます。
生成された既定値を使うためには、挿入時にDEFAULTというキーワードを使うか、識別子列を挿入列リストから外します。挿入する値を指定するには、その値を挿入文に含めます。例を挙げます。

    create table greetings
    	(i int generated by default as identity, ch char(50));
    -- "1"を指定する:
    insert into greetings values (1, 'hi');
    -- 生成された既定値を使う
    insert into greetings values (DEFAULT, 'salut');
    -- 生成された既定値を使う
    insert into greetings(ch) values ('bonjour');

GENERATED ALWAYS列とは異なり、GENERATED BY DEFAULTの列では一意性は保障されません。したがって、上記の例ではhiおよびsalutの行はどちらも同じ"1"という識別値を取ります。なぜなら、生成された列の値は"1"から始まり、ユーザが指定した値も"1"だったからです。重複を避けるために、情報のロードやインポートを行うときにテーブルを作成して、システムが自動生成するためのSTART WITHの値を与えてください。このような状況をチェックして、起きないようにするために、主キーや一意性制約をGENERATED BY DEFAULTの識別子列に使うことができます。
既定では識別子列の初期値は1です。さらに増分値は1です。 列を定義するとき、初期値と増分値の両方に、START WITHとINCREMENT BYというキーワードを使って、明示的な値を指定することができます。さらに増分値に負の値を与えると、挿入毎にDerbyは値を減じてゆきます。 もし値が正の値であれば、挿入毎にDerbyは値を増加させてゆきます。 値に0を与えると例外が発生します。
識別子列にて可能な最大値と最小値は、列のデータ型によります。データ型で採ることのできる範囲外の値を挿入しようとすると、例外が発生します。
Table 1. 発番列仕様にて、列でとることが可能な最大値と最小値

データ型 | 最大値 | 最小値
SMALLINT | 32767 (java.lang.Short.MAX_VALUE) | -32768 (java.lang.Short.MIN_VALUE)
INT | 2147483647 (java.lang.Integer.MAX_VALUE) | -2147483648 (java.lang.Integer.MIN_VALUE)
BIGINT | 9223372036854775807 (java.lang.Long.MAX_VALUE) | -9223372036854775808 (java.lang.Long.MIN_VALUE)

識別子列にて自動的に生成された値は一意です。主キー制約や一意性制約を列に定義することで、一意性を保障する事ができます。識別子列を定義しても、列の索引は作られません 。
IDENTITY_VAL_LOCAL関数は、非決定性の関数で最後に識別子列に与えられた値を返します。詳細については、IDENTITY_VAL_LOCAL関数を参照してください。
Note: スキーマ・表・列の名前はデリミトされた識別子を使わない限り、常にシステム表にて大文字で記録されます。
Derbyは列に対して最後に発番された値をキャッシュに残しています。また、ディスク上では、SYS.SYSCOLUMNSというシステム表のAUTOINCREMENTVALUEという列に、次の値を記録しています。 トランザクションをロールバックしてもこの値は取り消されません。したがって、トランザクションがロールバックされると、識別子列に挿入される自動生成値には、空きが発生することとなります。 Derby はこのように動作することで、SYS.SYSCOLUMNSの行をトランザクションの期間中ロックし続けることを回避して、高い平行性を保っています。
トリガされたSQL文にて識別子列に値が挿入された場合、そのSQL文で挿入された値は、トリガのコード内でのみConnectionInfoから取得可能です。 また、トリガのコードはトリガをひいた文が挿入した値を取得することもできます。 しかし、トリガをひいた文は、トリガされたSQL文が識別子列に挿入した値を知ることができません。 さらにトリガは入れ子(再帰)の場合も同じようなこととなります。 SQL文によりT1というトリガが発火され、次にT1の実行したSQLによりT2というトリガが発火されたとします。ここでT1もT2も表に識別子列に値がある行を挿入した場合、T1はT2が挿入した値を見ることはできませんが、T2はT1が挿入した値を見ることができます。それぞれの入れ子になったトリガは自分自身と、再帰的なトリガを開始したSQLを含めて、入れ子のレベルが前の処理にて生成された値を見ることができます。 なおトリガの再帰は16まで可能です。
例

    create table greetings
      (i int generated by default as identity (START WITH 2, INCREMENT BY 1),
      ch char(50));
    -- 1を指定する。
    insert into greetings values (1, 'hi');
    -- 生成された既定値を使う
    insert into greetings values (DEFAULT, 'salut');
    -- 生成された既定値を使う
    insert into greetings(ch) values ('bonjour');

CREATE TRIGGER 文
トリガによりデータベースのイベントに応じて実行されるアクションの集合を、表に定義することができます。ここでデータベースのイベントとは削除、挿入、更新処理のことです。 例えば表に削除へのトリガを定義した場合、そのトリガのアクションは表から行が削除されるときに実行されます。
制約と併せて、トリガによる波及的な削除や更新を定義することで、情報の整合性を保つことができます。 トリガで実現できる機能はこのほかにも、警告の呈示や、他の表の更新、e-mailの送信やその他の処理など、多岐にわたります。
ひとつの表に定義可能なトリガの数には、それらのトリガが同じイベントへのトリガであるか否かにかかわらず、上限はありません。
スキーマの所有者であるユーザであれば、そのスキーマにトリガを作成することができます。 所有していない表にトリガを定義するためには、その表にTRIGGER権限を持っていなければなりません。 データベースの所有者であるユーザであれば、どのスキーマのどの表に対してもトリガを作成することができます。
トリガはトリガが定義されている表とは異なるスキーマに定義することも可能です。
限定されたトリガ名のスキーマ名は、SYSで始まってはなりません。
構文

    CREATE TRIGGER トリガ名
    { AFTER | NO CASCADE BEFORE }
    { INSERT | DELETE | UPDATE [ OF 列名 [, 列名]* ] }
    ON 表名
    [ 参照節 ]
    [ FOR EACH { ROW | STATEMENT } ] [ MODE DB2SQL ]
    トリガされるSQL文

トリガの発火が前か後か
トリガは前のトリガあるいは後のトリガのいずれかとして定義できます。

• |  | 前のトリガは文による変更が適用され制約による検証が行われる前に発火します。 前のトリガは、行のトリガあるいは文のトリガのいずれにもなることができます。(詳細は文のトリガと行のトリガを参照してください。)
• |  | 後のトリガは変更が適用され制約による検証が満たされた後に発火します。 後のトリガは、行のトリガあるいは文のトリガのいずれにもなることができます。(詳細は文のトリガと行のトリガを参照してください。)

挿入、削除、更新のいずれによりトリガは発火されるのか
トリガはどのように定義されたかに従って、次のいずれかのデータベースのイベントにより発火します。(上記の構文を参照してください。

• |  | INSERT
• |  | UPDATE
• |  | DELETE

表のイベントごとに定義できるトリガの数に上限はありません。さらに更新へのトリガであれば、対象となる列を明示することができます。
古い値を参照するのか、新しい値を参照するのか:参照節
発火の原因となったイベントで現在変更された情報をトリガされるSQL文から参照することは良くあることです。 また、トリガされるSQL文が参照しなければならないのは新しい値(変更後、後の値、と言うこともできます)である場合があります。
Derbyにて、発火した原因となったイベントにより変更された情報をトリガから参照する方法はひとつだけではありません。変更された情報はトリガされるSQL文から、遷移変数あるいは遷移表で参照することができます。 参照節にて遷移変数への相関名や別名を、OLD/NEW AS 相関名という書式で記述できます。
例えば、次のような節をトリガの定義に記述した場合。

    REFERENCING OLD AS DELETEDROW

トリガされるSQL文でこの相関名を参照できます。

    DELETE FROM HotelAvailability WHERE hotel_id = DELETEDROW.hotel_id

遷移変数はOLDかNEWのいずれかに関わらず、単一の行を持つjava.sql.ResultSetにマップされます。
Note: 遷移変数を使えるのは、行のトリガだけです。(文のトリガと行のトリガを参照してください。) また、挿入イベントの行のトリガではOLDの行を参照できません。削除イベントの行のトリガではNEWの行を参照できません。
文のトリガでは、遷移表をトリガされるSQL文やトリガの資格で参照可能です。 参照節にて参照表への相関名や別名を、OLD_TABLE/NEW_TABLE AS 相関名という書式で記述できます。
例えば、

    REFERENCING OLD_TABLE AS DeletedHotels

と書くことで識別子(DeletedHotels)をトリガされるSQL文で使うことができます。

    DELETE FROM HotelAvailability WHERE hotel_id IN
        (SELECT hotel_id FROM DeletedHotels)

遷移表は古いか新しいかに関わらず、トリガが着火した原因のイベントで影響を受けた行の数と同じ基数をもつjava.sql.ResultSetにマップされます。
Note: 文のトリガ(文のトリガと行のトリガを参照してください。)でのみ遷移表は利用可能です。 INSERT文へのトリガでは、OLDの表は参照できません。DELETE文へのトリガでは、NEWの表は参照できません。
参照節では、新しいものと古いものにそれぞれ一つまで、相関名あるいは識別子を定義できます。 また、行のトリガには遷移表の識別子を定義できない一方で、文のトリガには遷移変数の相関名を定義できません。
文のトリガと行のトリガ
トリガには、文のトリガと行のトリガがあります。 CREATE TRIGGER文のFOR EACH節にて、どちらのトリガであるか明示されなかった場合の既定は、文のトリガです。

• |  | 文のトリガ 文のトリガはトリガのイベント毎に一回発火します。トリガの発火に挿入・更新・削除にて何行が変更されたかは関係ありません。
• |  | 行のトリガ 行のトリガはトリガのイベントが影響する行毎に一回発火します。影響が一行にも及ばなかった場合、トリガは発火しません。

Note: 列の値を元の値と等しい値に変更した場合(例えば、UPDATE T SET C = Cという文を考えてください。)、トリガのイベント前と後で列の値に変化が無くても、行のトリガは発火します。
トリガされるSQL文
トリガで定義されるアクションのことを、トリガされるSQL文と呼びます。(上記、構文の最終行をを参照してください。) トリガされるSQL文には以下の制限があります。

• |  | 動的な引数(?)があってはなりません。
• |  | トリガが定義されている表の作成や、変更、破棄を行ってはなりません。
• |  | トリガが定義されている表への索引の作成や破棄を行ってはなりません。
• |  | トリガが定義されている表へのトリガの作成や破棄を行ってはなりません。
• |  | トランザクションのコミットやロールバック、分離レベルの変更を行ってはなりません。
• |  | 前のトリガのアクションにINSERT/UPDATE/DELETE文があってはなりません。
• |  | 前のトリガのアクションで更新を行う手続きを呼び出してはなりません。

トリガされるSQL文ではトリガが定義された表以外のデータベースの情報を参照することができます。それらのデータベースの情報が破棄されていた場合、トリガは無効となります。 次回の実行にてトリガの再コンパイルが失敗した場合、呼び出しは例外を投げて、トリガを発火させた文はロールバックされます。
トリガされるSQL文の詳細については、Derby ディベロッパーズ ガイドを参照してください。
実行の順序
トリガを発火させるデータベースのイベントが起きると、Derbyは処理を次の順で行います。

• |  | 最初にNo Cascade Beforeなトリガのアクションを実行します。
• |  | 次に、制約(主キー、一意キー、外部キー)の検証を行います。
• |  | 続いて、更新、変更、削除などの処理を行います。
• |  | 最後にAfterなトリガを発火します。

同じ表に対して、同じイベントの、発火する時(トリガが前か後かという意味です。)が同じトリガが複数定義されていた場合、トリガは作成された順に実行されます。

    -- 文とトリガ

    CREATE TRIGGER t1 NO CASCADE BEFORE UPDATE ON x
      FOR EACH ROW MODE DB2SQL
      values app.notifyEmail('Jerry', 'Table x is about to be updated');

    CREATE TRIGGER FLIGHTSDELETE
      AFTER DELETE ON FLIGHTS
      REFERENCING OLD_TABLE AS DELETEDFLIGHTS
      FOR EACH STATEMENT
      DELETE FROM FLIGHTAVAILABILITY WHERE FLIGHT_ID IN
      (SELECT FLIGHT_ID FROM DELETEDFLIGHTS);

    CREATE TRIGGER FLIGHTSDELETE3
      AFTER DELETE ON FLIGHTS
      REFERENCING OLD AS OLD
      FOR EACH ROW
      DELETE FROM FLIGHTAVAILABILITY WHERE FLIGHT_ID = OLD.FLIGHT_ID;

Note: Derby ディベロッパーズ ガイドにはより多くの例が書かれています。
トリガの再帰
トリガの再帰は最大16までです。
関連する情報
現在の時刻や現在のユーザを返す特殊システム関数は、トリガを作成したときではなく、トリガが発火したときに評価されます。このような関数には以下のものがあります。

• |  | CURRENT_DATE関数
• |  | CURRENT_TIME関数
• |  | CURRENT_TIMESTAMP関数
• |  | CURRENT_USER関数
• |  | SESSION_USER関数
• |  | USER関数

参照節:

    REFERENCING
    {
    { OLD | NEW } [ ROW ] [ AS ] correlation-Name [ { OLD | NEW } [ ROW ] [ AS ] correlation-Name ] |
    { OLD TABLE | NEW TABLE } [ AS ] Identifier [ { OLD TABLE | NEW TABLE } [AS] Identifier ]  |
    { OLD_TABLE | NEW_TABLE } [ AS ] Identifier [ { OLD_TABLE | NEW_TABLE } [AS] Identifier ]
    }

Note: OLD_TABLE | NEW_TABLEは、後方互換性及びDB2との互換性のための構文です。これはSQL標準に沿っていないので非推奨です。
CREATE VIEW 文
ビューとはクエリにより定義された仮想的な表です。表は破棄するまで利用可能なディクショナリの情報です。ビューは更新できません。
限定されたビューの名前にて、スキーマ名はSYSで始まってはなりません。
ビューの所有者は自動的にSELECT権限を得ます。ビューの所有者からSELECT権限を剥奪することはできません。データベースの所有者は自動的にビューへのSELECT権限を持ち、SELECT権限を他のユーザに付与することができます。データベースの所有者からSELECT権限を剥奪することはできません。
ビューの所有者はビューが参照する情報を所有する場合のみ、他のユーザにSELECT権限を付与することができます。
ビューの所有者が、ビューが参照する情報を所有していない場合、ビューの所有者は適切な権限を付与されていなければなりません。例えば、user2という認証識別子がuser1.t1という表とuser1.f_abs()という関数を参照する、user2.v2というビューを作成する場合、user2はuser1.t1へのSELECT権限とuser1.f_abs()へのEXECUTE権限を持たなければなりません。.
SELECT権限を付与する権限は剥奪できません。ビューが参照する情報への必要な権限が剥奪された場合、ビューは破棄されます。
構文

    CREATE VIEW ビュー名
        [ ( 単純列名 [, 単純列名] * ) ]
    AS 問い合わせ

ビューの定義にビューの列一覧を書くことで、ビューの列に明示的な名前を与えることができます。 ビューの列一覧がない場合、ビューの列名は元となる問い合わせの列名を引継ぎます。ビューの全列は一意な名前を持たなければなりません。

    CREATE VIEW SAMP.V1 (COL_SUM, COL_DIFF)
    	AS SELECT COMM + BONUS, COMM - BONUS
    	FROM SAMP.EMPLOYEE;

    CREATE VIEW SAMP.VEMP_RES (RESUME)
    	AS VALUES 'Delores M. Quintana', 'Heather A. Nicholls', 'Bruce Adamson';

    CREATE VIEW SAMP.PROJ_COMBO
    	(PROJNO, PRENDATE, PRSTAFF, MAJPROJ)
    	AS SELECT PROJNO, PRENDATE, PRSTAFF, MAJPROJ
    	FROM SAMP.PROJECT UNION ALL
    SELECT PROJNO, EMSTDATE, EMPTIME, EMPNO
    	FROM SAMP.EMP_ACT
    	WHERE EMPNO IS NOT NULL;

文の依存
ビューの定義は参照する表やビューに依存します。 ビューを参照するDML(data manipulation language)文は、ビューが依存するのと同様に、そのビューに依存します。 ビューを参照する文は、ビューが利用する索引に依存します。この索引は問い合わせがどのように最適化されるかに応じて文毎に異なります。 例を以下に挙げます。

    CREATE TABLE T1 (C1 DOUBLE PRECISION);

    CREATE FUNCTION SIN (DATA DOUBLE)
    	RETURNS DOUBLE EXTERNAL NAME 'java.lang.Math.sin'
    	LANGUAGE JAVA PARAMETER STYLE JAVA;

    CREATE VIEW V1 (C1) AS SELECT SIN(C1) FROM T1;

文とそれが依存するデータベースの情報を挙げます。

    SELECT * FROM V1

V1というビュー、T1という表、 外部のスカラー関数のSIN
DECLARE GLOBAL TEMPORARY TABLE 文
The DECLARE GLOBAL TEMPORARY TABLE statement defines a temporary table for the current connection.
これらの表はシステムカタログにあるものではなく永続的なものではありません。一時表は作成した接続の期間のみ存在して、他の接続から参照することはできません。接続が閉じるとき、 表中の行は削除され、一時表に関するメモリ上の記述は破棄されます。
一時表は以下のような場合に便利です。

• |  | 表の構造がアプリケーションを使う前では分からない場合
• |  | 他のユーザが同様な構造の表を必要としない場合
• |  | アプリケーションを使っている場合のみ、一時表の情報が必要な場合
• |  | システムカタログにロックを持たずに、表の定義と破棄が可能な場合

構文

    DECLARE GLOBAL TEMPORARY TABLE 表名
        { 列定義 [ , 列定義 ] * }
    [ ON COMMIT {DELETE | PRESERVE} ROWS ]
    NOT LOGGED [ON ROLLBACK DELETE ROWS]

表名
一時表の名前です。SESSION以外のスキーマ名が指定された場合、エラーが発生します。(SQLSTATE 428EK) スキーマ名が指定されなかった場合、SESSIONがあてられます。 複数の接続で同じ名前の一時表を作ることができます。なぜならそれぞれの接続は個々に一意な表の記述子を持つからです。
SESSIONを永続的な表のスキーマとして使ってもエラーにはなりませんが推奨しません。 SESSIONというスキーマ名は一時表のスキーマ用に予約されています。
列定義
列定義の詳細については列定義のCREATE TABLEを参照してください。 DECLARE GLOBAL TEMPORARY TABLEでは列定義に発番列仕様は不可能です。
データ型
可能なデータ型は以下のとおりです。

• |  | BIGINT
• |  | CHAR
• |  | DATE
• |  | DECIMAL
• |  | DOUBLE
• |  | DOUBLE PRECISION
• |  | FLOAT
• |  | INTEGER
• |  | NUMERIC
• |  | REAL
• |  | SMALLINT
• |  | TIME
• |  | TIMESTAMP
• |  | VARCHAR

ON COMMIT
COMMITが行われたときのアクションを指定します。
DELETE ROWS
表に開いたカーソルが無ければ、表中の全ての行が削除されます。これはON COMMITの既定です。 もしON ROLLBACK DELETE ROWSを指定した場合は、一時表が使われた場合のみ全ての行が削除されます。 ON COMMIT DELETE ROWSを指定した場合は、一時表が使われなかった場合でも表の行が削除されます(開いたカーソルが無かった場合です。)。
PRESERVE ROWS
表の行は留め置かれます。
NOT LOGGED
トランザクションがロールバックされたとき、一時表に行われるアクションを指定します。 ROLLBACK(あるいはROLLBACK TO SAVEPOINT)が行われると、作業単位(もしくはセーブポイント)にて表が作られていれば、その表は破棄されます。もし作業単位(もしくはセーブポイント)にて表が破棄された場合、行のない表が復元されます。
ON ROLLBACK DELETE ROWS
これはNOT LOGGEDの既定です。NOT LOGGED [ON ROLLBACK DELETE ROWS ]]により、ROLLBACKあるいはROLLBACK TO SAVEPOINTが行われたとき一時表に行われる処理が指定されます。もし表の情報が変更されていれば、全行が削除されます。
例

    set schema myapp;

    create table t1(c11 int, c12 date);

    declare global temporary table SESSION.t1(c11 int) not logged;
    -- 一時表はSESSIONスキーマにしか置かれないので、
    -- SESSIONによる限定は冗長です。
    declare global temporary table t2(c21 int) not logged;
    -- 一時表はSESSIONスキーマにしか置かれないので、
    -- この例ではSESSIONにより限定しません。

    insert into SESSION.t1 values (1);
    -- 現在のスキーマが"myapp."なので、一時表を使うにはSESSIONによる限定が必須です。

    select * from t1;
    -- 表がSESSIONにより限定されていないので、
    -- このselect文の"myapp.t1"は実表を参照します。

Note: 一時表はSESSIONスキーマにのみ定義できます。 ユーザはSESSIONという名前の実スキーマを定義するべきではありません。
次のDB2 UDBにて可能なDECLARE GLOBAL TEMPORARY TABLE関数は、Derbyにて使えません。

• |  | IDENTITY column-options
• |  | IDENTITY attribute in copy-options
• |  | AS (fullselect) DEFINITION ONLY
• |  | NOT LOGGED ON ROLLBACK PRESERVE ROWS
• |  | IN tablespace-name
• |  | PARTITIONING KEY
• |  | WITH REPLACE

Declared Global Temporary Tablesの制限事項
Derbyでは一時表に次の機能を提供していません。 これらの機能の幾つかは一時表特有のものであり、幾つかはDerby特有のものです。
以下の文では一時表を指定できません。

• |  | ALTER TABLE
• |  | CREATE INDEX
• |  | CREATE SYNONYM
• |  | CREATE TRIGGER
• |  | CREATE VIEW
• |  | GRANT
• |  | LOCK TABLE
• |  | RENAME
• |  | REVOKE

一時表には次の機能を使えません。

• |  | SESSIONスキーマにある表(実表と一時表を含みます)への別名、トリガ、ビュー
• |  | SESSIONスキーマにある表を参照する文のキャッシュ
• |  | 一時表は外部キー制約や主キー制約で指定できない。
• |  | トリガされるSQL文では一時表を参照できません。
• |  | 列のチェック制約
• |  | 発番列仕様
• |  | 一時表へのインポート

一時表への挿入、更新、削除の文にてエラーが起きた場合、一時表の全ての行は削除されます。
一時表にて以下のデータ型は利用できません。

• |  | BLOB
• |  | CHAR FOR BIT DATA
• |  | CLOB
• |  | LONG VARCHAR
• |  | LONG VARCHAR FOR BIT DATA
• |  | VARCHAR FOR BIT DATA
• |  | XML

DELETE 文
構文

    {
        DELETE FROM 表名
            [WHERE 節] |
        DELETE FROM 表名 WHERE CURRENT OF
    }

一つ目の書き方は、検索による削除と呼ばれ、表名とWHERE 節により絞り込まれた行が削除されます。
二つ目の書き方は、位置による削除と呼ばれ、更新可能なカーソルで現在開いている行が削除されます。更新可能なカーソルについてはSELECT 文を参照してください。
例

    DELETE FROM SAMP.IN_TRAY

    stmt.executeUpdate("DELETE FROM SAMP.IN_TRAY WHERE CURRENT OF " +
    	resultSet.getCursorName());

文の依存
検索による削除では、文が更新する表やそのコングロマリット(ヒープや索引のような記録の単位)に、文が依存します。準備された検索による削除文が対象とする表のCREATEやDROP INDEX文は、その準備された検索による削除文を無効とします。
位置による削除では、文がカーソルやカーソルが参照する表に依存します。たとえまだカーソルが開いてなくても、位置による削除の文はコンパイル可能です。それでも、JDBCのcloseメソッドにより開いたカーソルが取り除かれると、位置による削除の文は無効になります。
準備された位置による削除の文が対象とする表のCREATEやDROP INDEX文は、その準備された位置による削除の文を無効とします。
DROP文
関数、索引、手続、スキーマ、別名、表、トリガ、ビューのDrop文が使えます。
DROP FUNCTION 文
構文

    DROP FUNCTION 関数名

破棄する関数を指定します。指定した関数名の関数がスキーマにて一つのみ見つかった場合に有効です。指定された関数はいくつ引数を持っていてもかまいません。指定された名前の関数がスキーマに見つからなかった場合はエラーとなります。(SQLSTATE 42704) 指定された名前やスキーマの関数が複数見つかった場合もエラーとなります。
DROP INDEX 文
DROP INDEX で指定した索引は破棄されます。
構文

    DROP INDEX 索引名

    DROP INDEX OrigIndex

    DROP INDEX DestIndex

文の依存
破棄しようとしている索引があるテーブルに、開いているカーソルがある場合、DROP INDEX 文はエラーとなって、索引は破棄されません。索引が破棄された場合には、破棄された索引の表に依存している文は無効となります。
DROP PROCEDURE 文
構文

    DROP PROCEDURE 手続名

指定した手続名により破棄する手続がスキーマに一つだけ見つかったとき有効です。 見つかった手続きには引数がいくつあってもかまいません。 指定された名前でスキーマに手続きが見つからなかった場合はエラーとなります。(SQLSTATE 42704) また手続きがスキーマに複数見つかった場合もエラーとなります。
DROP SCHEMA 文
DROP SCHEMA 文によりスキーマを破棄できます。 破棄するスキーマは空で無ければなりません。
APPスキーマ(既定のユーザスキーマです。)やSYSスキーマは破棄できません。
構文

    DROP SCHEMA スキーマ名 RESTRICT

RESTRICTキーワードによりデータベースから破棄しようとするスキーマには、情報があってはならないことを指定します。このRESTRICTキーワードは必須です。

    -- SAMP スキーマを破棄します。
    -- SAMPスキーマをデータベースから削除できるのは、
    -- スキーマに情報が定義されていないときのみです。
    DROP SCHEMA SAMP RESTRICT

DROP SYNONYM 文
表やビューの別名を破棄します。
構文

    DROP SYNONYM 別名名

DROP TABLE 文
DROP TABLE により表を破棄できます。
構文

    DROP TABLE 表名

文の依存
表のトリガ、制約(主キー、一意、チェック、破棄する表から参照)や索引は、暗黙裡に削除されます。破棄しようとした表に開いたカーソルがあった場合、DROP TABLEはエラーとなり表は破棄されません。
表を破棄すると、その表に依存する文が無効となります。(無効となった文は次回の実行で再コンパイルされます。依存関係を参照してください。)
DROP TRIGGER 文
DROP TRIGGER removes the specified trigger.
構文

    DROP TRIGGER トリガ名

    DROP TRIGGER TRIG1

文の依存
表が破棄されたとき、その表のトリガは自動的に破棄されます。(表を破棄する前に表のトリガを破棄する必要はありません。)
DROP VIEW 文
指定したビューを破棄します。
構文

    DROP VIEW ビュー名

    DROP VIEW AnIdentifier

文の依存
ビューを参照する文は、ビューが破棄されたときに無効になります。ビューに開いたカーソルがある場合、DROP VIEWは実行できません。ビューが依存している情報を破棄する前に、ビューは破棄されなければなりません。
GRANT 文
GRANT 文を使って、データベースにある情報の操作権限を、指定した一人あるいは全ユーザに与えることができます。
次の権限を与えることができます。

• |  | 表からの情報の削除
• |  | 表への情報の挿入
• |  | 表あるいは表にある列の部分集合への外部キー制約の作成
• |  | 表やビュー、表にある列の部分集合からの情報の選択
• |  | 表へのトリガーの作成
• |  | 表あるいは表にある列の部分集合の情報の更新
• |  | 関数あるいは手続きの実行

GRANT文を発行する前に、derby.database.sqlAuthorization属性がtrueであることを確認してください。derby.database.sqlAuthorization属性により、SQL認証が有効になります。
ユーザに権限付与が認められている情報であれば、その情報への権限をユーザは与えることができます。 詳細については、権限を与えようとしている情報に対応したCREATE文の説明文を読んでください。
GRANT文の書き方は、表に対する権限付与なのか、それともプログラムルーチンに対する権限付与なのかにより、その構文が異なります。
表の場合の構文

    GRANT 権限タイプ ON [TABLE] { 表名 | ビュー名 } TO 権限を与えられる人

プログラムルーチンの場合の構文

    GRANT EXECUTE ON { FUNCTION | PROCEDURE } プログラムルーチンの指示子 TO 権限を与えられる人

表権限

      DELETE |
      INSERT |
      REFERENCES [列一覧] |
      SELECT [列一覧] |
      TRIGGER |
      UPDATE [列一覧]

列一覧

      ( 列識別子 {, 列識別子}* )

ALL PRIVILEGES権限により指定した表へのすべての権限をユーザに付与します。権限の並びを指定して、表への一つ以上の権限を付与することも可能です。
DELETE権限により指定した表から行を削除する権限を付与します。
INSERT権限により指定した表に行を挿入する権限を付与します。
REFERENCES権限により指定した表への外部キー参照を作成する権限を付与します。REFERENCESに合わせて列並びが指定された場合、指定した列への外部キー参照だけが許可されます。
SELECT権限により表あるいはビューでSELECT文を行う権限が付与されます。もしSELECT権限で列の並びが指定された場合、それらの列にのみ権限は有効です。列の並びが指定されなかった場合、表の全列について権限は有効です。
TRIGGER権限により指定した表にトリガを作成する権限が付与されます。
UPDATE権限により指定した表にUPDATE文を使う権限が付与されます。列の並びが指定された場合、権限は指定された列にのみ有効です。WHERE節のある文で行を更新する場合、更新する行にある列へのSELECT権限も必要です。
権限を与えられる人

    {	認証識別子 | PUBLIC } [,{ 認証識別子 | PUBLIC } ] *

特定のユーザまたは全ユーザに権限を与えることができます。 PUBLIC というキーワードは全ユーザをあらわします。PUBLICが与えられた場合、現存するユーザのみならず、以降に作成されたユーザにも権限が与えられます。 PUBLICに与えられた権限と、個々のユーザに与えられた権限は、独立しています。 例えば、tという表へのSELECT権限が、PUBLICとharryという認証識別子に対して与えられているとしましょう。この場合は、harryという認証識別子からSELECT権限が剥奪されたとしても、HarryはPUBLICの権限を通して、tという表を操作可能です。
プログラムルーチンの指示子

    {
    	関数名 | 手続きの名前
    }

例
tという表へのSELECT権限をmaria と harryという認証識別子に与えるには、次のように書きます。

    GRANT SELECT ON TABLE t TO maria,harry

tという表へのUPDATEとTRIGGER権限を、anitaとzhiという認証識別子に与えるには、次のように書きます。

    GRANT UPDATE, TRIGGER ON TABLE t TO anita,zhi

s.vという表へのSELECT権限を全てのユーザに与えるには、次のように書きます。

    GRANT SELECT ON TABLE s.v to PUBLIC

pという手続きの実行権限を、georgeという認証識別子に与えるには、次のように書きます。

    GRANT EXECUTE ON PROCEDURE p TO george

INSERT 文
INSERT文により一つ以上の行を作成して、指定した名前の表に格納できます。 INSERT文で指定された値の数は、指定された列あるいは暗示された列の数と同じでなければなりません。
構文

    INSERT INTO 表名
        [ (単純列名 [ , 単純列名]* ) ]
    	  問合せ

問合せには以下のいずれかをとることができます。

• |  | 選択式
• |  | VALUES一覧
• |  | 複数行VALUES式 単一行あるいは複数行の一覧には、DEFAULTというキーワードを含めることができます。列にDEFAULTを指定すると、その列には既定値が挿入されます。列に既定値を挿入する場合、列の一覧にてその列を省略して、表のほかの列に値を挿入することもできます。詳細についてはVALUES式を参照してください。
• |  | UNION式

問合せの詳細については、問合せを参照してください。

    INSERT INTO COUNTRIES
          VALUES ('Taiwan', 'TW', 'Asia')

    -- DEPARTMENTという表に新しい部署を挿入します。
    -- ただし、新しい部署に新しい管理者は割り当てません。
    INSERT INTO DEPARTMENT (DEPTNO, DEPTNAME, ADMRDEPT)
    	VALUES ('E31', 'ARCHITECTURE', 'E01')
    -- 2つの新しい部署を一つの文で前と同じようにDEPARTMENTという表に挿入します。
    -- ただし、新しい部署に新しい管理者は割り当てません。
    INSERT INTO DEPARTMENT (DEPTNO, DEPTNAME, ADMRDEPT)
    	VALUES ('B11', 'PURCHASING', 'B01'),
    	('E41', 'DATABASE ADMINISTRATION', 'E01')
    --  EMP_ACTと同じ列を持つ、MA_EMP_ACTという
    -- 一時表を作ります。
    -- MA_EMP_ACTにEMP_ACTという表から、
    -- プロジェクト番号(PROJNO)が'MA'という文字で始まる行をロードします。
    CREATE TABLE MA_EMP_ACT
        (
    	EMPNO CHAR(6)  NOT NULL,
    	PROJNO CHAR(6)  NOT NULL,
    	ACTNO SMALLINT  NOT NULL,
    	EMPTIME DEC(5,2),
    	EMSTDATE DATE,
    	EMENDATE  DATE
        );

    INSERT INTO MA_EMP_ACT
    	SELECT * FROM EMP_ACT
    	WHERE SUBSTR(PROJNO, 1, 2) = 'MA';
    -- LOCATIONという列にDEFAULTの値を挿入します。
    INSERT INTO DEPARTMENT
          VALUES ('E31', 'ARCHITECTURE', '00390', 'E01', DEFAULT)

文の依存
INSERT 文は挿入先の表や、その表の全てのコングロマリット(ヒープや索引などの記録の単位です。)や、文中のその他の表に依存します。準備されたINSERT文の対象表にて、索引や制約を作成したり破棄したりすると、その準備されたINSERT文は無効となります。
LOCK TABLE 文
LOCK TABLE文により明示的に、表に共有あるいは排他のロックをかけることができます。 表へのロックは現在のトランザクションが終了するまでの間、続きます。
表をロックできるのは、データベースの所有者と表の所有者です。
明示的な表へのロックは次の場合に便利です。

• |  | 表の複数行へのロックによるオーバーヘッドを避ける時。(言い換えればユーザ自ら、ロックエスカレーションを行う時。)
• |  | デッドロックを避ける時

この文でシステム表にロックをかけることはできません。
構文

    LOCK TABLE 表名 IN { SHARE | EXCLUSIVE } MODE

いずれのモードであっても、トランザクションは表をロックした後、それ以上の行ごとのロックを得ることはできません。例えば、情報を読むためにトランザクションがFlightsという表の全体を共有モードでロックした後、ある文にて行を更新するために特定の行への排他ロックを必要としたとします。しかしながら、既にFlights表へのロックがあるため、排他ロックも表毎となる必要があります。
他の接続が表に対して既にロックをかけているため、その表へのロックが取得できない場合、デッドロックのタイムアウト時間が経過した後、文への例外が発生します。(SQLState X0X02)
例
行毎のロックが多量に発生することを避けるため、共有モードでFlightsという表全体へのロックを行うには以下の文を使います。

    LOCK TABLE Flights IN SHARE MODE;
    SELECT *
    FROM Flights
    WHERE orig_airport > 'OOO';

複数のUPDATE文を発行するトランザクションが一つあるとします。 個々の文はわずかな行毎のロックしか必要としないので、トランザクションはロックを表毎に変更しません。しかしUPDATE文の数が多いので、取得と開放が行われるロックの延べ数は多くなり、デッドロックになりかねません。 このようなトランザクションでは、最初に排他モードで表をロックします。 例を以下に示します。

    LOCK TABLE FlightAvailability IN EXCLUSIVE MODE;
    UPDATE FlightAvailability
    SET economy_seats_taken = (economy_seats_taken + 2)
    WHERE flight_id = 'AA1265' AND flight_date = DATE('2004-03-31');

    UPDATE FlightAvailability
    SET economy_seats_taken = (economy_seats_taken + 2)
    WHERE flight_id = 'AA1265' AND flight_date = DATE('2004-04-11');

    UPDATE FlightAvailability
    SET economy_seats_taken = (economy_seats_taken + 2)
    WHERE flight_id = 'AA1265' AND flight_date = DATE('2004-04-12');

    UPDATE FlightAvailability
    SET economy_seats_taken = (economy_seats_taken + 2)
    WHERE flight_id = 'AA1265' AND flight_date = DATE('2004-04-15');

トランザクションが表を更新する前に、その表をみる必要がある場合、デッドロックを避けるため、表に排他ロックをかけます。 例:

    LOCK TABLE Maps IN EXCLUSIVE MODE;
    SELECT MAX(map_id) + 1 FROM Maps;
    -- INSERT INTO Maps . . .

RENAME 文
索引や列、表にRENAME 文を使えます。
RENAME COLUMN 文
RENAME COLUMN 文で表にある列の名前を変更できます。
RENAME COLUMN文により全てのスキーマにある既存表の既存列の名前を変更できます。(SYSのスキーマを除きます。)
列の名前を変えることができるのは、データベースの所有者あるいは表の所有者のみです。
表への他の定義変更は可能です。詳細は、ALTER TABLE 文を参照してください。
構文

    RENAME COLUMN 表名.単純列名 TO 単純列名

例
employeeという表にあるmanagerという列の名前を supervisorに変更するには次のようにします。

    RENAME COLUMN EMPLOYEE.MANAGER TO SUPERVISOR

ALTER TABLEとRENAME COLUMNを使って、列のデータ型を変更できます。 tという表にあるc1という列のデータ型をNEWTYPEに変更するためには、次のようにします。

        ALTER TABLE t ADD COLUMN c1_newtype NEWTYPE
        UPDATE t SET c1_newtype = c1
        ALTER TABLE t DROP COLUMN c1
        RENAME COLUMN t.c1_newtype TO c1

利用上の留意点
Note: 列を参照するビューやトリガ、チェック制約、外部キー制約がある場合、列名の変更は失敗します。
Note: 名称を変更する列を参照する、開いたカーソルがある場合、RENAME COLUMN文は実行できません。
Note: 列への索引があっても、列の名前は変更できます。索引は更新されて、変更後の列名で参照するようになります。
RENAME INDEX 文
この文で、現在のスキーマにある索引の名前を変更できます。 ユーザはSYSスキーマにある索引の名前を変更できません。
構文

    RENAME INDEX 索引名 TO 新索引名

    RENAME INDEX DESTINDEX TO ARRIVALINDEX

文の依存
開いたカーソルがある索引には、RENAME INDEX を実行できません。
RENAME TABLE 文
RENAME TABLEによりあらゆるスキーマにある既存の表の名前を変更できます。(ただしSYSのスキーマは除きます。)
表の名前を変更できるのはデータベースの所有者と表の所有者です。
構文

    RENAME TABLE 表名 TO 新表名

表を参照するビューや外部キーがあった場合、名前を変えようとするとエラーが発生します。 さらに、表にトリガやチェック制約があった場合も、名前を変えようとするとエラーが発生します。

    RENAME TABLE SAMP.EMP_ACT TO EMPLOYEE_ACT

詳細については、ALTER TABLE 文も参照してください。
文の依存
表に索引が定義されていても、表の名前は変更可能です。
名前を変更しようとする表に、開いたカーソルがあった場合、RENAME TABLE文は失敗します。
REVOKE 文
REVOKE文を使って、指定したユーザあるいは全ユーザから、データベースの情報に対して操作を行う権限を剥奪することができます。
剥奪できる権限には次の種類があります。

• |  | 表から情報を削除する。
• |  | 表に情報を挿入する。
• |  | 表や表にある列の部分集合に対して、外部キー参照を作成する。
• |  | 表やビュー、表の列の部分集合から、情報を選択する。
• |  | 表にトリガを作成する
• |  | 表や表にある列の部分集合にある情報を更新する。
• |  | 関数や手続きなどのプログラムルーチンを実行する。

REVOKE文を発行する前に、derby.database.sqlAuthorization属性がtrueであることを確認してください。derby.database.sqlAuthorization属性により、SQL認証が有効になります。
情報の所有者かデータベースの所有者であれば、その情報への権限を剥奪する事ができます。
REVOKE文の使い方は、表への権限を剥奪するのか、プログラムルーチンへの権限を剥奪するのかにより異なります。
表の場合の使い方

    REVOKE 権限タイプ ON [ TABLE ] { 表名 | ビュー名 } FROM 権限を与えられていた人

列の一覧を指定せずに権限を剥奪した場合、表の全ての列への権限が剥奪されます。
プログラムルーチンの場合の使い方

    REVOKE EXECUTE ON { FUNCTION | PROCEDURE } プログラムルーチンの指示子 FROM 権限を与えられていた人 RESTRICT

プログラムルーチンにREVOKE文を使う場合、RESTRICT節が必要です。RESTRICT節は、実行権限がビューや表、制約からは剥奪されない一方で、ビューや表、制約の所有者からは剥奪されることを表します。
権限タイプ

    ALL PRIVILEGES |
      各種権限

各種権限

    表権限 {, 表権限 }*

表権限

      DELETE |
      INSERT |
      REFERENCES [列一覧] |
      SELECT [列一覧] |
      TRIGGER |
      UPDATE [列一覧]

列一覧

      ( 列識別子 {, 列識別子}* )

権限タイプのALL PRIVILEGESは、表への全ての権限をユーザから剥奪する時に使います。各種権限を指定して、表への一つ以上の権限を剥奪することもできます。
DELETEの権限タイプは、表の行を削除する権限を剥奪するために使います。
INSERTの権限タイプは、表に行を挿入する権限を剥奪するために使います。
REFERENCESの権限タイプは、表への外部キー参照を作成する権限を剥奪するために使います。列一覧が指定された場合、その列群への外部キー参照を作成する権限だけが剥奪されます。
SELECTの権限タイプは、表またはビューの情報を選択する権限を剥奪するときに使います。列一覧が指定された場合、その列群への権限だけが剥奪されます。列一覧が指定されなかった場合、表の全列に対して操作が有効です。
TRIGGERの権限タイプは、表にトリガを作成する権限を剥奪するとめに使います。
UPDATEの権限タイプは、表にUPDATE文を実行する権限を剥奪するために使います。列一覧が指定された場合、その列群への権限だけが剥奪されます。
権限を与えられていた人

    {	認証識別子 | PUBLIC } [,{ authorization ID | PUBLIC } ] *

指定したユーザあるいは全ユーザから、権限の剥奪を行うことができます。全ユーザを指定するときは、PUBLICというキーワードを使います。PUBLICで剥奪される権限と、ユーザを指定して剥奪される権限は独立した物です。例を挙げましょう。表tへのSELECT権限が、PUBLICとharryという認証識別子の両方に与えられているとします。 ここで、harryという認証識別子からSELECT権限が剥奪されたとしても、harryという認証識別子はPUBLIC権限を通して、表tを操作可能です。
制約事項: 情報の所有者の権限を剥奪することはできません。
プログラムルーチンの指示子

      {
    		qualified-name [ signature ]
      }

剥奪された権限に連なる依存関係
剥奪された権限に依存しているビューやトリガ、制約等は自動的に削除されます。このときDerby は、剥奪された権限を他の権限で代替しようとしません。詳しくは、Derby ディベロッパーズ ガイドの"SQL standard authorization"を参照してください。
制限事項
REVOKE文には次の制限事項があります。
表毎の権限に関連した権限
表毎の権限に対応して、SYSTABLEPERMSシステム表に表IDと権限の付与先が記録されます。たとえば、user2に、表user1.t1のSELECTとDELETEの権限が付与された場合、SYSTABLEPERMS表には対応した行がひとつ追加されます。この行にのGRANTEE欄はuser2という値をとって、TABLEID欄はuser1.t1という値をとります。さらにSELECTPRIVとDELETEPRIVのそれぞれの欄の値はYをとります。それ以外の権限に対応した欄の値はNです。
権限を付与されたユーザが表へのいずれかの権限を必要とする情報をデータベースに作成すると、Derby のエンジンは、その情報がSYSTABLEPERMSにある特定の行へ依存していることを理解します。 例えば、user2がSELECT * FROM user1.t1という文でv1というビューを作成すると、ビューのv1と、GRANTEE欄がuser2でTABLEID欄がuser1.t1であるSYSTABLEPERMSの行との間に、管理対象となる依存関係があるとプログラムは理解します。ここで、プログラムはビューが特定の行に依存していることを理解しますが、その行にある権限に対応した欄のうち、どの欄に依存しているのかは理解していません。
そのせいで、表毎の権限を剥奪するREVOKE文が発行されると、その権限と同じ表IDとユーザの組み合わせを持つ権限に依存したデータベース上の情報は全て削除されてしまいます。例で説明すると、user1がuser2から表t1のDELETE権限を剥奪すると、SYSTABLEPERMS表のGRANTEE欄にuser2をとりTABLEID欄にuser1.t1をとる行がREVOKE文により更新されます。このとき依存関係の管理機能により、その行に記録されたDELETE権限には依存していないにもかかわらず、権限の剥奪による無効化のメッセージがuser2.v1にも送信されるので、このビューは削除されてしまいます。
列毎の権限に関連した制限
SYSCOLPERMSシステム表の行毎に、権限の付与先と表IDの組み合わせに許可された権限をひとつだけ記録することができます。たとえば、user2に表user1.t1にあるc12とc13という列のSELECT権限が与えられた場合、SYSCOLPERMSには行がひとつ追加されます。この行はGRANTEE欄の値にuser2をとり、TABLEID欄の値にuser1.t1をとり、TYPE欄の値にSをとり、COLUMNS欄の値にはc12, c13をとります。
表の列の集合に権限を付与されたユーザが、その権限に依存した情報をデータベースに作成した場合、Derbyは、その情報とSYSCOLPERMS表の対応した行の間の依存関係を理解して管理下に起きます。例えばuser2がSELECT c11 FROM user1.t1という文により、v1という行を作成すると、プログラムはGRANTEE欄がuser2でTABLEID欄がuser1.t1、TYPE欄がSであるSYSCOLPERMS表の行に、v1が依存することを理解して、その依存関係を管理下に置きます。このとき、プログラムはビューがSELECT権限に依存することは理解しますが、ビューがどのカラムに依存しているかは追跡しません。
REVOKE文がカラムごとの権限に対して発行されると、その権限の権限付与先、テーブルID、権限の種類に依存したデータベース上の情報が削除されます。例で説明すると、user1がuser2から、表user1.t1の列c12へのSELECT権限を剥奪すると、GRANTEE欄がuser2でTABLEIDがuser1.t1、TYPE欄がSのSYSCOLPERMSにある行が、REVOKE文により更新されます。このとき依存関係の管理機能により、c12 という列には依存していないにもかかわらず、権限の剥奪による無効化のメッセージがuser2.v1というビューにも送信されるので、このビューは削除されてしまいます。
権限剥奪の例
表tへのSELECT権限を、mariaとharryという認証識別子から剥奪する場合、次のように文を書きます。

    REVOKE SELECT ON TABLE t FROM maria,harry

表tへのUPDATE、TRIGGER権限をanitaとzhiという認証識別子から剥奪する場合、次のように文を書きます。

    REVOKE UPDATE, TRIGGER ON TABLE t FROM anita,zhi

表s.vへのSELECT権限を全ユーザから剥奪する場合、次のように文を書きます。

    REVOKE SELECT ON TABLE s.v FROM PUBLIC

表s.vのc1とc2という列へのUPDATE権限を全てのユーザから剥奪する場合、次のように文を書きます。

    REVOKE UPDATE (c1,c2) ON TABLE s.v FROM PUBLIC

pという手続きへのEXECUTE権限を、georgeという認証識別子から剥奪する場合、次のように文を書きます。

    REVOKE EXECUTE ON PROCEDURE p FROM george RESTRICT

SET 文
Set文で、スキーマと分離レベルを設定できます。
SET ISOLATION 文
SET ISOLATION文により接続の分離レベルを変更することができます。とることのできる分離レベルはSERIALIZABLE、REPEATABLE READ、READ COMMITTED、READ UNCOMMITTEDです。
この文を発行すると現在のトランザクションは常にコミットされます。JDBCのjava.sql.Connection.setTransactionIsolationメソッドは、唯一つの例外を除き、このコマンドとほぼ同じものです。組込みのドライバを使ってjava.sql.Connection.setTransactionIsolationを呼んだ場合、分離レベルを変更しなければ(つまり現在の値を分離レベルとして設定した場合)、現在のトランザクションはコミットされません。
分離レベルについての情報は、Derby ディベロッパーズ ガイドにある、"ロック、同時平行度、分離"を参照してください。JDBCのjava.sql.Connection.setTransactionIsolationメソッドについては、java.sql.Connection.setTransactionIsolation メソッドを参照してください。
構文

    SET [ CURRENT ] ISOLATION [ = ]
    {
    UR | DIRTY READ | READ UNCOMMITTED
    CS | READ COMMITTED | CURSOR STABILITY
    RS |
    RR | REPEATABLE READ | SERIALIZABLE
    RESET
    }

    set isolation serializable;

SET SCHEMA 文
SET SCHEMA 文により、接続の既定スキーマを指定したスキーマに設定できます。 接続から発行される文にて対象のスキーマ名を明示的に指定しなかった場合、既定スキーマが対象のスキーマとなります。
SET SCHEMA文を成功裏に実行するためには、設定するスキーマが存在していなければなりません。 スキーマが存在していなければ、エラーとなります。CREATE SCHEMA 文を参照してください。
SET SCHEMA 文はトランザクション処理されません。それゆえSET SCHEMA 文が実行されると、トランザクションがロールバックされても、SET SCHEMA 文により変更されたスキーマのままです。
構文

    SET [CURRENT] SCHEMA [=]
    { スキーマ名|
    USER | ? | '<文字列定数>' } | SET CURRENT SQLID [=]
    {
    スキーマ名| USER | ? | '<文字列定数>' }

スキーマ名は最大で128文字からなる識別子です。スキーマ名は二重引用符で囲まれない限り、大文字小文字を区別しません。(例を挙げると、SYSはsYs、SYs、sysのいずれとも等価です。)
USERは現在のユーザです。現在のユーザが定義されていない場合、現在のスキーマは既定でAPPです。(接続にユーザ名が定義されている場合、そのユーザ名に対応したスキーマがあるなら、それが接続の既定のスキーマとなります。
? は準備された文で利用できる動的な引数です。SET SCHEMA文を準備して、異なるスキーマを値にとって実行することができます。このときスキーマの値は文字列定数と扱われ、大文字小文字が区別されます。例えば、APPを指定するには、"app"ではなく"APP"を使います。

    -- 以下の例は全て等価で、
    -- HOTELというスキーマがあれば動作します。
    SET SCHEMA HOTEL
    SET SCHEMA hotel
    SET CURRENT SCHEMA hotel
    SET CURRENT SQLID hotel
    SET SCHEMA = hotel
    SET CURRENT SCHEMA = hotel
    SET CURRENT SQLID = hotel
    SET SCHEMA "HOTEL" -- クォートされた識別子
    SET SCHEMA 'HOTEL' -- クォートされた文字列--小文字のhotelは存在しないので、
     --この例はエラーとなります。
    SET SCHEMA = 'hotel'
     --SQLIDはCURRENTとともに使わなければならないので、
     --この例は失敗します。
    SET SQLID hotel
     -- これによりスキーマは現在のユーザIDに設定されます。
    SET CURRENT SCHEMA USER
    // Javaのプログラムでset schemaを使う例です。
    PreparedStatement ps = conn.PrepareStatement("set schema ?");
    ps.setString(1,"HOTEL");
    ps.executeUpdate();
    ... do some work
    ps.setString(1,"APP");
    ps.executeUpdate();

    ps.setString(1,"app"); //error - string is case sensitive
    // no app will be found
    ps.setNull(1, Types.VARCHAR); //error - null is not allowed

SELECT 文
構文

    問合せ
    [ORDER BY 節]
    [FOR UPDATE 節]
    WITH {RR|RS|CS|UR}

SELECT文は問合せと、省略可能なORDER BY 節とFOR UPDATE 節から構成されます。 SELECT文は、問合せの最初の単語が一般的にSELECTなので、この名前が与えられています。(問合せは選択式以外にも、VALUES式、UNION、INTERSECT、EXCEPT式である場合があります。)
ORDER BY 節により、ResultSetの並び順が明示されます。FOR UPDATE 節により、結果のカーソルを更新可能にすることができます。SELECT文にはFOR EACH ONLY 節を置くことができます。FOR EACH ONLY 節とFOR READ ONLY節は同じものです。
SELECT文にてWITH {RR|RS|CS|UR}という書き方で分離レベルを指定することができます。
例

    -- SAL+BONUS+COMMと名前を並べて、TOTAL_PAYという名前をつけ、
    -- その名前で並び替える。
    SELECT FIRSTNME, SALARY+BONUS+COMM AS TOTAL_PAY
         FROM EMPLOYEE
         ORDER BY TOTAL_PAY
    -- FOR UPDATE節を指定することで、
    -- PROJECTという表にある、開始日時(PRSTDATE)、終了日時(PRENDATE)という列を更新する、
    -- 更新可能なカーソルを作成する
    SELECT PROJNO, PRSTDATE, PRENDATE
          FROM PROJECT
          FOR UPDATE OF PRSTDATE, PRENDATE
    -- この文に限り分離レベルをRRにする。
    SELECT *
    FROM Flights
    WHERE flight_id BETWEEN 'AA1111' AND 'AA1112'
    WITH RR

SELECT文はResultSetを返します。 カーソルはResultSetにある行へのポインタです。Javaのアプリケーションでは、ResultSetsには対応したSQLのカーソルがあります。カーソルは更新可能とすることができます。したがって、問合せが後に述べる更新可能の条件に適合するのであれば、ResultSetを通して行の更新や削除が可能です。FOR UPDATE 節により、SQLのコンパイル時にSELECT文が更新可能なカーソルの要件に適合するかを確かめる事や、あるいは列を更新可能なもののみに限定する事ができます。
Note: ORDER BY節によりSELECTの結果を並び替えることができます。ORDER BY節がない場合、結果は無作為な並び順です。
更新可能なカーソルおよびResultSetの要件
更新可能なカーソルは、単表への単純なSELECT文によるものでなければなりません。 更新可能なResultSetを得るためのSELECT文は、更新可能なカーソルと同じ制限を受けます。更新可能なカーソルとするためには、:

• |  | SELECT文にはORDER BY節があってはなりません。
• |  | 問合せは選択式でなければなりません。
• |  | 選択式には以下があってはなりません。
• |  | DISTINCT
• |  | 集約
• |  | GROUP BY 節
• |  | HAVING 節
• |  | ORDER BY 節
• |  | 問合せのFROM節には以下があってはなりません。
• |  | 二つ目以降の表
• |  | 表以外の名前
• |  | 選択式s
• |  | 副問い合わせ

Note: 既定でカーソルは読み取り専用です。更新可能なカーソルを得るためには、上記の要件を満たすことに加えて、ResultSetの同時並行モードをResultSet.CONCUR_UPDATABLEとするか、SELECT文のFOR節にFOR UPDATEを記述しなくてはなりません。(FOR UPDATE 節を参照してください。)
SQL言語ではカーソルに名前を与える事ができません。そのかわりにJDBC APIによりカーソルに名前を与えたり、システムがカーソルに与えた名前を取得することができます。詳細についてはDerby ディベロッパーズ ガイドのカーソルへの命名および名前の利用を参照して下さい。
文の依存
SELECTは、問合せの表やビュー、それらの表へのアクセスパスにて選択されたコングロマリット(ヒープやインデックスなどの記憶の単位です。)に依存します。 CREATE INDEXでは準備されたSELECT文が無効になることはありません。 DROP INDEX文ではもし破棄される索引が文にてアクセスパスなら、準備されたSELECT文は破棄されます。 もしSELECTにビューが含まれていれば、ビューが依存するディクショナリの情報にも依存します。(CREATE VIEW 文を参照してください。)
SELECTのカーソルに対して、準備されたUPDATE WHERE CURRENTあるいはDELETE WHERE CURRENT文はSELECTに依存します。java.sql.Statement.close によりSELECTを取り除くと、UPDATE WHERE CURRENT および DELETE WHERE CURRENTは無効となります。
SELECTは問合せにあるあらゆる別名に依存します。別名を破棄することにより、もし準備されたSELECT文にて別名が使われているなら、その文は無効になります。
UPDATE文
構文

    {
        UPDATE 表名
            SET 列名 = 値
            [ , 列名 = 値} ]*
            [WHERE節] |
        UPDATE 表名
            SET 列名 = 値
            [ , 列名 = 値 ]*
            WHERE CURRENT OF
    }

値の定義は以下の通りです。

    式 | DEFAULT

一つ目の書き方は検索による更新といい、WHERE節が真に評価される全行の一つ以上の列を更新します。
二つ目の書き方は位置による更新といい、更新可能な開いたカーソルの現在行の一つ以上の列を更新します。カーソルを作成するSELECT文のFOR UPDATE 節にて列が明示された場合、その列だけが更新可能です。もし列が明示されていないかSELECT文にFOR UPDATE節が無かった場合は、全ての列を更新できます。
更新後の値にDEFAULTを指定すると、表にて定義された既定値に列の値が設定されます。
例

    -- 'E21'の部署(WORKDEPT)にて管理者以外が一時的に再配属されている。
    -- このことを、EMPLOYEEという表の彼らの仕事(JOB)をNULLに、
    -- 彼らへの支払い(SALARY, BONUS, COMM)を0にしてあらわす。
    UPDATE EMPLOYEE
      SET JOB=NULL, SALARY=0, BONUS=0, COMM=0
      WHERE WORKDEPT = 'E21' AND JOB <> 'MANAGER'

    -- 特定の肩書きを持たない社員を管理者に昇格する。
    UPDATE EMPLOYEE
    	SET JOB = 'MANAGER'
    	WHERE JOB IS NULL;
    // 全てのプロジェクトの人員配置(PRSTAFF)を1.5増やす。
    stmt.executeUpdate("UPDATE PROJECT SET PRSTAFF = "
    "PRSTAFF + 1.5" +
    "WHERE CURRENT OF" + ResultSet.getCursorName());

    -- EMPLOYEEという表にて社員番号(EMPNO)が'000290'の社員の仕事(JOB)を、
    -- 既定値であるNULLに更新する。
    UPDATE EMPLOYEE
      SET JOB = DEFAULT
      WHERE EMPNO = '000290'

文の依存
検索による更新の文は、更新しようとしている表や、そのコングロマリット(ヒープや索引などの記録単位)、その制約、WHERE節やSET式に書かれた表に依存します。検索による更新の準備された文の対象表にCREATE INDEXやDROP INDEX文、ALTER TABLE文が実行されると、その文は無効となります。
位置による更新の文はカーソルやカーソルが参照する全ての表に依存します。カーソルがまだ開いていなくとも、位置による更新の文をコンパイルすることができます。しかしながらJDBCのcloseメソッドにより開いたカーソルをなくすと、位置による更新の文は無効となります。
位置による更新の準備された文の対象表に、CREATE INDEXやDROP INDEX文、ALTER TABLE文が実行されると、その文は無効となります。
別名を破棄すると、その別名を使っている更新の準備された文は無効になります。
更新の対象表にてトリガの破棄や作成が行われると、更新の文は無効になります。
SQL 節
CONSTRAINT 節
CONSTRAINT節は、CREATE TABLE 文やALTER TABLE 文に任意に記述できる構造です。制約とはデータが従わなければならない規則です。制約には必要に応じて名前を与えることができます。
制約は以下のいずれかです。

• |  | 列レベルの制約 列レベルの制約は表にある単一の列を参照します。列名を指定するわけではなりません。(ただしチェック制約は除きます。)この制約は対象の列を参照しています。
• |  | 表レベルの制約 表レベルの制約は表にある一つあるいはそれ以上の列を参照します。表レベルの制約は適用する列の名前を参照します。表レベルのチェック制約は0以上の列を参照します。

列制約には以下があります。

• |  | NOT NULL この列の値はNULLにできないことを指定します。(この種類の制約には名前を与えることができません。)
• |  | PRIMARY KEY 列により表中の行が一意に識別されることを指定します。列の値はNOT NULLと定義されなければなりません。 Note: ALTER TABLEにより主キーを追加しようとして、空の値を持つ列をその主キーに含めようとした場合、エラーとなって主キーは追加されません。より詳細な情報は、ALTER TABLE 文を参照してください。
• |  | UNIQUE 列の値が一意でなければならないと指定します。NULLの値は不可です。
• |  | FOREIGN KEY 列の値が、参照先の主キー、一意キーあるいはNULLでなければならないことを指定します。
• |  | CHECK 列の値の規則を指定します。

表制約には以下があります。

• |  | PRIMARY KEY 一つ以上の列により表の行が一意に識別されることを表します。NULLの値は不可です。
• |  | UNIQUE 列群の値が一意であると指定します。列はNOT NULLと定義されなければなりません。
• |  | FOREIGN KEY 列群の値が参照先の主キー、一意列あるいはNULLでなければならないことを指定します。 Note: 外部キーが複数の列から構成されている場合、何れかの列がNULLであるならキーはNULLと見なされます。NULLでない列にどのような値があっても、挿入することができます。
• |  | CHECK 表の値に適用される様々な規則を指定します。

列制約と表制約は同じ機能を持ちますが、何に対して指定できるかが違います。表制約では一つ以上の列に対して、PRIMARY KEY、UNIQUE、CHECK、FOREIGN KEY制約を定義できます。列レベルの制約では(チェック制約を除いて)、一つの列への参照しか定義できません。
構文
主キーと一意性制約
主キーでは表の行を一意に指定する列の集合が定義されます。
主キー制約を定義しした場合、主キーに含まれる何れの列の値もNULLであってはなりません。つまり何れの列もNULL値をとることができなくなります。
あらかじめNOT NULLと定義されているなら、既存の列をALTER TABLE ADD PRIMARY KEY という文で主キーに加えることができます。NULLの値は不可です。もし列にNULL値があれば、システムは主キー制約の追加を行いません。詳細な情報はALTER TABLE 文を参照してください。
表にはPRIMARY KEY制約を一つまでしか定義できません。しかし複数のUNIQUE制約を定義することはできます。
外部キー制約
外部キー制約により、データベースの参照整合性を強制することができます。外部キーとは他の表のキーを参照する列あるいは列群です。(時によってはあまり多いことではありませんが、同じ表を参照することもあります。)外部キーは参照先の主キー制約・外部キー制約に一致するデータ型を持つ列を持たなければなりません。
表レベルの外部キー制約では、表の列を指定して制約を定義します。このとき同じ列を一回より多く使うことはできません。
参照定義(参照される表の列の一覧です。)に列が定義される場合、それは参照先の表にある一意性制約あるいは主キー制約に対応していなければなりません。 もし表に一意性制約があるなら、参照定義では列の一覧を省くことができます。
もし参照定義にて列の一覧が指定されておらず、参照先の表に主キーも定義されていないならば、例外が挙がります。(この例外は、もし参照先の表に一意性制約しかないならば、その列の一覧を参照定義に含めなければならない、という意味です。)
参照先の一意性制約あるいは主キー制約に一致する値があれば、外部キー制約は守られているものとされます。もし外部キー制約が複数の列で定義されており、いずれかの列がNULLであるなら、外部キーの値はNULLとみなされます。
Note: SQL-92標準にて言及があるように、複数の列で定義された外部キー制約では、制約された列が参照先の列にない値をとることが可能な場合があります。この状況を回避するために外部キーの全列にはNOT NULL制約を定義するべきです。
外部キー制約とDML
有効になっている外部キー制約が定義された表に挿入や更新が行われるとき、Derbyはその行が外部キー制約を破っていないか知るために、参照先の表で対応する参照キーの値を調査します。 もし制約が守られていなければ、Derbyは例外を挙げて、挿入ないし更新を却下します。
参照されたキー(外部キーにより参照される、主キー制約あるいは一意制約)のある表の行を、更新または削除した場合、Derbyはそのキーを参照するすべての外部キー制約を調べて、行の削除や変更が制約違反を引き起こさないか調査します。 もし行への削除や変更が制約違反を引き起こすのであれば、変更や削除は許可されずDerbyは例外を挙げます。
Derbyが制約のチェックを行うのは文が実行される時です。トランザクションがコミットされる時ではありません。
支援する索引
UNIQUE、PRIMARY KEY、FOREIGN KEYの各制約は制約を強制あるいは支援するための索引を生成します。(これは支援索引と呼ばれることがあります。) UNIQUE制約とPRIMARY KEY制約は一意索引を生成します。FOREIGN KEY索引は非一意な索引を作成んします。したがって、列や列の集合にUNIQUE制約やPRIMARY KEY制約、FOREIGN KEY索引が定義されている場合は、パフォーマンス向上のための索引をそれらの列に作成する必要はありません。Derbyが代わりに作成してくれています。索引と制約も参照してください。
問い合わせを最適化される時にオプティマイザはこれらの索引を利用できます。(CREATE INDEX 文を参照してください。)またこれらの索引はシステムが自動的に生成した名前を持ちます。
支援索引はDROP INDEX文では破棄できません。制約を破棄するか、表を破棄する必要があります。
チェック制約
チェック制約は表の内容に関する様々な規則を指定するために利用することができます。チェック制約には(真偽式で記述される)検索条件を指定できます。表中の全行について、この検索条件は満たされていなければなりません。INSERTやUPDATEにより行が変更される時、検索条件は変更される行に対して適用されます。何れかのチェック制約に違反すると、文全体が中断されます。
検索条件の要件
チェック制約が列定義の一部として指定された場合、制約は同じ列のみ参照できます。 表の定義の一部として指定されたチェック制約は、CREATE TABLE文にて先立って定義された列を参照することができます。
検索条件は同じ値に適用された場合、常に同じ値を返す必要があります。したがって、以下のいずれも検索条件には置くことができません。

• |  | 動的なパラメータ (?)
• |  | 日時関数 (CURRENT_DATE、CURRENT_TIME、CURRENT_TIMESTAMP)
• |  | 副問い合わせ
• |  | ユーザー関数 (例えばUSER、SESSION_USER、CURRENT_USER)

参照先に従う動作
外部キーの定義にて、動作(CASCADE、RESTRICT、SET NULLおよびNO ACTION)が適切に書かれたON DELETE節や/とON UPDATE節を記述できます。 これらの節は、表の主キーが更新ないし削除されたときに、外部キーの関係が損なわれないように、対応する外部キーを変更したり、操作を拒絶したりする事を記述します。
参照性の制約の定義を行うとき、併せて更新または削除の規則を定義できます。
更新の規則は、親あるいは依存する表の行が更新されたときに適用されます。指定できるのは、NO ACTIONあるいはRESTRICTです。
親表の主キーの値が更新され、更新の規則がRESTRICTであった場合、Derbyは依存する表の外部キー制約を調べます。もし依存表の何れかの行が外部キー制約違反となるなら、トランザクションは巻き戻されます。
もし更新の規則がNO ACTIONであったなら、Derbyは更新が全て終わった後からトリガが実行される前に、依存する表の外部キー制約をチェックします。もし何れかの行が外部キー制約違反であるなら、文の実行は却下されます。
依存する表にある列の値が変更され、その値が外部キーの一部であった場合、更新の規則は暗黙裡にNO ACTIONとなります。NO ACTIONであるということは、外部キーが空ではない値に更新された時、更新後の値は親表の主キーと一致しなければならないことを意味します。もし親表の主キーと一致しないのであれば、文は却下されます。
削除の規則は親表の行が削除され、その行に依存する行が参照性制約の依存表にある場合に適用されます。このとき依存表の行も削除されることがあり、これを親表の削除が依存表に伝播したといいます。もし依存表が親表でもあるならば、今度はそこに定義された動作がその依存表に適用されます。
指定できる値は、NO ACTION、RESTRICT、CASCADE、それとSET NULLです。SET NULLは外部キーの何れかの列がnullの値を持つことができる場合のみ指定できます。
もし削除の規則が、
NO ACTIONならDerbyは依存表の外部キー制約を、削除が全て終わった後からトリガが実行される前にチェックします。もし依存表の何れかの行が外部キー制約に違反するなら文は却下されます。
RESTRICTなら、Derbyは依存表の外部制約を調べ、依存表の何れかの行が外部キー制約に違反する場合、トランザクションを巻き戻します。
CASCADEなら、削除が依存表に伝播されます。(適用可能な伝播先の依存表にも伝播します。)
SET NULLなら、依存表の外部キーにて空にできる列の値が空になります。(この場合も、依存表に依存する表にある外部キーの空にできる列の値は空になります。)
表を親とする参照性の制約には、個々の削除の規則があります。そして適用される全ての削除の規則によって、削除処理の結果が決まります。 したがって依存先がRESTRICTやNO ACTIONの参照性制約をもつなら、行は削除できません。 同様に削除が伝播してゆく場合でも、伝播先の依存行の参照性制約にて削除の規則がRESTRICTやNO ACTIONで定義されていれば、行を削除できません。
親の表から行を削除すると、ほかの表への影響があります。親表の削除により影響を受けるすべての表を、親表と削除の関係があるといいます。削除によりこれらの表の行に対して次のような影響が及びます。

• |  | もし削除の規則がRESTRICTあるいはNO ACTIONであれば、依存表は処理に関連しますが、処理の影響は受けません。(つまりDerbyは表の値を検証しますが、削除はしません。)
• |  | もし削除の規則がSET NULLであれば、親表の行が削除されたり、削除が伝播された場合、依存表の行の値は更新の対象となります。
• |  | もし削除の規則がCASCADEであれば、親表にて削除が行われた場合、依存表の行も削除されます。
• |  | もし依存表が親表でもある場合、ここに書かれた処理が今度はその依存表に行われます。

例

    -- OUT_TRAY_PKという名前の列レベルの主キー制約:
    CREATE TABLE SAMP.OUT_TRAY
    	(
    	SENT TIMESTAMP,
    	DESTINATION CHAR(8),
    	SUBJECT CHAR(64) NOT NULL CONSTRAINT OUT_TRAY_PK PRIMARY KEY,
    	NOTE_TEXT VARCHAR(3000)
       );

    -- 表レベルの主キー制約では二つの列を
    -- キーの定義に記述できます。
    CREATE TABLE SAMP.SCHED
    	(
    	CLASS_CODE CHAR(7) NOT NULL,
    	DAY SMALLINT NOT NULL,
    	STARTING TIME,
    	ENDING TIME,
    	PRIMARY KEY (CLASS_CODE, DAY)
    	);

    -- 列レベルの制約を算術チェックのために使います。
    -- 表レベルの制約を従業員への税金が賞与を超えないようにするため
    -- 使います。
    CREATE TABLE SAMP.EMP
    	(
    	EMPNO CHAR(6) NOT NULL CONSTRAINT EMP_PK PRIMARY KEY,
    	FIRSTNME CHAR(12) NOT NULL,
    	MIDINIT vARCHAR(12) NOT NULL,
    	LASTNAME VARCHAR(15) NOT NULL,
    	SALARY DECIMAL(9,2) CONSTRAINT SAL_CK CHECK (SALARY >= 10000),
    	BONUS DECIMAL(9,2),
    	TAX DECIMAL(9,2),
    	CONSTRAINT BONUS_CK CHECK (BONUS > TAX)
    	);

    -- MEAL列が適切な略字のみとるよう、チェック制約を使います。
    CREATE TABLE FLIGHTS
    	(
    	FLIGHT_ID CHAR(6) NOT NULL ,
    	SEGMENT_NUMBER INTEGER NOT NULL ,
    	ORIG_AIRPORT CHAR(3),
    	DEPART_TIME TIME,
    	DEST_AIRPORT CHAR(3),
    	ARRIVE_TIME TIME,
    	MEAL CHAR(1) CONSTRAINT MEAL_CONSTRAINT
    	CHECK (MEAL IN ('B', 'L', 'D', 'S')),
    	PRIMARY KEY (FLIGHT_ID, SEGMENT_NUMBER)
    	);

    CREATE TABLE METROPOLITAN
    	(
    	HOTEL_ID INT NOT NULL CONSTRAINT HOTELS_PK PRIMARY KEY,
    	HOTEL_NAME VARCHAR(40) NOT NULL,
    	CITY_ID INT CONSTRAINT METRO_FK REFERENCES CITIES
    	);

    -- 表レベルの主キー制約と表レベルの外部キー制約を指定して、
    -- 表を作成します。
    CREATE TABLE FLTAVAIL
    	(
    	FLIGHT_ID CHAR(6) NOT NULL,
    	SEGMENT_NUMBER INT NOT NULL,
    	FLIGHT_DATE DATE NOT NULL,
    	ECONOMY_SEATS_TAKEN INT,
    	BUSINESS_SEATS_TAKEN INT,
    	FIRSTCLASS_SEATS_TAKEN INT,
    	CONSTRAINT FLTAVAIL_PK PRIMARY KEY (FLIGHT_ID, SEGMENT_NUMBER),
    	CONSTRAINT FLTS_FK
    	FOREIGN KEY (FLIGHT_ID, SEGMENT_NUMBER)
    	REFERENCES Flights (FLIGHT_ID, SEGMENT_NUMBER)
    	);
    -- 列に一意性制約を加える。
    ALTER TABLE SAMP.PROJECT
    ADD CONSTRAINT P_UC UNIQUE (PROJNAME);

    -- 列レベルの外部キー制約を利用して、
    -- city_id列がCities表の主キーを参照する表を作成する。
    CREATE TABLE CONDOS
    	(
    	CONDO_ID INT NOT NULL CONSTRAINT hotels_PK PRIMARY KEY,
    	CONDO_NAME VARCHAR(40) NOT NULL,
    	CITY_ID INT CONSTRAINT city_foreign_key
    	REFERENCES Cities ON DELETE CASCADE ON UPDATE RESTRICT
    	);

文の依存追跡システム
INSERT文やUPDATE文は対象表にある全制約の影響を受けます。 DELETE文は一意性制約・主キー制約・外部キー制約の影響を受けます。 対象表にこれらの制約が追加されたり削除されたりした場合、これらの文は無効となります。
列毎の制約

    {
        NOT NULL |
        [ [CONSTRAINT 制約名]
        {
            CHECK (検索条件) |
            {
                PRIMARY KEY |
                UNIQUE |
                REFERENCES 節
            }
        }
    }

表ごとの制約

    [CONSTRAINT 制約名]
    {
        CHECK (検索条件) |
        {
            PRIMARY KEY ( 単純列名 [ , 単純列名 ]* ) |
            UNIQUE ( 単純列名 [ , 単純列名 ]* ) |
            FOREIGN KEY ( 単純列名 [ , 単純列名 ]* )
    REFERENCES 節
        }
    }

参照定義

    REFERENCES 表名 [ ( 単純列名 [ , 単純列名 ]* ) ]
    [ ON DELETE {NO ACTION | RESTRICT | CASCADE | SET NULL}]
       [ ON UPDATE {NO ACTION | RESTRICT }]
    |
    [ ON UPDATE {NO ACTION | RESTRICT }] [ ON DELETE
       {NO ACTION | RESTRICT | CASCADE | SET NULL}]

検索条件
A 検索条件 とは、検索条件の要件にて記述された要件を満たす、真偽式です。
制約名が明示されなかった場合、Derbyは一意性制約名を(列の制約にも表の制約にも)生成します。
FOR UPDATE 節
SELECT文にはFOR UPDATE節を持たせることができます。 既定でカーソルは読み込みしかできません。FOR UPDATE節により、コンパイル中にSELECT文が更新可能なカーソルの必要条件を満たすかを検証して、カーソルを更新可能とします。 更新可能であることの詳細については、更新可能なカーソルの必要条件を参照してください。
構文

    FOR
    {
        READ ONLY | FETCH ONLY |
        UPDATE [ OF 単純列名 [ , 単純列名]* ]
    }

単純列名 により、問い合わせ文のFROM節にある表にて、可視な名前を参照します。
Note: 更新可能なJDBCのResultSetを得るために、必ずしもFOR UPDATE節を使う必要はありません。 JDBCのResultSetの元となる文が、更新可能なカーソルの必要条件を満たしてさえいれば、JDBC Statementから、並行処理モードがResultSet.CONCUR_UPDATABLEのJDBC ResultSetを生成することができます。
索引の列が更新されていても、索引を使った最適化が可能です。索引がどのようにカーソルに影響するかについては、Derbyのチューニングを参照してください。

    SELECT RECEIVED, SOURCE, SUBJECT, NOTE_TEXT FROM SAMP.IN_TRAY FOR UPDATE

FROM 節
FROM節は選択式に必要です。この節により、問い合わせ文にある他節の式にて、利用可能な列のある表を参照します。
構文

    FROM 表式 [ , 表式 ] *

    SELECT Cities.city_id
    FROM Cities
    WHERE city_id < 5
    -- 他種の表式
    SELECT TABLENAME, ISINDEX
    FROM SYS.SYSTABLES T, SYS.SYSCONGLOMERATES C
    WHERE T.TABLEID = C.TABLEID
    ORDER BY TABLENAME, ISINDEX
    -- 結合順を指定する
    SELECT *
    FROM Flights, FlightAvailability
    WHERE FlightAvailability.flight_id = Flights.flight_id
    AND FlightAvailability.segment_number = Flights.segment_number
    AND Flights.flight_id < 'AA1115'
    -- 表式は結合式とすることができます。
    --したがって、FROM句には複数の結合式を置く事ができます。
    SELECT COUNTRIES.COUNTRY, CITIES.CITY_NAME, FLIGHTS.DEST_AIRPORT
    FROM COUNTRIES LEFT OUTER JOIN CITIES
    ON COUNTRIES.COUNTRY_ISO_CODE = CITIES.COUNTRY_ISO_CODE
    LEFT OUTER JOIN FLIGHTS
    ON Cities.AIRPORT = FLIGHTS.DEST_AIRPORT

GROUP BY 節
GROUP BY 節は選択式の一部とすることができます。この節により結果を一列以上の列の間で同じ値を持つ、結果の部分集合にまとめることができます。 それぞれの部分集合には、分類列が同じ値を持つ行はありません。 NULLは部分集合へのまとめを行う場合、同じ値と見なされます。
典型的にいって、GROUP BY節は集約式と併せて使われます。
構文

    GROUP BY 列名 [ , 列名 ] *

列名 は問い合わせにて可視でなければなりません。問い合わせにて不可視な列であってはなりません。 例えば、GROUP BY節が副問い合わせにあった場合、その節は副問い合わせの外にある問い合わせの列を参照してはなりません。
GROUP BY節を持つ選択式にある選択項目は集約か分類列でなければなりません。

    -- airportで分類されたflightsの、
    -- flying_timesの平均を探す。
    SELECT AVG (flying_time), orig_airport
    FROM Flights
    GROUP BY orig_airport

    SELECT MAX(city_name), region
    FROM Cities, Countries
    WHERE Cities.country_ISO_code = Countries.country_ISO_code
    GROUP BY region
    -- smallintによる分類
    SELECT ID, AVG(SALARY)
    FROM SAMP.STAFF
    GROUP BY ID
    -- AVGSALARY、EMPCOUNT列と、DEPTNO列をAS節により取得する。
    -- さらにOTHERSという相関名で、WORKDEPT列による分類を行う。
    SELECT OTHERS.WORKDEPT AS DEPTNO,
    AVG(OTHERS.SALARY) AS AVGSALARY,
    COUNT(*) AS EMPCOUNT
    FROM SAMP.EMPLOYEE OTHERS
    GROUP BY OTHERS.WORKDEPT

HAVING 節
HAVING節により選択式のGROUP BYの結果が絞り込まれます。WHERE節が選択列一覧に作用するのとは異なり、HAVING節は表から分類された部分集合に対して作用します。もしGROUP BY節がなければ、HAVING節は結果を単独の分類と見なして作用します。 SELECT節にてGROUP BY句のない列を直接参照することはできません。しかし定数や集約、特殊変数を参照することはできます。
構文

    HAVING 検索条件

検索条件は特殊な真偽式で、分類列(GROUP BY 節を参照してください。)か、集約式の一部である列のみ含める事ができます。 例えば以下の例では、SALARYという列は分類の列や集約、副問い合わせにある列ではないので、この文は不正です。

    -- SELECT COUNT(*)
    -- FROM SAMP.STAFF
    -- GROUP BY ID
    -- HAVING SALARY > 15000

HAVING節の集約はSELECTの一覧になくてもかまいません。 もしHAVING節が副問い合わせを含むならば、その副問い合わせは分類の列についてのみ、外の問い合わせを参照することができます。

    -- 2席以上の航路ごとに、エコノミー席の合計を調べる。
    SELECT SUM(ECONOMY_SEATS_TAKEN), AIRLINE_FULL
    FROM FLIGHTAVAILABILITY, AIRLINES
    WHERE SUBSTR(FLIGHTAVAILABILITY.FLIGHT_ID, 1, 2) = AIRLINE
    GROUP BY AIRLINE_FULL
    HAVING COUNT(*) > 1

ORDER BY 節
ORDER BY節はSELECT文の省略可能な要素です。 ORDER BY節にてResultSetにある行の順番を指定できます。
Syntax

    ORDER BY { 列名 | ColumnPosition | Expression }
        [ ASC | DESC ]
        [ , 列名 | 列位置 | 式
            [ ASC | DESC ] ] *

列名
問い合わせのSELECT 文の選択項目にて、可視である名前を参照します。 ORDER BYで指定する列名はSELECTされる項目になくとも構いません。
列位置
SELECT 文の選択項目の、列の番号を指定する整数です。 列位置は、0より大きくかつ結果表の列数以下でなければなりません。言い換えれば、列で並び変えるために、その列がSELECTされる項目にある必要があります。
式
並び変えを行うキーの式で、数値や文字列、日付などの式とすることができます。 式はスカラー副問い合わせやCASE式などの、行の値における式とすることができます。
ASC
結果を昇順で返すことを指定します。方向が指定されない場合、ASCが既定です。
DESC
結果を降順で返すことを指定します。
但し書き

• |  | SELECT DISTINCTが指定されたり、SELECT文にGROUP BY節があった場合、ORDER BYする列はSELECTされる項目になければなりません。
• |  | ORDER BY節があると、SELECT文を更新可能カーソルとすることができません。より詳細な情報は、更新可能なカーソルおよびResultSetの要件を参照してください。 例えば、もしINTEGERの列に整数があると、ソートのときNULLは1より大きいと見なされます。言い換えれば、NULLの値は、より上の位置にソートされます。

相関名を使う例
相関名が選択項目にて指定されていれば、結果セットを相関名で並び変えできます。 たとえばCITIESデータベースから、COUNTRY列にNATIONという相関名を与えて、CITY_NAME列とCOUNTRY列に格納されているすべての情報を返す場合、次のようなSELECT文を書きます。

    SELECT CITY_NAME, COUNTRY AS NATION
        FROM CITIES
        ORDER BY NATION

数式を使う例
結果セットを数式で並び変えることができます。例を挙げます。

    SELECT name, salary, bonus FROM employee
       ORDER BY salary+bonus

この例では、salaryとbonus列はDECIMALデータ型です。
関数を使う例
結果セットを関数の呼び出し結果を元に並び変えることができます。例を挙げます。

    SELECT i, len FROM measures
       ORDER BY sin(i)

WHERE 節
WHERE節は必要に応じて、選択式、DELETE 文、UPDATE 文に置くことができます。 WHERE節の真偽式に基づいて行を選択することができます。 式が真と評価された行だけが、結果にて返されます。 もし、DELETE文であれば削除され、UPDATE文であれば更新されます。
構文

    WHERE 真偽式

WHERE節には真偽式を置くことができます。一般的な式の表に一覧された一般式のほとんどは、真偽値になることができます。
さらに、より一般的な真偽式もあります。表10に一覧された真偽演算子は、一つあるいはそれ以上のオペランドをとり、その式は真偽値を返します。
例

    -- ビジネスクラスの席が予約されていない
    -- 便を見つける。
    SELECT *
    FROM FlightAvailability
    WHERE business_seats_taken IS NULL
    OR business_seats_taken = 0
    -- EMP_ACTとEMPLOYEEという表を結合して、
    -- EMP_ACTの全列に、EMPLOYEEより従業員の苗字(LASTNAME)を加えて
    -- 結果行として返す。
    SELECT SAMP.EMP_ACT.*, LASTNAME
      FROM SAMP.EMP_ACT, SAMP.EMPLOYEE
      WHERE EMP_ACT.EMPNO = EMPLOYEE.EMPNO
    -- 販売代理人の社員番号と給料を、彼らの部署の平均賃金と員数と共に、
    --返す。
    -- この問合せでは、まず問合せの一部(DINFO)にて、AS節で新しい列名を与えて、
    -- AVGSALARYとEMPCOUNT列およびWHERE節で使われているDEPTNOを
    -- 取得できるようにする必要がある。
    SELECT THIS_EMP.EMPNO, THIS_EMP.SALARY, DINFO.AVGSALARY, DINFO.EMPCOUNT
     FROM EMPLOYEE THIS_EMP,
       (SELECT OTHERS.WORKDEPT AS DEPTNO,
               AVG(OTHERS.SALARY) AS AVGSALARY,
               COUNT(*) AS EMPCOUNT
        FROM EMPLOYEE OTHERS
        GROUP BY OTHERS.WORKDEPT
       )AS DINFO
     WHERE THIS_EMP.JOB = 'SALESREP'
    	   AND THIS_EMP.WORKDEPT = DINFO.DEPTNO

WHERE CURRENT OF 節
WHERE CURRENT OF節はUPDATEやDELETE文にて使うことができます。 これにより更新可能なカーソルの位置による更新や削除が行えます。 更新可能なカーソルの詳細については、SELECT 文を参照してください。
構文

    WHERE CURRENT OF カーソル名

    Statement s = conn.createStatement();
    s.setCursorName("AirlinesResults");
    ResultSet rs = conn.executeQuery(
        "SELECT Airline, basic_rate " +
        "FROM Airlines FOR UPDATE OF basic_rate");
    Statement s2 = conn.createStatement();
    s2.executeUpdate("UPDATE Airlines SET basic_rate = basic_rate " +
        "+ .25 WHERE CURRENT OF AirlinesResults");

SQL式
多くの文や式の構文の語句に、式や表副問合せのような式の一種があります。 式は文の定められた場所に置くことができます。
場所によっては決められた種類の式や決められた属性を持つ式のみ置くことができます。
特別な指定がなければ、構文にて式と書かれている全ての場所に式を置くことができます。 これには以下が含まれます。

• |  | ORDER BY 節
• |  | 選択式
• |  | UPDATE文 (SETの部分)
• |  | VALUES式
• |  | WHERE節

もちろん他にも、これらの要素を構成の一部とする文はあるので、その一部として式を置くことができます。
以下の表ではSQL式と式を置くことのできる場所を示します。
一般的な式
一般的な式とは何らかの型の値となる式のことです。
表 2. 一般的な式の表

式の種類 | 説明
列参照式 | 列への参照がある式では、列名で列の値を参照して、式の中で値を扱うことができます。 列が曖昧な場合は、列名を表名あるいは相関名で限定する必要があります。 FROM 節にて表に相関名が与えられていた場合、列名は相関名で限定される必要があります。別名として相関名が与えられている場合、表名で列を限定することはできません。 これは選択式s、UPDATE文やDML文のWHERE節におくことができます。
定数 | 多くの組込みのデータ型には関連した定数があります。(これはデータ型に記述されます。)
NULL | NULLは不明な値を表す、型のない定数です。 CAST式やINSERTのVALUES一覧およびUPDATEのSET節におくことができます。CAST式で利用することで、指定したデータ型を与えることができます。
' | 動的パラメータ | 動的パラメータは、SQL文が作成された時には未だ決まっていない値へのパラメータです。その値の変わりに疑問符(?)がそれぞれの動的なパラメータのプレースホルダとしておかれます。 動的パラメータを参照してください。 動的パラメータは準備された文においてのみ、使うことができます。準備された文が実行される前に、動的パラメータの値は決められなければなりません。 また決めた値は文脈に沿った型でなければなりません。 データ型を問題なく推定できる場所では、どこでも利用することができます。動的パラメータを参照してください。
CAST 式 | NULLや動的パラメータの型を特定したり、値を他の型に変換することができます。 CAST 関数を参照してください。
スカラー副問合せ | 一列のみの一行だけを返す副問合せです。 スカラー副問合せを参照してください。
表副問合せ | 副問合せからは、一列以上、一行以上を返すことができます。 表副問合せを参照してください。 FROM句やEXISTS、INや定量比較の表式として置くことができます。

Boolean式
ブーリアン式はブーリアン値になる式です。多くの式は、ブーリアン値となれます。 一般的にWHERE句で用いられるブーリアン式は、SQL演算子で処理されるオペランドからなります。SQL のブーリアン演算子を参照してください。
数式
数式は数値になる式です。多くの式は、数値となれます。 数値は以下の型のいずれかです。

• |  | BIGINT
• |  | DECIMAL
• |  | DOUBLE PRECISION
• |  | INTEGER
• |  | REAL
• |  | SMALLINT

表 3. 数式の表

条件式 | 条件式では、ブーリアン値に基づいて評価する式を選ぶことができます。
式の種類 | 説明
-、*、/、単一の+と-の式 | 評価されると、オペランドに対して期待される演算処理が行われます。もし両方のオペランドが同じ型であれば、結果の型が昇格されることはありません。従って整数に除算演算子が適用されると、実際の計算結果に切捨て処理が行われて整数となった値が結果となります。 もし型が混在していた場合は、データ型の記述に従い、型の昇格が行われます。 単一の+で行われる処理はありません。(例えば+4は4と同じです。)単一の-は、-1をかけることと同じで、その結果符号が反転します。
AVG | 数値の集合から平均を返します。AVG関数
SUM | 数値の集合から合計を返します。SUM関数
LENGTH | 文字列やビット列から、文字数を返します。 LENGTH関数を参照してください。
LOWER | LCASEあるいはLOWER関数を参照してください。
COUNT | 値集合の個数を返します。COUNT 関数、COUNT(*) 関数を参照してください。

文字式
文字式は結果がCHARおよびVARCHARの値となる式です。多くの式の結果がCHARおよびVARCHARの値となります。
表 4. 文字式の表

式の種類 | 説明
ワイルドカードのあるCHARやVARCHARの値 | ワイルドカードの%や_を使って、LIKE演算子が一致する情報を探すパターン文字列を作ります。
連結式 | 連結式にて、連結演算子の"||"は、右辺のオペランドを左辺のオペランドの末尾に連結します。これは文字列やビット列に対して利用できます。 Concatenationを参照してください。
組込みの文字列関数 | 組込みの文字列関数は文字列に作用して、文字列を返します。 LTRIM関数、LCASEあるいはLOWER関数、RTRIM関数、TRIM 関数、SUBSTR関数それとrrefsqlj29930を参照してください。
USER関数 | User関数は現在のユーザに関する情報を文字列で返します。CURRENT_USER関数、SESSION_USER関数それと USER関数を参照してください。

日付/時刻式
日付/時刻式は、結果がDATE、TIMEやTIMESTAMPの値となる式です。 多くの式の結果が日付/時刻の値となります。
表 5. 日付/時刻式の表

式の種類 | 説明
CURRENT_DATE | 現在の日付を返します。CURRENT_DATE関数を参照してください。
CURRENT_TIME | 現在の時刻を返します。CURRENT_TIME関数を参照してください。
CURRENT_TIMESTAMP | 現在のタイムスタンプを返します。CURRENT_TIMESTAMP関数を参照してください。

選択式
選択式のSELECT-FROM-WHEREからなる記述に基づいて、射影と絞込みにより表群から新たに表の値を得ることができます。
構文

    SELECT [ DISTINCT | ALL ] 選択項目 [ , 選択項目]*
    FROM 節
    [ WHERE 節]
    [ GROUP BY 節 ]
    [ HAVING 節 ]

選択項目:

    {
        * |
        { 表名 | 相関名 } .* |
        式 [AS 単純列名]
    }

SELECT節には、式の一覧およびFROM節とWHERE節の結果に適用される数量詞があります。 DISTINCTが指定された場合、重複は取り除かれ同じ値を持つ行は一つしかありません。ここでNULL値同士は同じ値と扱われます。もし数量詞がないかALLなら、結果にて行の値が重複しても取り除かれません。(既定はALLなのです。)
選択項目により一つ以上の結果の列が、検索式で得られる結果の表に射影されます。
FROM節の記述により、節に書かれた項目の直積が結果として生成されます。さらにWHERE節により、その結果は限定されます。
WHERE節では真偽式に従い、行が絞り込まれます。式が真と評価された行だけが結果として返されます。
GROUP BY節により、一つあるいはそれ以上の列の間で同じ値を持つ行が分類されまとめられます。GROUP BY節は多くの場合、集約が併せて使われます。
GROUP BY節がある場合、SELECT節には集約か分類列だけ置くことができます。もし分類の列以外の列をSELECT節に起きたい場合、その列を集約式の中においてください。例を挙げます。

    -- 員数、部署番号(WORKDEPT)、部の平均賃金(SALARY)、
    -- をEMPLOYEEという表にある全ての部署毎に一覧する。
    -- 結果は部の平均賃金ごとに昇順で並べられる。
    SELECT WORKDEPT, AVG(SALARY)
         FROM EMPLOYEE
         GROUP BY WORKDEPT
         ORDER BY 1

GROUP BY節がないにもかかわらず、選択項目に副問い合わせにはない集約がある場合、問合せは暗黙に分類されます。そのとき表全体が一つに分類されます。
HAVING節に書かれた(WHERE節と同様の)検索条件より、分類された表が絞り込まれます。この検索条件は分類列あるいは可視である集約のみ参照することができます。HAVING節は表から分類された後の情報に適用されます。HAVING節が評価されて真であった場合、その行は残って以降の処理が行われます。一方でHAVING節が評価されて偽あるいはNULLであった場合、その行は破棄されます。もしHAVING節があるにもかかわらず、GROUP BY節がない場合、暗黙に表全体が一つに分類されます。
Derby は選択式を次の順番で処理します。

• |  | FROM 節
• |  | WHERE 節
• |  | GROUP BY (または暗黙のGROUP BY)
• |  | HAVING 節
• |  | SELECT 節

選択式の結果は常に表です。
問合せにFROM節がない場合(表から情報を取得するのではなく、値を構成する場合)、選択式ではなく、VALUES式を使います。 例:

    VALUES CURRENT_TIMESTAMP

VALUES式を参照してください。
ワイルドカードの*
*によりFROM節にある表の全列が展開されます。
表名.* や 相関名.* により、その表の全列が展開されます。その表はFROM節になければなりません。
列への命名
AS節を使って選択項目の列に名前をつける事ができます。もし選択項目が単なる列参照ではないかあるいは、AS節で名前がつけられていない場合、自動生成された名前が与えられます。
こういった列の名前は、さまざまな場合で便利に使うことができます。

• |  | JDBCのResultSetMetaDataにて利用可能です。
• |  | FROM節の副問い合わせにて、その選択式が使われた場合、結果表の列名として使われます。
• |  | ORDER BY節にて並び替えを行う列の名前として使われます。

    -- この例はORDER BY節、表への相関名、
    -- SELECT-FROM-WHEREを示します。
    SELECT CONSTRAINTNAME, COLUMNNAME
    FROM SYS.SYSTABLES t, SYS.SYSCOLUMNS col,
    SYS.SYSCONSTRAINTS cons, SYS.SYSCHECKS checks
    WHERE t.TABLENAME = 'FLIGHTS' AND t.TABLEID = col.
    REFERENCEID AND t.TABLEID = cons.TABLEID
    AND cons.CONSTRAINTID = checks.CONSTRAINTID
    ORDER BY CONSTRAINTNAME
    -- この例はDISTINCT節の使い方を示します。
    SELECT DISTINCT ACTNO
    FROM EMP_ACT
    -- この例は式に名前を与える方法を示します。
    -- EMPLOYEEという表から、最も高い給料が他の全部署の給料の平均より安い部署の、
    -- 部署番号(WORKDEPT)、BOSSという名前を与えた部署の最も高い給料(SALARY)を
    -- 一覧します。
    SELECT WORKDEPT AS DPT, MAX(SALARY) AS BOSS
    	FROM EMPLOYEE EMP_COR
    	GROUP BY WORKDEPT
    	HAVING MAX(SALARY) < (SELECT AVG(SALARY)
    				FROM EMPLOYEE
    				WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)
    	ORDER BY BOSS

TableExpression
表式により表、ビューあるいは関数を、FROM 節にて指定します。これより選択式にて結果が選択されます。
列を限定するために、相関名を表式に適用することができます。 相関名が与えられない場合、表名が列名を限定します。 もし表に相関名が与えられた場合、表名により列を限定することはできず、列名を相関名で限定しなければなりません。
FROM節にある項目は、同じ名前の相関名を持つことができません。また相関名はFROM節にある表の限定されない名前と同じ名前であってはなりません。
さらにAS節を使って表の列に名前を与えることができます。これは以下の状況で便利です。

• |  | VALUES式が表副問合せで使われている場合、VALUES式の列に名前を与える方法は、他には無いです。
• |  | 列名が他の表の列名と同じ場合、別の名前を与えることで限定の必要がなくなります。

Fromの項目にある表副問合せの問合せには、複数列を置くことができ、複数行を返すことができます。表副問合せを参照してください。
ユーザが最適化のため何を指定できるかについては、Derbyのチューニングを参照してください。
構文

    {
    表やビューあるいは関数式 | 結合式
    }

例

    -- 結合式から選択できます。
    SELECT E.EMPNO, E.LASTNAME, M.EMPNO, M.LASTNAME
     FROM EMPLOYEE E LEFT OUTER JOIN
       	DEPARTMENT INNER JOIN EMPLOYEE M
      ON MGRNO = M.EMPNO
      ON E.WORKDEPT = DEPTNO

表またはビューあるいは関数式

    {表名 | ビュー名 | 表関数呼び出し}
        [ [ AS ] 相関名
            [ (単純列名 [ , 単純列名]* ) ] ] ]

表関数の呼び出し:

    TABLE 関数名( [ [ 関数の引数 ] [, 関数の引数 ]* ] )

但し書き 表関数を呼び出すときは、相関名を割り当てる必要があります。例を挙げます。

    SELECT s.*
    FROM TABLE( externalEmployees( 42 ) ) s

VALUES式
VALUES式により、値から行や表を構築できます。 VALUES式は問い合わせを置ける場所ならどこにでも置くことができ、したがって以下のいずれとしても利用が可能です。

• |  | ResultSetを返す文
• |  | 副問い合わせを置ける式や文
• |  | INSERT文の値(INSERT文では通例的に選択式ではなくVALUES式を用います。)

構文

        VALUES ( 値 {, 値 }* )
            [ , ( 値 {, 値 }* ) ]* |
        VALUES 値 [ , 値 ]*
     }

値は以下のように定義されます。

    式 | DEFAULT

最初の書き方では複数列の行が構築され、二つ目の書き方では単列の行が、個々の式を行の列値として、構築されます。
VALUES式がINSERT文にある場合のみ、DEFAULTというキーワードを使うことができます。 列にDEFAULTを指定すると、その列には列の既定値が挿入されます。 もう一つ列に既定値を挿入する方法があり、それはINSERT文にて一覧からその列を除いて、表の他の列の値のみ明示的に挿入することです。
例

    -- 1列3行
    VALUES (1),(2),(3)
    -- 1列3行
    VALUES 1, 2, 3
    -- 3列1行
    VALUES (1, 2, 3)
    -- 2列3行
    VALUES (1,21),(2,22),(3,23)
    -- 表を導出して構築
    VALUES ('orange', 'orange'), ('apple', 'red'),
    ('banana', 'yellow')
    -- 単文でDEPARTMENTという表に二つの新しい部署を挿入する。
    -- ただし新しい部署に管理者は割り当てない。
    INSERT INTO DEPARTMENT (DEPTNO, DEPTNAME, ADMRDEPT)
      VALUES ('B11', 'PURCHASING', 'B01'),
        ('E41', 'DATABASE ADMINISTRATION', 'E01')
    -- MAJPROJ列に既定値をあてて、行を挿入する。
    INSERT INTO PROJECT (PROJNO, PROJNAME, DEPTNO, RESPEMP, PRSTDATE, MAJPROJ)
    VALUES ('PL2101', 'ENSURE COMPAT PLAN', 'B01', '000020', CURRENT_DATE, DEFAULT)

    -- 組込みの関数を使う
    VALUES CURRENT_DATE
    -- 任意の式の値をとる
    VALUES (3*29, 26.0E0/3)
    -- 組込みの関数の返す値をとる
    values char(1)

式に関する優先順位
演算子の優先順位を高いものから低いものに並べて示します。

• |  | (), ?, 定数 (符号を含む), NULL, 列参照, スカラー副問合せ, CAST
• |  | LENGTH, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, その他の組込み関数
• |  | 単一のオペランドをとる+および-
• |  | *, /, || (連結)
• |  | 二つのオペランドをとる+および-
• |  | 比較、 定量比較、 EXISTS, IN, IS NULL, LIKE, BETWEEN, IS
• |  | NOT
• |  | AND
• |  | OR

演算子を括弧の中に書くことにより、優先順位を明示的に指定することができます。括弧の外にある演算子が括弧の中の式に適用される前に、括弧の中の演算子は評価されます。
例

    (3+4)*9
    (age < 16 OR age > 65) AND employed = TRUE

真偽式
真偽式はWHERE節やチェック制約に置くことができます。 チェック制約に置く真偽式には、ここで記述されていない制限があります。 詳細はCONSTRAINT 節を参照してください。 WHERE節に置く真偽式の構文は柔軟なものとなっています。具体的な例は、WHERE節を参照してください。
真偽式にはブーリアン演算子を一つ以上置くことができます。 この演算子はSQL のブーリアン演算子に一覧されています。
表 6. SQL のブーリアン演算子

演算子 | 説明と例 | 構文
AND, OR, NOT | オペランドにとる真偽式を評価します。
    (orig_airport = 'SFO') OR
        (dest_airport = 'GRU')
        -- 真を返す。
    {
      式 AND
        式|
      式 OR
        式 |
      NOT 式
    }
比較演算子 | <, =, >, <=, >=, <> は、全ての組み込みの型に適用することができます。
    DATE('1998-02-26') <
        DATE('1998-03-01')
    -- 真を返す。
    式
    {
      < |
      = |
      > |
      <= |
      >= |
      <>
    }
    式
IS NULL, IS NOT NULL | 式の結果が空かそうでないかを判定します。
    WHERE MiddleName IS NULL
    式 IS [ NOT ]
      NULL
LIKE | 文字式が文字パターンと一致するかを判定します。文字パターンには一つ以上のワイルドカードが含まれます。 %は最初の文字式にて、該当する位置の任意の文字数(0文字以上)の文字列に一致します。 _は文字式にて、該当する位置の一文字に一致します。 それ以外の文字は、文字式にて該当する位置の同じ文字に一致します。
    city LIKE 'Sant_'
%や_をワイルドカードではない文字とするには、ESCAPE節で指定するエスケープ文字を使って文字をエスケープします。
    SELECT a FROM tabA WHERE a
    LIKE '%=_' ESCAPE '='
Note: LIKEによる比較ではDerbyは、個々の文字を非メタ文字と比較します。これはDerbyが=による比較のとき行う処理とは違います。=による比較では左辺の文字列全体が、=演算子の右辺の文字列全体と比較されます。より詳細な情報については、Derby ディベロッパーズ ガイドのDerbyにおける文字の照合を参照してください。 |
    文字式
      [ NOT ] LIKE
      ワイルドカードのある文字式
      [ ESCAPE

    'エスケープ文字']
BETWEEN | 最初のオペランドが二つ目と三つ目のオペランドの間の値であるかを判定します。二つ目のオペランドは三つ目のオペランドより小さな値でなければなりません。 この演算子は<=と>=が適用できる型に対してのみ適用できます。
    WHERE booking_date BETWEEN
        DATE('1998-02-26') AND
        DATE('1998-03-01')
    式 [ NOT ]
    BETWEEN 式
      AND 式
IN | 表副問合せや値の並びに作用します。左辺の式の値が表副問合せや値の並びに含まれるならば、真を返します。なお、表副問合せは複数行を返してかまいませんが、列は一つでなければなりません。
    WHERE booking_date NOT IN
        (SELECT booking_date FROM
    HotelBookings WHERE rooms_available = 0)
    {
     式 [ NOT ]
        IN
        表副問合せ |
      式 [ NOT ]
        IN ( 式
        [, 式 ]* )
    }
EXISTS | 表副問合せに作用して、その表副問合せが行を返すならば真を返し、行が返らないならば偽を返します。表副問合せは複数の列(*を使った場合に限ります。)や行を返すことができます。
    WHERE EXISTS
      (SELECT *
      FROM Flights
      WHERE dest_airport = 'SFO'
      AND orig_airport = 'GRU')
    [NOT] EXISTS 表副問合せ
定量比較 | 定量比較はALL、ANY、SOMEの何れかが適用された比較演算子 (<,=, >, <=, >=, <>)となります。 これは表副問合せに作用します。表副問合せは複数の行を返すことができますが、単一の列しか返せません。 ALLが指定された場合、表副問合せが返す全ての値に対して、比較の結果が真でなければなりません。ANYないしSOMEが指定された場合、表副問合せが返す何れかの値に対して、比較の結果が真である必要があります。ANYとSOMEは同じ意味です。
    WHERE normal_rate < ALL
    (SELECT budget/550 FROM Groups)
    式
      比較演算子
      {
        ALL |
        ANY |
        SOME
      }
      表副問合せ

動的パラメータ
JDBC APIのPreparedStatementを使うことで、値が決まっていないパラメータを持つ文を準備することができます。これらのパラメータは動的パラメータと呼ばれ、?で表されます。
JDBC APIの文書では動的パラメータはIN、INOUT、OUTの何れかとされており、SQLではINとされています。
New: Derby は、JDBC 3.0で導入されたParameterMetaDataのインターフェイスをサポートします。このインターフェイスにより準備された文にあるパラメータの数・型・属性が記述されます。 より詳細な情報については、Derby ディベロッパーズ ガイドを参照してください。
これらの値は、文が実行される前に指定されなければなりません。また値は文脈に沿った型を持たなければなりません。
動的パラメータの例

    PreparedStatement ps2 = conn.prepareStatement(
        "UPDATE HotelAvailability SET rooms_available = " +
        "(rooms_available - ?) WHERE hotel_id = ? " +
        "AND booking_date BETWEEN ? AND ?");
    -- このコード例では動的パラメータに
    -- プログラム変数の値を代入します。
    ps2.setInt(1, numberRooms);
    ps2.setInt(2, theHotel.hotelId);
    ps2.setDate(3, arrival);
    ps2.setDate(4, departure);
    updateCount = ps2.executeUpdate();

動的パラメータを置ける場所
データ型が簡単に決定される場所であれば、式の何処にでも動的パラメータを置くことができます。

1. |  | BETWEENでは、二つ目と三つ目のオペランドのどちらかが動的パラメータでなければ、最初のオペランドを動的パラメータとすることができます。 一つ目のオペランドの型は、残りの二つが動的パラメータでなければ、それら動的ではないパラメータの型もしくはそれらを統合した型とみなされます。
    WHERE ? BETWEEN DATE('1996-01-01') AND ?
    -- 型はDATEとみなされます。
2. |  | BETWEENの二つ目、三つ目のオペランドを動的パラメータとすることができます。 これらの型は左辺のオペランドと同じ型とみなされます。
    WHERE DATE('1996-01-01') BETWEEN ? AND ?
    -- 型はDATEとみなされます。
3. |  | INでは一覧のうち一つでも動的パラメータではない項目があれば、左辺のオペランドを動的パラメータとすることができます。 左辺のオペランドの型は一覧にある動的でないパラメータの項目の型を統合した型とみなされます。
    WHERE ? NOT IN (?, ?, 'Santiago')
    -- 型はCHARとみなされます。
4. |  | INでは、最初のオペランドが動的パラメータではないか前掲のルールによりその型が決まる場合、INの述部の一覧に動的パラメータを置くことができます。 値の一覧に置かれた動的パラメータの型は、左辺のオペランドの型と同じものとみなされます。
    WHERE FloatColumn IN (?, ?, ?)
    -- 型はFLOATとみなされます。
5. |  | オペランドを2つ持つ演算子の、+・-・*・/・AND・OR・<・>・ =・<・>・<=と>=では、片方のオペランドを動的パラメータとすることができますが、両方を動的パラメータとすることはできません。 動的パラメータの型はもう片方のオペランドの型となります。
    WHERE ? < CURRENT_TIMESTAMP
    -- 型はTIMESTAMPとみなされます。
6. |  | CASTでは常に動的パラメータを利用できます。これにより動的パラメータに型を与えることができます。
    CALL valueOf(CAST (? AS VARCHAR(10)))
7. |  | LIKE演算子の片方あるいは両方のオペランドを動的パラメータとすることが可能です。 左辺を動的パラメータとした場合、その型は右辺のオペランドと同じものとみなされます。なお最大長は型の最大長となります。右辺を動的パラメータとした場合、左辺のオペランドの長さと型が適用されます。 (LIKEではCHARとVARCHARの型を利用する事が可能です。詳細はConcatenationを参照してください。)
    WHERE ? LIKE 'Santi%'
    --型は最大長がjava.lang.Integer.MAX_VALUEの
    --CHARとみなされます。
8. |  | 動的パラメータの?は、||演算子の片方の側にのみ置くことができます。 すなわち"? || ?"は不可能です。||演算子の片側にある?パラメータの型は、その反対側にある||演算子のオペランドの式の型によって決まります。もし反対側の式の型がCHARあるいはVARCHARであれば、動的パラメータの型はその型の最大長のVARCHARです。 もし反対側の式の型がCHAR FOR BIT DATAあるいはVARCHAR FOR BIT DATAであれば、動的パラメータの型はその方の最大長のVARCHAR FOR BIT DATAです。
    SELECT BITcolumn || ?
    FROM UserTable
    -- 型はBITcolumnと同じ最大長のCHAR FOR BIT DATAとなります。
9. |  | 条件式では?で表される動的パラメータの利用が可能です。式の最初のオペランドに置かれた動的パラメータの型は真偽型とみなされます。 式の二つ目あるいは三つ目のうち、片方だけを動的パラメータとすることができます。動的パラメータの型は、もう片方の型と同じものとみなされます。(つまり対応するのは三つ目と二つ目のオペランドとなります。)
    SELECT c1 IS NULL ? ? : c1
    -- この例では実行時に既定値を与えることができます。
    -- その動的パラメータの型はc1と同じ型とみなされます。
    -- :の両側に動的パラメータを置くことはできません。
10. |  | INSERT文のvaluesの一覧やselectの一覧に、動的パラメータを置くことができます。 動的パラメータの型は対象列の型と同じ型とみなされます。
    INSERT INTO t VALUES (?)
    -- 動的パラメータの型は、
    -- t表の唯一つの列と同じ型となります。
    INSERT INTO t SELECT ?
    FROM t2
    -- これは不可です。
11. |  | 副問合せと比較される?パラメータは、副問合せで選択された式の型をとります。 例を挙げます。
    SELECT *
    FROM tab1
    WHERE ? = (SELECT x FROM tab2)

    SELECT *
    FROM tab1
    WHERE ? = ANY (SELECT x FROM tab2)
    -- 両方の場合において、動的パラメータの型は、
    -- tab2.xと同じ型とみなされます。
12. |  | UPDATE文の値に対して動的パラメータを置くことができます。動的パラメータの型は、対照表の列の型と同じものとみなされます。
    UPDATE t2 SET c2 =? -- c2と同じ型とみなされます。
13. |  | 単一オペランドをとる-や+の演算子にて、動的パラメータを利用可能です。 例を挙げます。
    CREATE TABLE t1 (c11 INT, c12 SMALLINT, c13 DOUBLE, c14 CHAR(3))
    SELECT * FROM t1 WHERE c11 BETWEEN -? AND +?
    -– 両方の単一オペランドをとる演算子の型は、文脈に沿ってINTとなります。
    -- (すなわち、c11がINTなので、単一オペランドをとる演算子もINTの型をとります。)
14. |  | LENGTHにて、動的パラメータを利用可能です。その型は最大長のVARCHARとみなされます。
    SELECT LENGTH(?)
15. |  | 定量比較
    ? = SOME (SELECT 1 FROM t)
    -- これは有効です。動的なパラメータの型はINTEGERとみなされます。
    1 = SOME (SELECT ? FROM t)
    -- これは有効です。動的なパラメータの型はINTEGERとみなされます。
16. |  | IS式の左辺に動的パラメータを置くことができ、その型は真偽型とみなされます。

動的なパラメータの型が決まる式は一般的に、その動的パラメータを定数に置き換えて、どのような場所にも置くことができます。
JOIN 演算
JOIN演算はFROM 節のTableExpressionに置くことができ、2表の間の結合を記述します。(WHERE節にて"WHERE t1.col1 = t2.col2"等と書いて、明示的に等価性の判定式を記述することでも、結合を実現することもできます。)
構文

    JOIN式

JOIN演算は、以下のいずれかです。

• |  | INNER JOIN 演算 join節により2表の間の結合を明示的に指定します。INNER JOIN 演算を参照してください。
• |  | LEFT OUTER JOIN演算 join節により2表の間の結合を明示的に指定します。また最初の表にて一致行が二つ目の表にない行も残ります。LEFT OUTER JOIN演算を参照してください。
• |  | RIGHT OUTER JOIN 演算 join節により2表の間の結合を明示的に指定します。また二つ目の表にて一致行が最初の表にない行も残ります。RIGHT OUTER JOIN 演算を参照してください。

どの場合でも、結合された表の片方もしくは両方に、outer join節あるいはWHERE 節で、追加の絞込条件を置くことができます。
JOIN演算と、問い合わせの最適化
結合にどのような最適化が行われるかについては、Derbyのチューニングを参照してください。
INNER JOIN 演算
INNER JOINとは、明示的な結合句を記述することができる、JOIN 演算です。
構文

    表式 [ INNER ] JOIN 表式 { ON 真偽式 }

ONに真偽式を記述することで、結合句が記述できます。
ON節にある式では、直接の表および、外部の問い合わせ文から、直接のSELECT文までの間にある表が可視です。 以下の例ではON節は直接の表を参照しています。

    SELECT *
    FROM SAMP.EMPLOYEE INNER JOIN SAMP.STAFF
    ON EMPLOYEE.SALARY < STAFF.SALARY

ON節では結合されていない表を参照することができます。また結合している表を参照しなくてもかまいません。(一般的には参照します。)

    -- EMP_ACTとEMPLOYEEという表を結合します。
    -- EMP_ACTという表より全列を選択して、
    -- EMPLOYEEという表より従業員の苗字(LASTNAME)をそれぞれの行に
    -- 加えます。
    SELECT SAMP.EMP_ACT.*, LASTNAME
         FROM SAMP.EMP_ACT JOIN SAMP.EMPLOYEE
         ON EMP_ACT.EMPNO = EMPLOYEE.EMPNO
    -- EMPLOYEEとDEPARTMENTという表を結合して、
    -- 1930年より前に生まれた(BIRTDATE)全ての従業員の、
    -- 従業員番号(EMPNO)、従業員の苗字(LASTNAME)、
    -- 部署番号(EMPLOYEEという表のWORKDEPTと、DEPARTMENTという表のDEPTNO)、
    -- 部署名(DEPTNAME)を選択する。
    SELECT EMPNO, LASTNAME, WORKDEPT, DEPTNAME
         FROM SAMP.EMPLOYEE JOIN SAMP.DEPARTMENT
         ON WORKDEPT = DEPTNO
         AND YEAR(BIRTHDATE) < 1930

    -- VALUES節から選択する問い合わせ(select文の一例)により値を"生成"する別の例
    -- この問い合わせにより、一行の情報を持つ"R1"と"R2"という2列の"x"という表を
    -- どのように導出するのか示す。
    SELECT *
    FROM (VALUES (3, 4), (1, 5), (2, 6))
    AS VALUESTABLE1(C1, C2)
    JOIN (VALUES (3, 2), (1, 2),
    (0, 3)) AS VALUESTABLE2(c1, c2)
    ON VALUESTABLE1.c1 = VALUESTABLE2.c1
    -- This results in:
    -- C1         |C2         |C1         |2
    -- -----------------------------------------------
    -- 3          |4          |3          |2
    -- 1          |5          |1          |2

    -- 全ての部署を、管理者の苗字と従業員番号と共に一覧する。

    SELECT DEPTNO, DEPTNAME, EMPNO, LASTNAME
    	FROM DEPARTMENT INNER JOIN EMPLOYEE
    	ON MGRNO = EMPNO

    -- 全ての従業員の従業員番号と苗字を、
    -- その管理者の従業員番号と苗字と共に一覧する。
    SELECT E.EMPNO, E.LASTNAME, M.EMPNO, M.LASTNAME
    	FROM EMPLOYEE E INNER JOIN
    	DEPARTMENT INNER JOIN EMPLOYEE M
            ON MGRNO = M.EMPNO
            ON E.WORKDEPT = DEPTNO

LEFT OUTER JOIN演算
LEFT OUTER JOIN演算は、join節を記述できるJOIN演算の一つです。 この演算では最初の(左の)表にて、一致する行が二つ目の(右の)表にない行は、二つ目の表のNULLの行に結合されたものとして、結果に残ります。
構文

    表式 LEFT [ OUTER ] JOIN 表式
    {
        ON 真偽式
        }

ON節にあるいずれの真偽式も、直接の表と直接の問い合わせ文にあるいかなる表を参照することができます。 ON節は結合されていない表を参照することもできますし、結合されている表を参照しなくともかまいません。(ただし一般的には参照します。)
例 1

    --都市に対応するアジアの国

    SELECT CITIES.COUNTRY, CITIES.CITY_NAME, REGION
    FROM Countries
    LEFT OUTER JOIN Cities
    ON CITIES.COUNTRY_ISO_CODE = COUNTRIES.COUNTRY_ISO_CODE
    WHERE REGION = 'Asia'

    -- LEFT JOINという別の書き方により、前例と同じ結果を
    -- 実現する。

    SELECT  COUNTRIES.COUNTRY, CITIES.CITY_NAME,REGION
    FROM COUNTRIES
    LEFT JOIN CITIES
    ON CITIES.COUNTRY_ISO_CODE = COUNTRIES.COUNTRY_ISO_CODE
    WHERE REGION = 'Asia'

例 2

    -- EMPLOYEEとDEPAETMENTという表を結合して、
    -- 1930より前に生まれた(BIRTHDATE)全ての社員の、
    -- 社員番号(EMPNO)と、
    -- 社員の苗字(LASTNAME)と、
    -- 部署番号(EMPLOYEEという表のWORKDEPTと、DEPARTMENTという表のDEPTNO)と、
    -- 部署名(DEPTNAME)を選択する。

    SELECT EMPNO, LASTNAME, WORKDEPT, DEPTNAME
       FROM SAMP.EMPLOYEE LEFT OUTER JOIN SAMP.DEPARTMENT
       ON WORKDEPT = DEPTNO
       AND YEAR(BIRTHDATE) < 1930

    -- 管理者のいない部署を含め全ての部署を、
    -- 部署の管理者の社員番号と苗字と共に一覧する。

    SELECT DEPTNO, DEPTNAME, EMPNO, LASTNAME
          FROM DEPARTMENT LEFT OUTER JOIN EMPLOYEE
    	    ON MGRNO = EMPNO

RIGHT OUTER JOIN 演算
RIGHT OUTER JOIN演算は、JOIN節に置くことのできるJOIN演算の一種です。 この式では、一つ目(左)の表に合う行がない二つ目(右)の表にある行も結果に残ります。そのとき一つ目の表からの情報はNULLと扱われます。A LEFT OUTER JOIN B は B RIGHT OUTER JOIN Aと、列の順が違う事を除けば同じです。
構文

    表式 RIGHT [ OUTER ] JOIN 表式
    {
        ON 真偽式
        }

ON節にて可視なのは、直接の表と直接のSELECTによる問合せにある表です。 ON節では結合されていない表を参照することもできますし、結合している表を参照しなくともかまいません。(ただし一般的には参照します。)
例1

    -- 都市のない国を含めた、
    -- 全ての国と都市の一覧を得ます。

    SELECT COUNTRIES.COUNTRY, CITIES.CITY_NAME
    FROM CITIES
    RIGHT OUTER JOIN COUNTRIES
    ON CITIES.COUNTRY_ISO_CODE = COUNTRIES.COUNTRY_ISO_CODE

    -- 都市のない国を含めた、
    -- アフリカの全ての国と都市の一覧を得ます。

    SELECT COUNTRIES.COUNTRY, CITIES.CITY_NAME
    FROM CITIES
    RIGHT OUTER JOIN COUNTRIES
    ON CITIES.COUNTRY_ISO_CODE = COUNTRIES.COUNTRY_ISO_CODE
    WHERE Countries.region = 'Africa'

    -- RIGHT JOINという同じ内容の記述により、
    -- 前の例と同じ結果を得ます。
    SELECT COUNTRIES.COUNTRY, CITIES.CITY_NAME
    FROM CITIES
    RIGHT JOIN COUNTRIES
    ON CITIES.COUNTRY_ISO_CODE = COUNTRIES.COUNTRY_ISO_CODE
    WHERE Countries.region = 'Africa'

例2

    -- 演算は表式の一つです。
    -- なのでFRON句には複数の演算を置くことができます。
    -- 以下の例では全社員の社員番号と苗字を、
    -- その社員の管理者の社員番号と苗字と共に一覧します。

    SELECT E.EMPNO, E.LASTNAME, M.EMPNO, M.LASTNAME
    	FROM EMPLOYEE E RIGHT OUTER JOIN
    	DEPARTMENT RIGHT OUTER JOIN EMPLOYEE M
            ON MGRNO = M.EMPNO
            ON E.WORKDEPT = DEPTNO

SQL 問い合わせ
問合せ
問合せにより、既存表や表に組込みの定数を基にして、仮想的な表が作られます。
Syntax

    {
        ( Query ) |
        Query INTERSECT [ ALL | DISTINCT ] Query |
        Query EXCEPT [ ALL | DISTINCT ] Query |
        Query UNION [ ALL | DISTINCT ] Query |
    選択式 | VALUES式
    }

問合せの前後に任意で括弧を置くことができます。また、INTERSECT、EXCEPT、UNION演算子の評価順を括弧を使って変えることができます。INTERSECTを除きこれらの演算子は、括弧がなければ左から右に評価されます。INTERSECTはUNIONあるいはEXCEPTより前に評価されます。
UNION、INTERSECT、EXCEPT ALLにおける結果の重複
ALLとDISTINCTというキーワードにより処理結果から重複を取り除くか否かが決まります。 DISTINCTというキーワードがあれば、結果に重複行はありません。ALLというキーワードがあれば、入力によって結果に重複行がある場合があります。既定はDISTINCTなので、ALLかDISTINCTか指定しなければ重複は取り除かれます。例えばUNIONの場合は、両方の問合せの全行を元に一時的なResultSetを生成したのち、重複行を取り除いてから結果を返します。これがUNION ALLならば、両方の問合せの全行が返されます。
左表にある重複した行の数をL、右表にある左表と同じ内容で重複した行の数をRとすると、どの操作を行うかにより、結果表にある重複した行の数は次のようにきまります。(ALLが指定されたとします。)

• |  | UNION: ( L + R )。
• |  | EXCEPT: ( L – R )と0(零)のうち大きいほう
• |  | INTERSECT: LとRのうち小さいほう

例

    -- 選択式
    SELECT *
    FROM ORG

    -- 副問合せ
    SELECT *
    FROM (SELECT CLASS_CODE FROM CL_SCHED) AS CS

    -- 副問合せ
    SELECT *
    FROM (SELECT CLASS_CODE FROM CL_SCHED) AS CS (CLASS_CODE)

    -- UNIONにより
    -- ORGという表にある全行の
    -- DEPTNUMBとMANAGERという列に加え、
    -- (1,2)と(3,4)を返す。
    -- なお、DEPTNUMBとMANAGERはsmallint型の列である。
    SELECT DEPTNUMB, MANAGER
    FROM ORG
    UNION ALL
    VALUES (1,2), (3,4)

    -- 値の式
    VALUES (1,2,3)

    -- EMPLOYEEという表にて部署番号(WORKDEPT)が'E'で始まる社員および、
    -- EMP_ACTという表にてプロジェクト番号(PROJNO)が
    -- 'MA2100'、'MA2110'あるいは'MA2112'のプロジェクトにアサインされている社員の
    -- 社員番号(EMPNO)を一覧する。
    SELECT EMPNO
         FROM EMPLOYEE
         WHERE WORKDEPT LIKE 'E%'
      UNION
      SELECT EMPNO
         FROM EMP_ACT
         WHERE PROJNO IN('MA2100', 'MA2110', 'MA2112')
    -- 前の例と同じ内容の問合せを行い、EMPLOYEEという表から得た行には'emp'、
    -- EMP_ACTという表から得た行には'emp_act'という"タグ"をつける。
    -- どちらの表から来たかをあらわす"タグ"があるので、
    -- この問合せは前の問合せとは違い、同じEMPNOを一回より多く返すことがある。
    SELECT EMPNO, 'emp'
         FROM EMPLOYEE
         WHERE WORKDEPT LIKE 'E%'
      UNION
      SELECT EMPNO, 'emp_act' FROM EMP_ACT
         WHERE PROJNO IN('MA2100', 'MA2110', 'MA2112')
    -- 前の例とほぼ同じ内容の問合せである。
    -- UNION ALLが指定されたので重複は取り除かれなくなる。
    SELECT EMPNO
          FROM EMPLOYEE
          WHERE WORKDEPT LIKE 'E%'
      UNION ALL
      SELECT EMPNO
         FROM EMP_ACT
         WHERE PROJNO IN('MA2100', 'MA2110', 'MA2112')
    -- 前の例とほぼ同じ内容の問合せである。
    -- いずれの表にもいない二人の社員を加えて、
    -- その行に"new"というタグをつけた。
     SELECT EMPNO, 'emp'
         FROM EMPLOYEE
         WHERE WORKDEPT LIKE 'E%'
      UNION
      SELECT EMPNO, 'emp_act'
         FROM EMP_ACT
         WHERE PROJNO IN('MA2100', 'MA2110', 'MA2112')
      UNION
         VALUES ('NEWAAA', 'new'), ('NEWBBB', 'new')

スカラー副問合せ
スカラー副問合せは式を置ける場所なら、どこでも置くことができます。 スカラー副問合せでは、選択式の結果は一行一列しかないのでスカラー値となります。
問合せは評価の結果が、単列単行とならなければなりません。
Sometimes also called an expression subquery.
分布

    (問合せ)

Examples

    -- avg の返り値は常に単値なので、
    -- 副問い合わせはスカラー副問合せとなる。
    SELECT NAME, COMM
      FROM STAFF
      WHERE EXISTS
        (SELECT AVG(BONUS + 800)
           FROM EMPLOYEE
           WHERE COMM < 5000
           AND EMPLOYEE.LASTNAME = UPPER(STAFF.NAME)
    )
    -- VALUES節から選択を行う問合せにより、
    -- 新しい値を"得る"方法を示す。
    -- この問合せは"R1"と"R2"という列を持ち一行の、
    -- "X"という表を導出するにはどのようにすればよいかを示す。
    SELECT R1,R2
    	FROM (VALUES('GROUP 1','GROUP 2')) AS X(R1,R2)

表副問合せ
表副問合せは複数の行を返す副問合せです。
スカラー副問合せとは異なり、表副問合せは以下の文脈にてのみ可能です。

• |  | FROM 節の表式
• |  | EXISTSやIN、量の比較

FROM 節の表式にて使われた場合、複数の列を返すことができます。
EXISTSでは、*を使う場合のみ複数の列を返すことができます。
INや限定条件では、単列のみ返すことができます。
構文

    (問合せ)

例

    -- FROM節の表式として、副問合せを使う。
    SELECT VirtualFlightTable.flight_ID
    FROM
        (SELECT flight_ID, orig_airport, dest_airport
        FROM Flights
        WHERE (orig_airport = 'SFO' OR dest_airport = 'SCL') )
    AS VirtualFlightTable
    -- FROM節の表式として、副問合せ(values式)を使う。
    SELECT mycol1
    FROM
        (VALUES (1, 2), (3, 4))
    AS mytable (mycol1, mycol2)
    -- EXISTSにて副問合せを使う
    SELECT *
    FROM Flights
    WHERE EXISTS
        (SELECT * FROM Flights WHERE dest_airport = 'SFO'
        AND orig_airport = 'GRU')
    -- INにて副問合せを使う
    SELECT flight_id, segment_number
    FROM Flights
    WHERE flight_id IN
        (SELECT flight_ID
        FROM Flights WHERE orig_airport = 'SFO'
        OR dest_airport = 'SCL')
    -- 定量比較にて副問合せを使う
    SELECT NAME, COMM
    FROM STAFF
    WHERE COMM >
    (SELECT AVG(BONUS + 800)
         FROM EMPLOYEE
         WHERE COMM < 5000)

組み込み関数
組み込み関数は何らかの処理を行うSQLキーワードや特殊な演算子です。 組み込み関数には、キーワードか特殊な組込みの演算子が与えられています。 組み込み関数のキーワードはSQL92識別子であり、大文字小文字を区別しません。 TIMESTAMPADDやTIMESTAMPDIFFのようなエスケープ関数は、JDBCのエスケープ関数の構文に沿ってのみ利用できます。JDBCエスケープの構文を参照してください。
標準組込み関数
Derbyにてサポートされている標準組み込み関数は以下のとおりです。

• |  | ABSとABSVAL関数
• |  | ACOS 関数
• |  | ASIN 関数
• |  | ATAN 関数
• |  | BIGINT関数
• |  | CAST 関数
• |  | CEILおよびCEILING関数
• |  | CHAR 関数
• |  | Concatenation
• |  | COS 関数
• |  | NULLIF式
• |  | CURRENT_DATE関数
• |  | CURRENT ISOLATION 関数
• |  | CURRENT_TIME関数
• |  | CURRENT_TIMESTAMP関数
• |  | CURRENT_USER関数
• |  | DATE関数
• |  | DAY 関数
• |  | DEGREES 関数
• |  | DOUBLE関数
• |  | EXP関数
• |  | FLOOR関数
• |  | HOUR関数
• |  | IDENTITY_VAL_LOCAL関数
• |  | INTEGER関数
• |  | LENGTH関数
• |  | LNあるいはLOG関数
• |  | LOG10 関数
• |  | LOCATE関数
• |  | LCASEあるいはLOWER関数
• |  | LTRIM関数
• |  | MINUTE 関数
• |  | MOD関数
• |  | MONTH関数
• |  | PI 関数
• |  | RADIANS 関数
• |  | RTRIM関数
• |  | SECOND関数
• |  | SESSION_USER関数
• |  | SIN 関数
• |  | SMALLINT関数
• |  | SQRT関数
• |  | SUBSTR関数
• |  | TAN 関数
• |  | TIME 関数
• |  | TIMESTAMP関数
• |  | TRIM 関数
• |  | UCASE関数およびUPPER関数
• |  | USER関数
• |  | VARCHAR関数
• |  | YEAR関数

集約 (集合関数)
この節は集約(ANSI SQL-92では集合関数、データベースの書籍によっては列関数と呼びます。)について説明します。集約は、行の集合に対して式を評価する方法を提供します。他の組込み関数は単式に対して作用しますが、集約は値の集合に対して作用して一つのスカラー値にまとめられます。組込みの集約により、値の集合に対して、式の最小値、最大値、合計、計数を行い、例えば行を数えるような事ができます。また組込みのものとは別に集約を作って、例えば標準偏差を計算するようなこともできます。
組込みの集約は、組込みの集約にて可能なデータ型にあるデータ型に作用させることができます。
表 7. 組込みの集約にて可能なデータ型

' | 全データ型 | 組込みの数値型
COUNT | X | X
MIN | ' | X
MAX | ' | X
AVG | ' | X
SUM | ' | X

集約は以下の文脈にのみ置くことができます。

• |  | 選択式の選択項目
• |  | HAVING節
• |  | 集約がその問合せにあるならば、ORDER BY 節(別名を使う)つまり、選択式の選択項目に集約がある場合に限り、集約への別名をORDER BY 節に置くことができます。

選択式の選択項目にある全式は、集約か分類列である必要があります。(GROUP BY 節を参照してください。) (GROUP BY 節がないにもかかわらず、HAVING節がある場合も同様です。) なぜならば、選択式のResultSetは、スカラー(単値)かベクトル(副値)のいずれかでなければならず、その混合は許されていないからです。(集約はスカラーの値と評価され、列への参照はベクトルの値と評価されます。)例えば次の問合せはスカラーとベクトルの値が混ざっているので無効です。

    -- not valid
    SELECT MIN(flying_time), flight_id
    FROM Flights

集約にて外部への参照(相関)は無効です。つまり、副問合せが集約を含むならば、その集約が作用する式は、副問合せの外にある問合せの列を参照できません。 例えば、SUM演算子が外の問合せの列に対して行われているので、次の問合せは有効ではありません。

    SELECT c1
    FROM t1
    GROUP BY c1
    HAVING c2 >
        (SELECT t2.x
        FROM t2
        WHERE t2.y = SUM(t1.c3))

集約が外の問合せにある場合、そのResultSetのカーソルは更新可能ではありません。
この節には以下の集約があります。

• |  | AVG関数
• |  | COUNT 関数
• |  | MAX関数
• |  | MIN関数
• |  | SUM関数

ABSとABSVAL関数
ABS と ABSVALは数式の絶対値を返します。 帰り値の型は引数の型と同じです。組込みの数値型は全て使うことができます。 (DECIMAL, DOUBLE PRECISION, FLOAT, INTEGER、 BIGINT、 NUMERIC、 REAL それとSMALLINT)。
構文

    ABS(数式)

    -- 3が返る。
    VALUES ABS(-3)

ACOS 関数
ACOS関数は与えられた数を引数とした逆余弦関数の値を返します。
引数は任意のラジアンによる角度の余弦です。また引数のデータ型は倍精度浮動小数点数でなければなりません。

• |  | もし引数がNULLなら、関数の返り値もNULLです。
• |  | もし引数の絶対値が1を超える場合、値が範囲外であることを示す例外が返ります。(SQL state 22003)

返り値はラジアンで、その範囲は0からpiです。 返り値のデータ型は倍精度浮動小数点数です。
Syntax

    ACOS ( 数 )

ASIN 関数
ASIN 関数は与えられた数を引数とする逆正弦の値を返します。
与えられた数はラジアンによる任意の角の正弦です。引数は倍精度浮動小数点数である必要があります。

• |  | 引数がNULLなら関数の結果もNULLです。
• |  | 引数が0なら、返り値も引数と同じ符号の0です。
• |  | 引数の絶対値が1を超える場合、範囲外の値を示す例外が返ります。(SQL state 22003)

返り値はラジアンで、その範囲は-pi/2からpi/2です。また返り値のデータ型は倍精度浮動小数点数です。
Syntax

    ASIN ( 数 )

ATAN 関数
ATAN 関数は与えられた数を引数とした逆正接を返します。
引数にはラジアンによる任意の角度の正接を与えることができます。 引数は倍精度浮動小数点数でなければなりません。

• |  | 引数がNULLであるなら、返り値もNULLとなります。
• |  | 引数が0であるなら、返り値は引数と同じ符号の0となります。

返り値はラジアンで、その範囲は-pi/2からpi/2です。またそのデータ型は倍精度浮動小数点数です。
構文

    ATAN ( 数 )

AVG関数
AVGは複数行にわたる式の平均を評価する集約関数です。(集約 (集合関数)を参照してください。) AVGは数値型に評価される式に対してのみ作用させることができます。
構文

    AVG ( [ DISTINCT | ALL ] 式 )

DISTICTを指定すると、重複が取り除かれます。 ALLを指定すると、重複を残します。ALLもDISTINCTも指定されない場合の既定はALLです。 例えば、列の値が1.0、1.0、1.0、1.0、2.0だったとします。この場合、AVG(col)はAVG(DISTINCT col)より小さな値を返します。
DISTINCTな集約式は、選択式に一つだけ置くことができます。 例えば、次の問合せは無効です。

    SELECT AVG (DISTINCT flying_time), SUM (DISTINCT miles)
    FROM Flights

式には複数列への参照や式があってかまいませんが、他の集約や副問合せがあってはなりません。 また評価結果はSQL-92の数値型でなければなりません。したがってSQL-92の型に評価される関数なら呼ぶことができます。もし評価結果がNULLであった場合、集約にてその値は省かれます。
結果のデータ型は操作される式と同じデータ型です。(オーバーフローはありません) 例えば次の問合せは予想に反して整数の1を返します。

    SELECT AVG(c1)
    FROM (VALUES (1), (1), (1), (1), (2)) AS myTable (c1)

より精度が必要であれば、式をキャストします。

    SELECT AVG(CAST (c1 AS DOUBLE PRECISION))
    FROM (VALUES (1), (1), (1), (1), (2)) AS myTable (c1)

BIGINT関数
BIGINT関数は数または数の書式を取る文字列を引数にとり、64ビットの整数を返します。
構文

    BIGINT (文字式 | 数式 )

文字式
最大文字数を超えない長さの文字列を返す式です。 前後の空白を取り除いた後の値は、SQLの数の書式に沿わなければなりません。 文字列は長い型であってはなりません。 引数が文字式であった場合、対応する整数をbig integerの列や変数に与えたときと同じように動作します。
数式
いずれかの組込まれた数の型を返す式です。 もし引数が数式であれば、big integerの列や変数に数を与えたときと同じように動作します。 もし引数が整数の範囲に収まらなければエラーが発生します。小数部があれば切り捨てられます。
関数の結果はbig integerです。引数がnullであるなら、返り値はnullです。
EMPLOYEEという表にて、後の処理を考慮してbig integerの形式でEMPNOという列を選択します。

    SELECT BIGINT (EMPNO) FROM EMPLOYEE

CASE 式
Derbyで条件式を書くには、CASE式を使います。
CASE式の構文
式を置くことができる場所であれば、どこにでもCASE式を置くことができます。 この式では真偽の判定に基づき、評価される式が決まります。

    CASE
      WHEN 真偽式 THEN then式
      [ WHEN 真偽式 THEN then式 ]...
      ELSE else式
    END

Then式とelse式は型に互換性がある式でなければなりません。組み込まれている型に関して言えば、同じ型であるか、型の間に組み込みの拡張変換がある必要があります。

    -- 3を返す。
    VALUES CASE WHEN 1=1 THEN 3 ELSE 4 END

    -- 7を返す。
    VALUES
       CASE
          WHEN 1 = 2 THEN 3
          WHEN 4 = 5 THEN 6
          ELSE 7
       END

CAST 関数
CAST関数により値の型を他の型に変換します。また動的な引数(?)やNULL値に型を与えます。
CASTの式は式を置くことができる場所ならどこにでも置くことができます。
構文

    CAST ( [ 式 | NULL | ? ]
        AS データ型)

式をキャストする先のデータ型のことを目標型といいます。キャストしようとしている式のデータ型のことを源泉型といいます。
CASTによるSQL-92 データ型間の変換
以下に示す表はSQLデータ型にて明示的な変換が有効な、源泉型と目標型を示します。 この表は何れのデータ型の間で明示的な変換が有効なのかを示します。 表の最初の列は源泉型を示します。表の最初の行は目標型を示します。 Yは源泉型から目標型への型の変換が有効であることを示します。 例えば、二行目の最初のコマにより源泉型はSMALLINTと記述されます。 二行目のほかのコマは、表の最初の行に書かれている型を目標型として、SMALLINTの型を変換できるか否かを記述します。
表 8. SQL-92 データ型間にて明示的な変換が有効な、源泉型と目標型

Types |
    S
    M
    A
    L
    L
    I
    N
    T
    I
    N
    T
    E
    G
    E
    R
    B
    I
    G
    I
    N
    T
    D
    E
    C
    I
    M
    A
    L
    R
    E
    A
    L
    D
    O
    U
    B
    L
    E
    F
    L
    O
    A
    T
    C
    H
    A
    R
    V
    A
    R
    C
    H
    A
    R
    L
    O
    N
    G

    V
    A
    R
    C
    H
    A
    R
    C
    H
    A
    R

    F
    O
    R

    B
    I
    T

    D
    A
    T
    A
    V
    A
    R
    C
    H
    A
    R

    F
    O
    R

    B
    I
    T

    D
    A
    T
    A
    L
    O
    N
    G

    V
    A
    R
    C
    H
    A
    R

    F
    O
    R

    B
    I
    T

    D
    A
    T
    A
    C
    L
    O
    B
    B
    L
    O
    B
    D
    A
    T
    E
    T
    I
    M
    E
    T
    I
    M
    E
    S
    T
    A
    M
    P
    X
    M
    L
SMALLINT | Y | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | -
INTEGER | Y | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | -
BIGINT | Y | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | -
DECIMAL | Y | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | -
REAL | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | -
DOUBLE | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | -
FLOAT | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | -
CHAR | Y | Y | Y | Y | - | - | - | Y | Y | Y | - | - | - | Y | - | Y | Y | Y | -
VARCHAR | Y | Y | Y | Y | - | - | - | Y | Y | Y | - | - | - | Y | - | Y | Y | Y | -
LONG VARCHAR | - | - | - | - | - | - | - | Y | Y | Y | - | - | - | Y | - | - | - | - | -
CHAR FOR BIT DATA | - | - | - | - | - | - | - | - | - | - | Y | Y | Y | Y | Y | - | - | - | -
VARCHAR FOR BIT DATA | - | - | - | - | - | - | - | - | - | - | Y | Y | Y | Y | Y | - | - | - | -
LONG VARCHAR FOR BIT DATA | - | - | - | - | - | - | - | - | - | - | Y | Y | Y | Y | Y | - | - | - | -
CLOB | - | - | - | - | - | - | - | Y | Y | Y | - | - | - | Y | - | - | - | - | -
BLOB | - | - | - | - | - | - | - | - | - | - | - | - | - | - | Y | - | - | - | -
DATE | - | - | - | - | - | - | - | Y | Y | - | - | - | - | - | - | Y | - | - | -
TIME | - | - | - | - | - | - | - | Y | Y | - | - | - | - | - | - | - | Y | - | -
TIMESTAMP | - | - | - | - | - | - | - | Y | Y | - | - | - | - | - | - | Y | Y | Y | -
XML | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | Y

変換が有効なら、CASTは可能です。源泉型と目標型の間の大きさの非互換性は、実行時にエラーを起こすことがあります。
但し書き
この議論では、DerbyにてSQL-92データ型は、以下のように分類されます。

• |  | 数
• |  | 正確な数 (SMALLINT, INTEGER, BIGINT, DECIMAL, NUMERIC)
• |  | 近似の数 (FLOAT, REAL, DOUBLE PRECISION)
• |  | 列
• |  | 文字列 (CLOB, CHAR, VARCHAR, LONG VARCHAR)
• |  | ビット列 (BLOB, CHAR FOR BIT DATA, VARCHAR FOR BIT DATA, LONG VARCHAR FOR BIT DATA)
• |  | 日時
• |  | DATE
• |  | TIME
• |  | TIMESTAMP

数値型からの型変換
数値型は他のいかなる数値型にも変換できます。もし数の小数部ではない部分を切り捨てなければ、変換した目標型で扱えないならば例外が発生します。もし源泉型の小数部を目標型で扱えないならば、目標型にて扱えるよう暗黙裡に源泉型の値は切り捨てられます。たとえば、763.1234をINTEGERに変換すると763となります。
ビット列の型への/からの型変換
ビット列の型は他のビット列の型に変換できますが、文字列に変換することはできません。 文字列の型をビット列の型に変換すると、目標のビット型の長さに会うように、末尾が0で詰められます。BLOB型はより限定されており、明示的な変換を必要とします。 ほとんどの場合、BLOB型からは/へは型変換できません。
日/時の型変換
日/時の値はいかなる場合でもTIMESTAMPへ/から型変換できます。 DATEがTIMESTAMPに型変換された場合、結果のTIMESTAMPにてTIMEの部分は常に00:00:00です。 もしTIMEがTIMESTAMPに型変換された場合、結果のTIMESTAMPにてDATEの部分は、CASTが実行されたときのCURRENT_DATEの値となります。 TIMESTAMPがDATEに型変換される場合、TIMEの部分は暗黙裡に切り捨てられます。 TIMESTAMPがTIMEに型変換される場合、DATEの部分は暗黙裡に切り捨てられます。

    SELECT CAST (miles AS INT)
    FROM Flights
    -- timestampを文字列に変換する
    INSERT INTO mytable (text_column)
    VALUES (CAST (CURRENT_TIMESTAMP AS VARCHAR(100)))
    -- NULLを適切なデータ型に変換しなければならない。
    SELECT airline
    FROM Airlines
    UNION ALL
    VALUES (CAST (NULL AS CHAR(2)))
    -- doubleをdecimalに変換する。
    SELECT CAST (FLYING_TIME AS DECIMAL(5,2))
    FROM FLIGHTS
    -- SMALLINTをBIGINTに変換する
    VALUES CAST (CAST (12 as SMALLINT) as BIGINT)

XML値の変換
明示的にも暗黙的にも、XMLの値はXML以外の如何なる型へも型変換できません。XML型を文字列型にする場合は、XMLSERIALIZE 演算子を使ってください。
CEILおよびCEILING関数
CEILおよびCEILING関数は与えられた数を切り上げて、その数以上の最小の値を返します。
引数は倍精度浮動小数点数でなければなりません。

• |  | もし引数がNULLなら、返り値はNULLです。
• |  | もし引数が整数なら、返り値は引数と同じ数値です。
• |  | もし引数が0なら、返り値は0です。
• |  | もし引数が0より小さく-1.0より大きければ、返り値は0です。

関数の返り値は引数より大きい最小の(負の無限大にちかい)整数で、倍精度浮動小数点数であらわされます。
Syntax

    CEIL ( 数 )

    CEILING ( 数 )

CHAR 関数
CHAR関数により固定長の文字列への変換値が返されます。
行われる変換は以下のとおりです。

• |  | 文字列変換 一つ目の引数が文字列である場合です。
• |  | 日時変換 一つ目の引数が日付、時刻、タイムスタンプである場合です。
• |  | 小数変換 一つ目の引数が小数である場合です。
• |  | 倍精度浮動小数点数変換 一つ目の引数がDOUBLEあるいはREALである場合です。
• |  | 整数変換 一つ目の引数がSMALLINT、INTEGER、BIGINTである場合です。

一つ目の引数は、その型が組込みのデータ型である必要があります。CHAR関数の返り値は固定長の文字列です。一つ目の引数はNULLとすることができ、その場合は返り値はNULLです。一つ目の引数は、その型がXMLであってはなりません。もしXMLの値を固定長のCHARにしたいのなら、SQL/XML直列化演算子のXMLSERIALIZEを使う必要があります。
文字から文字への変換を行う時の書き方

    CHAR (文字式 [, 数] )

文字式
CHAR、VARCHAR、LONG VARCHAR、CLOBのいずれかのデータ型の値を返す式。
数
返却される固定長文字列の長さ。値は0から254の間でなければならない。
もし文字式の長さが数よりも小さかった場合、長さが数と等しくなるよう、関数の結果は空白によりつめられます。もし文字式の長さが数より大きかった場合、切捨てが行われます。もし空白以外の文字が切り捨てられ、文字式が長い文字列(LONG VARCHARやCLOB)でなければ、警告が返されます。
整数から文字への変換を行うときの書き方

    CHAR (整数式 )

整数式
整数のデータ型(SMALLINT、INTEGER、BIGINT)型の値を返す式
関数の結果は、SQLの整数として渡された引数を文字列で表現したものとなります。結果は引数の数を10進で表すn文字および、もし引数が負数であったなら負の符号から構成されます。また結果は左詰めされています。

• |  | もし一つ目の引数がSMALLINTなら、結果の文字列の長さは6です。もし結果にて数値の文字数が6に満たない場合は、6文字となるよう右側に空白が詰められます。
• |  | もし一つ目の引数がINTEGERなら、結果の文字列の長さは11です。もし結果にて数値の文字数が11に満たない場合は、11文字となるよう右側に空白が詰められます。
• |  | もし一つ目の引数がBIGINTなら、結果の文字列の長さは20です。もし結果にて数値の文字数が20に満たない場合は、20文字となるよう右側に空白が詰められます。

日時から文字への変換を行うときの書き方

    CHAR (日時式 )

日時式
式は次のデータ型の何れかです。

• |  | 日付: 結果は日付を表す文字表現です。結果の長さは10です。
• |  | 時刻: 結果は時刻を表す文字表現です。結果の長さは8です。
• |  | タイムスタンプ: 結果はタイムスタンプを表す文字表現です。結果の長さは26です。

小数から文字への変換を行うときの書き方

    CHAR (小数式 )

小数式
小数のデータ型を返す式です。もし精度や目盛りの変更を行う場合は、文字への変換を行う前にDECIMALというスカラー関数により変更してください。
浮動小数点数から文字への変換を行うときの書き方

    CHAR (浮動小数点数式 )

浮動小数点数式
浮動小数点数のデータ型(DOUBLEやREAL)の値を返す式です。
CHAR関数によりEDLEVEL(smallint型と定義されているとします。)の値を、固定長の文字列として返します。

    SELECT CHAR(EDLEVEL) FROM EMPLOYEE

EDLEVELが18とするなら、その値がCHAR(6)型で'18 'と返されます。(18に空白が4つ続きます。)
Concatenation
連結演算子の||により、右辺のオペランドが左辺のオペランドの末尾に連結されます。この演算子は文字やビットの式に作用します。
全ての組み込みのデータ型は暗黙裡に文字列に変換されるので、この関数は全ての組み込みのデータ型に作用します。
構文

    {
        { 文字式 || 文字式 } |
        { ビット式 || ビット式 }
    }

文字式の場合、もし右辺と左辺のオペランドの型がどちらもCHARであれば、連結した結果はCHARで、そうでないなら連結した結果はVARCHARです。 CHARやVARCHARにて一般的な、空白詰や値のトリムが、この演算子の結果にて適用されます。
結果文字列の長さは両方のオペランドの長さの和です。
ビット列については、もし右辺と左辺のオペランドの型がどちらもCHAR FOR BIT DATAであれば、連結した結果はCHAR FOR BIT DATAで、そうでないなら連結した結果はVARCHAR FOR BIT DATAです。

    --返り値は'supercalifragilisticexbealidocious(sp?)'です。
    VALUES 'supercalifragilistic' || 'exbealidocious' || '(sp?)'
    -- NULLを返します。
    VALUES CAST (null AS VARCHAR(7))|| 'AString'
    -- '130asdf'を返します。
    VALUES '130' || 'asdf'

COS 関数
COS関数は引数から余弦を返します。
引数は余弦を計算する角度で、ラジアンによるものとします。 引数のデータ型は倍精度浮動小数点数です。

• |  | もし引数がNULLであれば、関数の結果はNULLです。

構文

    COS ( 数 )

COUNT 関数
COUNTは式の行数を数える集約関数です。(集約 (集合関数)を参照してください。) COUNTはどのような型の式でも利用できます。
構文

    COUNT ( [ DISTINCT | ALL ] 式 )

DISTINCTという限定詞により重複を取り除くことができます。ALLという限定詞により重複をそのままにすることができます。もしDISTINCTもALLも指定されなければ、ALLが与えられたものとします。例えば、列に1、1、1、1および2という値があった場合、COUNT(col)はCOUNT(DISTINCT col)より大きな数を返します。
一つの選択式には、唯一つのDISTINCT集約式をとることができます。例えば次のように問合せる事はできません。

    -- 問い合わせできない
    SELECT COUNT (DISTINCT flying_time), SUM (DISTINCT miles)
    FROM Flights

式には複数の列への参照や式を置く事ができますが、他の集約や副問合せを置くことはできません。 もし式がNULLと評価される場合、その評価値について集約は行われません。
COUNTによる結果のデータ型は、INTEGERです。

    -- それぞれの地域の国の数を数え、
    -- 二国以上ある地域を表示する。
    SELECT COUNT (country), region
    FROM Countries
    GROUP BY region
    HAVING COUNT (country) > 1

COUNT(*) 関数
COUNT(*) は行数を数える集約関数です。NULLや重複は排除されません。COUNT(*)は式への操作ではありません。
分布

    COUNT(*)

結果のデータ型はINTEGERです。

    -- Flightsという表にある行数を数えます。
    SELECT COUNT(*)
    FROM Flights

CURRENT DATE 関数
CURRENT DATE はCURRENT_DATEの別名です。
CURRENT_DATE関数
CURRENT_DATEは現在の日付を返します。なお一つの文で複数呼ばれた時に返される値は同じです。従って時間を置いてカーソルが行を拾うときでも、値は固定されていて同じということです。
構文

    CURRENT_DATE

あるいは

    CURRENT DATE

    -- 現在より以降の日付の便を探す。
    SELECT * FROM Flightavailability where flight_date > CURRENT_DATE;

CURRENT ISOLATION 関数
CURRENT ISOLATIONは、現在の分離レベルをchar(2)の型で返します。値は次のいずれかです。 ""(空白)、"UR"、"CS"、"RS"あるいは"RR"。
構文

    CURRENT ISOLATION

    VALUES CURRENT ISOLATION

CURRENT SCHEMA関数
CURRENT SCHEMAはデータベースの情報への参照名を限定できるスキーマ名を返します。
Note: CURRENT SCHEMAとCURRENT SQLIDは別名です。
これらの関数は最大128文字の文字列を返します。
構文

    CURRENT SCHEMA

    -- または、

    CURRENT SQLID

    -- nameという列の既定値を現在のスキーマ名にする。
    CREATE TABLE mytable (id int, name VARCHAR(128) DEFAULT CURRENT SQLID)
    -- 表に現在のスキーマ名となっている既定値を挿入する。
    INSERT INTO mytable(id) VALUES (1)
    -- 現在のスキーマと同じ名前の表を返す。
    SELECT name FROM mytable WHERE name = CURRENT SCHEMA

CURRENT TIME
CURRENT TIME はCURRENT_TIMEの別名です。
CURRENT_TIME関数
CURRENT_TIMEは現在の時刻を返します。一つの文の内であれば、関数は何度呼ばれても同じ値を返します。ですから、カーソルで行を拾う間に経過した時間にかかわらず、この関数は一つに決まった値を返します。
分布

    CURRENT_TIME

あるいは

    CURRENT TIME

    VALUES CURRENT_TIME
    -- または、

    VALUES CURRENT TIME

CURRENT TIMESTAMP関数
CURRENT TIMESTAMP はCURRENT_TIMESTAMPの別名です。
CURRENT_TIMESTAMP関数
CURRENT_TIMESTAMPは現在のタイムスタンプを返します。関数から返される値は一つの文のうちであれば、何度実行されても同じ値を返します。ですから、カーソルから行を拾う間に経過した時間にかかわらず、この関数は同じ値を返します。
分布

    CURRENT_TIMESTAMP

または

    CURRENT TIMESTAMP

    VALUES CURRENT_TIMESTAMP
    -- または

    VALUES CURRENT TIMESTAMP

CURRENT_USER関数
CURRENT_USER は現在のユーザの認証識別子を返します。 (つまりデータベースに接続したときにDBMSに渡したユーザの名前です。) もし現在のユーザがいないのなら、APPを返します。
USERとSESSION_USERという別名があります。
関数は最大で128文字の文字列を返します。
構文

    CURRENT_USER

    VALUES CURRENT_USER

DATE関数
DATE関数は引数から日付を返します。
引数は日付か、タイムスタンプ、2,932,897以下の正の整数、CLOB/LONG VARCHAR/XML以外の日付かタイムスタンプとして有効あるいは長さ7の文字列です。 ここで長さ7の文字列は、yyyynnnという書式をとります。yyyyは年を示す10進の数で、nnnは年の日を示す001から366までの10真の数です。この関数は日付を返します。これらの引数でnullをとることができるなら返り値もnullをとることができ、引数のnullなら返り値もnullです。
そのほか、引数のデータ型にそったルールがあります。

• |  | もし引数が日付、タイムスタンプあるいは日付やタイムスタンプとして有効な文字列であれば、引数の日付の部分が返り値となります。
• |  | もし引数が数であるならば、その引数をnとして、西暦1年1月1日よりn-1日後の日付が返り値となります。
• |  | もし引数が長さ7の文字列であれば、その文字列が表す日付が返り値となります。

構文

    DATE ( 式 )

この例では'1988/12/25'の内部表現が結果となります。

    VALUES DATE('1988-12-25')

DAY 関数
DAY関数は値のうち日付の部分を返します。
引数は日付、タイムスタンプ、あるいはCLOB、LONG VARCHAR、XML以外の日付やタイムスタンプを有効に表す文字列でなければなりません。関数の結果は1から31の間の整数です。もし引数がnullを許す型であるなら結果もnullとなることがあり、もし引数がnullなら結果はnullです。
構文

    DAY ( 式 )

例

    values day('2006-08-02');

結果は2となります。
DEGREES 関数
DEGREES関数はラジアンの値を度の値へ変換します。
引数はラジアンの角度です。関数は度の単位で引数とほぼ等しい値を返します。 引数は倍精度浮動小数点数でなければなりません。
重要: ラジアンから度への変換は正確ではありません。COS(RADIANS(90.0))が正確に0.0であることを期待してはなりません。
返り値のデータ型は倍精度浮動小数点数です。
構文

    DEGREES ( 数 )

DOUBLE関数
DOUBLE関数は以下の引数に応じて浮動小数点数を返します。

• |  | 引数が数の式であれば、その数
• |  | 引数が文字列の式であれば、文字列の表す数

数を倍精度浮動小数点数へ

    DOUBLE [PRECISION] (数式 )

数式
引数は組込みの数値型を返す式です。
関数の結果は倍精度浮動小数点数です。引数の型がnulをとることができるなら結果がnullとなることがあり、引数がnullなら結果はnullです。関数の結果は、引数が倍精度浮動小数点数の列や変数へと代入される値と等しくなります。
文字列を倍精度浮動小数点数へ

    DOUBLE (文字列式 )

文字列式
引数は数の定数を表す、CHARあるいはVARCHAR型の値です。なお前後の空白は無視されます。
関数の結果は倍精度浮動小数点数となります。 引数の型がnulをとることができるなら結果がnullとなることがあり、引数がnullなら結果はnullです。 関数の結果は、文字列が定数として倍精度浮動小数点数の列や変数へと代入される値と等しくなります。
EXP関数
EXP関数はeを底として、引数の累乗を返します。
関数の引数にはeを底として累乗を計算する指数を与えます。 引数は倍精度浮動小数点数 でなければなりません。
eは自然対数の底です。
関数の返り値のデータ型は倍精度浮動小数点数です。
構文

    EXP ( 数 )

FLOOR関数
FLOOR関数は引数の値に切り捨ての丸め処理を行い、引数以下の最大の整数を返します。
引数は倍精度浮動小数点数でなければなりません。

• |  | もし引数がNULLなら、関数の結果はNULLです。
• |  | もし引数が整数なら、関数の結果は引数と同じ値です。
• |  | もし引数が0なら、関数の結果は0です。

関数が返す値は引数以下の、最大(正の無限大に近い)の整数です。返り値のデータ型は倍精度浮動小数点数です。
構文

    FLOOR ( 数 )

HOUR関数
HOUR関数は値の時の部分を返します。
引数は時刻、タイムスタンプ、CLOB、LONG VARCHAR、XML以外の時刻あるいはタイムスタンプを有効に表す文字列でなければなりません。 関数の結果は整数です。もし引数がnullをとれるデータ型なら返り値がnullとなることがあり、引数がnullなら返り値はnullです。
構文

    HOUR ( 式 )

例
TABLE1という表から午後に始まるクラスを選択します。

    SELECT * FROM TABLE1
    WHERE HOUR(STARTING) BETWEEN 12 AND 17

IDENTITY_VAL_LOCAL関数
Derby はIDENTITY_VAL_LOCAL関数をサポートします。
構文:

     IDENTITY_VAL_LOCAL ( )

IDENTITY_VAL_LOCAL関数は非決定性の関数で、最近その接続でVALUES節のあるINSERT文により識別列へ代入された値を返します。
IDENTITY_VAL_LOCAL関数には引数はありません。関数の結果は対応する識別列のデータ型によらずDECIMAL (31,0)です。
IDENTITY_VAL_LOCAL関数により、ある接続に返される値は、単行のINSERT文で識別列に代入された最近の値です。INSERT文は識別列を持つ表へのVALUES節を持たなければなりません。 代入された値はDerbyが生成した識別値です。 もし識別列を持つ表に対して単行のINSERT文が発行されていないなら、この関数はnullを返します。
この関数の結果は以下の事柄に影響を受けません。

• |  | 識別列のないVALUES節を持つ単行のINSERT文
• |  | VALUES節を持つ複数行のINSERT文
• |  | selectによるINSERT文

もし識別列を持つ表にINSERTトリガが定義されており、そのトリガが別の識別列を持つ表への挿入を行う場合、IDENTITY_VAL_LOCAL()関数は文で生成された値を返し、トリガによる値を返しません。
例:

    ij> create table t1(c1 int generated always as identity, c2 int);
    0 rows inserted/updated/deleted
    ij> insert into t1(c2) values (8);
    1 row inserted/updated/deleted
    ij> values IDENTITY_VAL_LOCAL();
    1
    -------------------------------
    1
    1 row selected
    ij> select IDENTITY_VAL_LOCAL()+1, IDENTITY_VAL_LOCAL()-1 from t1;
    1                                |2
    -------------------------------------------------------------------
    2                                |0
    1 row selected
    ij> insert into t1(c2) values (IDENTITY_VAL_LOCAL());
    1 row inserted/updated/deleted
    ij> select * from t1;
    C1             |C2
    -------------------------------
    1              |8
    2              |1
    2 rows selected
    ij> values IDENTITY_VAL_LOCAL();
    1
    -------------------------------
    2
    1 row selected
    ij> insert into t1(c2) values (8), (9);
    2 rows inserted/updated/deleted
    ij> -- 複数の値の挿入では、関数が返す値は変わらない。
    values IDENTITY_VAL_LOCAL();
    1
    -------------------------------
    2
    1 row selected
    ij> select * from t1;
    C1             |C2
    -------------------------------
    1              |8
    2              |1
    3              |8
    4              |9
    4 rows selected
    ij> insert into t1(c2) select c1 from t1;
    4 rows inserted/updated/deleted
    -- selectを元にした挿入では、関数が返す値は変わらない。
    ij> values IDENTITY_VAL_LOCAL();
    1
    -------------------------------
    2
    1 row selected
    ij> select * from t1;
    C1             |C2
    -------------------------------
    1              |8
    2              |1
    3              |8
    4              |9
    5              |1
    6              |2
    7              |3
    8              |4
    8 rows selected

INTEGER関数
INTEGER関数は、数、文字列、日付、時刻を表す整数を定整数の書式を返します。
構文

    INT[EGER] (数式 | 文字列式 )

数式
組込みの数値データ型を返す式です。 もし引数が数式であれば、その式が大きな整数の列や変数へと代入された時と同じ数が返ります。 もし引数が整数の範囲に収まらないなら、エラーとなります。また、引数の小数部は切り捨てられます。
文字列式
文字定数の最大長より短い文字列長の文字列を返す式です。 引数から前後の空白文字を取り除いた残りは、SQLの定整数書式に沿っていなければなりません。 この文字列は長い文字列であってはなりません。 もし引数が文字列であれば、その式が大きな整数の列や変数に代入されたときと同じ数が返ります。
関数の結果は大きな整数です。引数にnullをとることができる場合、結果がnullとなることがあり、引数がnullなら返り値はnullです。
EMPLOYEE表から給与(SALARY)を教育レベル(EDLEVEL)で除した数の一覧を選択します。この除算にて小数は切り捨てられます。この一覧には計算の元となる値や社員番号(EMPNO)が含まれます。この一覧は計算結果の降順となっています。:

    SELECT INTEGER (SALARY / EDLEVEL), SALARY, EDLEVEL, EMPNO
    FROM EMPLOYEE
    ORDER BY 1 DESC

LCASEあるいはLOWER関数
LCASEおよびLOWERは引数に文字式をとり、あらゆるアルファベットを小文字に変えて返します。
構文

    LCASE または LOWER ( 文字式 )

文字式のデータ型は、CHAR、VARCHARあるいはLONG VARCHARまたは暗黙に(ビット列ではなく)文字列に変換可能な組込みのデータ型です。
もし引数のデータ型がCHARあるいはLONG VARCHARであれば、返り値のデータ型はそれぞれCHARあるいひあLONG VARCHARです。それ以外の場合は返り値のデータ型はVARCHARです。
返り値の長さや最大長は引数の長さや最大長と同じです。
もし文字式がnullに評価されるなら、関数の返り値はnullです。

    -- 'asd1#w'を返します。
    VALUES LOWER('aSD1#w')

    SELECT LOWER(flight_id) FROM Flights

LENGTH関数
LENGTHは文字列式あるいはビット列式に適用して、文字の長さを結果として返します。
あらゆる組込みのデータ型は暗黙のうちに文字列に変換できるので、この関数はあらゆるデータ型に適用することができます。
構文

    LENGTH ( { 文字列式 | ビット列式 } )

    -- 20を返す。
    VALUES LENGTH('supercalifragilistic')
    -- 1を返す。
    VALUES LENGTH(X'FF')
    -- 4を返す
    VALUES LENGTH(1234567890)

LNあるいはLOG関数
LNあるいはLOG関数は引数の自然対数(eを底とします。)を返します。
引数は0より大きな倍精度浮動小数点数でなければなりません。

• |  | もし引数がNULLであるなら、関数の結果はNULLです。
• |  | もし引数が0あるいは負数であるなら、値が範囲外であることを表す例外(SQL state 22003)が挙がります。

返り値のデータ型は倍精度浮動小数点数です。
構文

    LN ( 数 )

    LOG ( 数 )

LOG10 関数
LOG10関数は10を底とした対数を返します。
引数は0より大きな倍精度浮動小数点数です。

• |  | もし引数がNULLであるなら、返り値はNULLです。
• |  | もし引数が0あるいは負数であるなら、値が範囲外であることを表す例外(SQL state 22003)が挙がります。

返り値のデータ型は倍精度浮動小数点数です。
Syntax

    LOG10 ( 数 )

LOCATE関数
LOCATE関数を使って、文字列の一致する箇所を他の文字列から探し出すことができます。文字列が見つかった場合、LOCATEは見つかった位置を返します。見つからなかった場合、LOCATEは0を返します。
構文

    LOCATE(文字式, 文字式 [, 開始位置] )

LOCATE関数には必須な二つの引数と、任意で指定できる三つ目の引数があります。

• |  | 最初の文字式で指定された文字列が探し出されます。
• |  | 二つ目の文字式で指定された文字列より、探し出されます。
• |  | 三つ目の引数は開始位置で、二つ目の引数のどの位置から文字列を探し出すかを指定します。もし三つ目の引数が指定されなければ、LOCATE関数は二つ目の引数の頭から文字列を探し出します。

LOCATEの返り値は整数です。LOCATE関数は二つ目の引数のうちで、一つ目の引数が最初に見つかった位置を表す整数を返します。この位置は1から始まります。 もし二つ目の引数から一つ目の引数が見つからなかった場合、LOCATEは0を返します。もし一つ目の引数が空文字列('')だった場合は二つ目の引数も空文字列であったとしても、LOCATEは三つ目の引数(もし指定されていなければ1)を返します。 いずれかの文字式にNULLが渡された場合はNULLが返ります。

    -- 'love'が2の位置で見つかるので2が返る。
                VALUES LOCATE('love', 'clover')

    -- 'clover'から'stove'は見つからないので0が返る。
                VALUES LOCATE('stove', 'clover')

    -- 5が返る。(開始位置は4)
                VALUES LOCATE('iss', 'Mississippi', 4)

    -- 空文字列は特別で1が返る。
                VALUES LOCATE('', 'ABC')

    -- ''から'AAA'は見つからないので0が返る。
                VALUES LOCATE('AAA', '')

    -- 3が返る。
                VALUES LOCATE('', '', 3)

LTRIM関数
LTRIMは文字列式から先頭にある空白文字の列を取り除きます。
構文

    LTRIM(文字式)

A 文字式のデータ型は、CHAR、VARCHARあるいはLONG VARCHARあるいは暗黙に文字列に変換可能な組込みの型です。
もし文字式の評価が空なら、LTRIMはNULLを返します。

    -- 'asdf  'が返ります。
    VALUES LTRIM(' asdf  ')

MAX関数
MAXは行の集合から最大の値を求める集約関数です。(集約 (集合関数)を参照してください。) MAXは組み込まれたデータ型の式に対してのみ適用することができます。 (CHAR、VARCHAR、DATE、TIME、CHAR FOR BIT DATA等を含みます。)
構文

    MAX ( [ DISTINCT | ALL ] 式 )

DISTINCTやALLという限定詞により、重複が除去されたりそのまま残されるか決まりますが、これらの限定詞はMAXの式では意味を持ちません。 選択式に置くことのできる、DISTINCTの限定詞は一つだけです。 例えば、次の問合せは許されていません。

    SELECT COUNT (DISTINCT flying_time), MAX (DISTINCT miles)
    FROM Flights

式は複数の列への参照や式を含むことができますが、他の集約や副問合せを含むことはできません。 また組込みのデータ型に評価されなければなりません。 従って組込みのデータ型と評価されるメソッドを呼ぶことができます。 (例えばjava.lang.Integerやintを返すメソッドはINTEGERと評価されます。) もし式がNULLと評価された場合、集約においてその値は無視されます。
CHAR、VARCHARについては、値の末尾にある空白文字列は、MAXの振る舞いに影響があります。 たとえば、'z'と'z 'の両方が列に格納されていた場合、空白は比較にて無視されるので結果は不定ですが、何れか片方の値が返されます。
結果のデータ型はMAXが動作する式と同じものとなります。(オーバーフローすることはありません。)

    -- FlightAvailabilityという表から最近の日付を探す。
    SELECT MAX (flight_date) FROM FlightAvailability
    -- それぞれの空港を出発する最も長距離の便を探す。
    -- なお10時間以上の便のみとする。
    SELECT MAX(flying_time), orig_airport
    FROM Flights
    GROUP BY orig_airport
    HAVING MAX(flying_time) > 10

MIN関数
MINは集約関数で、全行に渡る式の最小値を求めます。 (集約 (集合関数)を参照してください。) MINは組み込みのデータ型に対してのみ適用可能です。(これにはCHAR、VARCHAR、DATE、TIME等が含まれます。)
構文

    MIN ( [ DISTINCT | ALL ] 式 )

DISTINCTとALLという限定詞には、重複を取り除いたり、重複を残す働きがあります。しかしこれらの限定詞はMIN式では効果がありません。 選択式には限定詞は唯一つしか書くことができません。 例えば次の問合せは許されません。

    SELECT COUNT (DISTINCT flying_time), MIN (DISTINCT miles)
    FROM Flights

この式には複数の列への参照や式を書くことができます。しかし、副問合せや他の集約を書くことはできません。 式は組込みのデータ型として評価されなければならず、従ってメソッドを呼ぶなら組込みのデータ型に評価されなければなりません。(例えば、java.lang.Integerやintを返すメソッドであるなら、INTEGERと評価されます。)もし式がNULLと評価されるのであれば、その値は集約にて無視されます。
型により最小値を決める規則は異なります。CHAR、VARCHARでは、MINの評価結果は値の末尾にある空白文字数に影響されます。 例えば'z'と'z 'が列に記録されていたとして、どちらの値が最小値として返されるかを決める方法はありません。なぜならば文字列の比較にて空白文字は無視されるからです。
結果のデータ型は処理する式のデータ型と同じです。(オーバーフローすることはありません。)

    -- 有効ではありません。
    SELECT DISTINCT flying_time, MIN(DISTINCT miles) from Flights
    -- 有効です。
    SELECT COUNT(DISTINCT flying_time), MIN(DISTINCT miles) from Flights
    -- 最も若い日付を探します。
    SELECT MIN (flight_date) FROM FlightAvailability;

MINUTE 関数
MINUTE関数は値の分の部分を返します。
引数は時、タイムスタンプあるいはCLOB・LONG VARCHAR・XML以外の、時・タイムスタンプを表す有効な文字列でなければなりません。 返り値は0から59の間の数です。引数にはnullをとることができ、その場合は返り値はnullをとることができます。もし引数がnullなら、返り値はnullです。
構文

    MINUTE ( 式 )

例
「flights」表から、「departure_time」が6:00より6:30AMの間である全ての行を選択する。

    SELECT * FROM flights WHERE HOUR(departure_time) = 6 and MINUTE(departure_time) < 31;

MOD関数
MODは、一つ目の引数を二つ目の引数で割った剰余(法)を返します。
構文

    mod(整数型, 整数型)

関数の結果は、

• |  | 両方の引数がSMALLINTなら、SMALLIINT。
• |  | 片方の引数がINTEGERで、もう片方がINTEGERあるいはSMALLINTなら、INTEGER。
• |  | 片方の引数がBIGINTで、もう片方がBIGINTあるいはINTEGERあるいはSMALLINTなら、BIGINT。

返り値はNULLをとることがあり、もし何れかの引数がNULLなら、返り値はNULLです。
MONTH関数
MONTH関数は値から月の部分を返します。
引数は、日付、タイムスタンプ、CLOB・LONG VARCHAR・XML以外の日付・タイムスタンプを表す有効な文字列でなければなりません。 関数の返り値は1から12の間の整数です。もし引数がnullをとることがあれば、返り値もnullとなることがあり、引数がnullなら、返り値はnullです。
構文

    MONTH ( 式 )

例
EMPLOYEEという表から誕生日(BIRTHDATE)が12月の人の行を選択する。

    SELECT * FROM EMPLOYEE
    WHERE MONTH(BIRTHDATE) = 12

NULLIF式
Derbyでは、条件式にはNULLIF式を使います。
NULLIF式の構文

    NULLIF ( L, R )

NULLIF式はCASE式によく似ています。 例えば、

    NULLIF(V1,V2)

は、 次のCASE式と同等です。

    CASE WHEN V1=V2 THEN NULL ELSE V1 END

PI 関数
PI関数はpiに最も近い値を返します。
定数のpiは、円周の直径に対する比です。
返り値のデータ型は倍精度浮動小数点数です。
構文

    PI (  )

RADIANS 関数
RADIANS関数は引数を度からラジアンに変換します。
引数は度で計った角度です。関数によりラジアンで計った角度の近似値に変換されます。 引数のデータ型は倍精度浮動小数点数です。
Attention: 度から変換されたラジアンは近似値です。
返り値のデータ型は倍精度浮動小数点数です。
構文

    RADIANS ( 数 )

RTRIM関数
RTRIMは文字式の末尾にある空白を取り除きます。
構文

    RTRIM(文字式)

A 文字式はCHAR、VARCHAR、LONG VARCHARおよび、文字列に暗黙に変換可能な組込みのデータ型です。
もし文字式がnullなら、RTRIMの結果はnullです。

    -- ' asdf'が返ります。
    VALUES RTRIM(' asdf  ')
    -- 'asdf'が返ります。
    VALUES RTRIM('asdf  ')

SECOND関数
SECOND関数は引数の秒の部分を返します。
引数は時刻、タイムスタンプ、CLOB・LONG VARCHAR・XML以外の時刻やタイムスタンプを表す有効な文字列でなければなりません。関数の結果は0から59の整数です。引数がnullをとることがある場合、返り値がnullになることがあり、引数がnullなら返り値は0です。
構文

    SECOND ( 式 )

例
RECEIVEDというタイムスタンプの列に、内部的に2005-12-25-17.12.30.000000という値があるとします。 タイムスタンプの秒の部分だけを返すには、次のように書きます。

    SECOND(RECEIVED)

この場合、30という値が返ります。
SESSION_USER関数
SESSION_USERは、現在のユーザの認証識別子あるいは名前を返します。 現在のユーザがない場合は、APPを返します。
USER、CURRENT_USER、 SESSION_USER は互いに別名です。
構文

    SESSION_USER

    VALUES SESSION_USER

SIN 関数
SIN関数は引数の正弦を返します。
引数は正弦を求める角度をラジアンであらわしたものです。 引数は倍精度浮動小数点数でなければなりません。

• |  | もし引数がNULLなら、関数の返り値はNULLです。
• |  | もし引数が零(0)なら、関数の返り値は0です。

返り値のデータ型は倍精度浮動小数点数です。
構文

    SIN ( 数 )

SMALLINT関数
SMALLINT関数は数や小さな整数の書式に沿った文字列を表す、小さな整数を返します。
構文

    SMALLINT ( 数式 | 文字式 )

数式
組込みの数値型を返す式です。 もし引数が数式であれば、この関数の返り値は引数が、小さな整数の列や変数に代入されたときに変換されるのと同じ値となります。 もし値が小さな整数の範囲に収まらない場合、エラーとなります。 また引数が持つ小数部は切り捨てられます。
文字式
文字定数の最大長を超えない文字列を返す式です。 先頭と末尾の空白文字は取り除かれ、その残りはSQLの整数定数の書式に沿わなければなりません。 さらにその値は小さな整数の範囲の中に収まっていなければなりません。 文字列は長い文字列であってはなりません。 もし引数が文字式であるなら、この関数の返り値は引数が、小さな整数の列や変数に代入されたときに変換されるのと同じ値となります。
関数の結果は小さな整数となります。もし引数がnullをとることがある場合、返り値はnullをとることがあります。引数がnullなら返り値はnullです。
例
32767.99という数を、小さな整数にするには、このような節を書きます。

    VALUES SMALLINT (32767.99)

結果は32767です。
1という数を、小さな整数にするには、このような節を書きます。

    VALUES SMALLINT (1)

結果は1です。
SQRT関数
浮動小数点数の平方根を返します。適用可能な組込みの型は、実数、単精度浮動小数点数、倍精度浮動小数点数に限られます。 SQRTが返す値のデータ型は、引数のデータ型と同じです。
Note: 他のデータ型についてSQRTを実行するには、浮動小数点数に変換する必要があります。
構文

    SQRT(浮動小数点数式)

    -- 負数の行があった場合、例外が発生します。
    VALUES SQRT(3421E+09)

    -- INTEGERの数を浮動小数点数に変換した後、平方根を求めます。
    SELECT SQRT(myDoubleColumn) FROM MyTable

    VALUES SQRT (CAST(25 AS FLOAT));

SUBSTR関数
SUBSTR関数は文字列式あるいはビット列式に作用します。 結果のデータ型はそれぞれ、前者の場合はVARCHARで、後者の場合はVARCHAR FOR BIT DATAです。 結果の最大長は元の引数の型の最大長です。
構文

    SUBSTR({ 文字式 },
       開始位置 [, 列の長さ ] )

引数の開始位置と省略可能な列の長さはどちらも整数式です。 先頭の文字あるいはビットの開始位置は1です。 もし0が与えられた場合、Derbyは1が与えられたものとみなします。
文字式のデータ型はCHAR、VARCHAR、LONG VARCHAR、あるいは(ビット式ではない)文字列に暗黙のうちに変換可能な組み込み型の何れかです。
文字式では開始位置および列の長さというパラメータは文字をさします。ビット式については、開始位置および列の長さというパラメータはビットをさします。
もし開始位置が正であれば、その数は基となる式の先頭から数えた位置を指します。(先頭の文字は1と数えます。)開始位置は負とすることができません。
もし列の長さが指定されなかった場合、SUBSTRは式の開始位置から末尾までの部分列を返します。もし列の長さが指定された場合、SUBSTRは開始位置から始まる列の長さの、VARCHARあるいはVARBITを返します。 もし列の長さに負の数が与えられた場合、SUBSTR関数はエラーを返します。
例
helloという単語の二つ目の文字から最後までの部分列を返すには、次のような節を書きます。

    VALUES SUBSTR('hello', 2)

結果は'ello'となります。
helloという単語の最初の文字から二つ目の文字までの部分列を返すには、次のような節を書きます。

    VALUES SUBSTR('hello',1,2)

結果は'he'となります。
SUM関数
SUM は行の集合に渡って合計値を計算する集約関数です。(集約 (集合関数)を参照してください。) SUMは数値型の式に対してのみ、適用することができます。
構文

    SUM ( [ DISTINCT | ALL ] 式 )

DISTINCTおよびALLにより、重複を取り除いたり、留めたりできます。もしALLもDISTINCTもかかれなかった場合、ALLが指定されたものとみなします。例えば、列に1、1、1、1、2という値があるとして、SUM(col)はSUM(DISTINCT col)より大きな値を返します。
選択式には、DISTINCTを唯一つ置くことができます。例えば次の問合せは不可です。

    SELECT AVG (DISTINCT flying_time), SUM (DISTINCT miles)
    FROM Flights

式には複数の列への参照や式を置くことができますが、他の集約や副問合せを置くことはできません。また評価した結果は組込みの数値型でなければなりません。もし式がNULLと評価された場合、集約はその値を無視します。
関数の結果の型は、関数が作用している式の型と同じです。(オーバーフローする可能性もあります。)

    -- 全てのエコノミーシートを数えます。
    SELECT SUM (economy_seats) FROM Airlines;

    -- SUMを複数の列への参照に使います。
    -- (購入された式の合計を計算します。)
    SELECT SUM (economy_seats_taken + business_seats_taken + firstclass_seats_taken)
    as seats_taken FROM FLIGHTAVAILABILITY;

TAN 関数
TAN関数は引数から計算した正接を返します。
引数は正接を求める角度で、その単位はラジアンです。 引数のデータ型は、倍精度浮動小数点数でなければなりません。

• |  | 引数がNULLのとき、返り値はNULLです。
• |  | 引数が零(0)のとき、返り値は零です。

返り値のデータ型は倍精度浮動小数点数です。
構文

    TAN ( 数 )

TIME 関数
TIME関数は値の時刻の部分を返します。
引数は時刻、タイムスタンプ、CLOB・LONG VARCHAR・XML以外の時刻やタイムスタンプを表す有効な文字列である必要があります。 この関数の結果は時刻です。引数にnullをとることがある場合、返り値もnullをとることがあります。 引数がnullなら、返り値はnullです。
引数のデータ型に応じて、以下の規則があります。

• |  | 引数が時刻なら、返り値はその時刻です。
• |  | 引数がタイムスタンプなら、返り値はタイムスタンプの時刻の部分です。
• |  | もし引数が文字列なら、返り値は文字列が表す時刻です。

構文

    TIME ( 式 )

    values time(current_timestamp)

もし現在時刻が午後5:03なら、返り値は17:03:00です。
TIMESTAMP関数
TIMESTAMP関数はタイムスタンプを、値あるいは値の対から返します。
引数にとることができる値は、二つ目の引数があるかどうかで決まります。

• |  | もし引数が一つである場合は、引数は、タイムスタンプか、CLOB・LONG VARCHAR・XML以外のタイムスタンプを有効に表す14文字の文字列である必要があります。14文字の文字列は、有効な日付および時刻を10進数でyyyyxxddhhmmssという書式で表す必要があります。ここで、yyyyは年、xxは月、ddは日、hhは時、mmは分、ssは秒です。
• |  | もし両方の引数が指定された場合は、最初の引数は日付あるいは日付を有効に表す文字列で、二つ目の引数は時刻あるいは時刻を有効に表す文字列です。

二つ目の引数があるか否かで次の規則が決まります。

• |  | もし両方の引数が指定された場合、結果は最初の引数で指定された日付と、二つ目の引数で指定された時刻のタイムスタンプです。なお、タイムスタンプのマイクロ秒の部分は0となります。
• |  | もし引数が一つで、それがタイムスタンプであった場合、結果はそのタイムスタンプです。
• |  | もし引数が一つで、それが文字列であった場合、結果はその文字列で与えられたタイムスタンプです。14文字の文字列により指定されないマイクロ秒の部分は0となります。

Syntax

    TIMESTAMP ( 式 [, 式 ] )

例
records_tableという表の二つ目の列には(1998-12-25のような)日付が格納されて、三つ目の列には(17:12:30のような)時刻が格納されます。 例示する文でタイムスタンプを返すことができます。

    SELECT TIMESTAMP(col2, col3) FROM records_table

次の節は1998-12-25-17:12:30.0を返します。

    VALUES TIMESTAMP('1998-12-25', '17.12.30');
    1
    --------------------------
    1998-12-25 17:12:30.0

TRIM 関数
TRIMは文字式を引数にとる関数で、引数から前あるいは/および後の詰められた文字を取り除いた値を返します。省略可能な引数に文字を指定できて、この文字は取り除かれる、前あるいは後、あるいはその両方にある詰められた文字です。
構文x

    TRIM( [ trimOperands ] trimSource)

    trimOperands  ::= { trimType [ trimCharacter ]  FROM | trimCharacter FROM }
    trimType      ::= { LEADING | TRAILING | BOTH }
    trimCharacter ::= 文字式
    trimSource    ::= 文字式

trimTypeが指定されなかった場合、既定でBOTHとみなされます。trimCharacterが指定されなかった場合、既定で空白文字(' ')とみなされます。trimCharacterの値は以下のいずれかに評価されなければなりません。

• |  | 長さ一文字の文字列あるいは
• |  | NULL

trimCharacterとtrimSourceがNULLと評価される場合、TRIM関数の結果はNULlです。さもなければTRIM関数の結果は以下のいずれかになります。

• |  | trimTypeがLEADINGなら、結果はtrimSourceの値の前からtrimCharを取り除いた値です。
• |  | trimTypeがTRAILINGなら、結果はtrimSourceの値の後ろからtrimCharを取り除いた値です。
• |  | trimTypeがBOTHなら、結果はtrimSourceの値の前*と*後からtrimCharを取り除いた値です。

trimSourceのデータ型がCHARあるいはVARCHARなら、TRIM関数の返り値の型はVARCHARです。それ以外の場合、TRIM関数の返り値の型はCLOBです。
例

    -- 'derby'を返します。(空白はありません。)
    VALUES TRIM('  derby ')

    -- 'derby'を返します。 (空白はありません。)
    VALUES TRIM(BOTH ' ' FROM '  derby ')

    -- 'derby 'を返します。 (末尾に空白があります。)
    VALUES TRIM(LEADING ' ' FROM '  derby ')

    -- '  derby'を返します。 (先頭に二つ空白があります。)
    VALUES TRIM(TRAILING ' ' FROM '  derby ')

    -- NULLを返します。
    VALUES TRIM(cast (null as char(1)) FROM '  derby ')

    -- NULLを返します。
    VALUES TRIM(' ' FROM cast(null as varchar(30)))

    -- ' derb'を返します。(先頭に空白がありあｍす。)
    VALUES TRIM('y' FROM ' derby')

    -- trimCharacterには一文字しか指定できないのでエラーとなります。
    VALUES TRIM('by' FROM ' derby')

UCASE関数およびUPPER関数
UCASEおよびUPPERは文字式を引数にとり、全てのアルファベットの文字を大文字にして返します。
構文

    UCASEまたはUPPER ( 文字式 )

もし引数の型がCHARであれば、返り値の型はCHARです。それ以外の場合は、返り値の型はVARCHARです。
Note: UPPERとLOWERは、データベースのロケールによる影響を受けます。ロケールの設定についての、詳細はterritory=ll_CC 属性を参照してください。
返り値の長さと最大長は、引数の長さと最大長と同じです。
例
次の節により、
aSD1#wという文字列を大文字にして返す事ができます。

    VALUES UPPER('aSD1#w')

返り値はASD1#Wです。
USER関数
USERは現在のユーザの認証識別子を返します。もし現在のユーザがなければ、APPを返します。
USER、CURRENT_USER、SESSION_USERは別名です。
構文

    USER

    VALUES USER

VARCHAR関数
VARCHAR関数は文字列を表す、可変長文字列を返します。
文字列を可変長文字列に変換する構文

    VARCHAR (文字列式 )

文字列式
式の値は最大で32,672バイトの文字列でなければなりません。
日時を可変長文字列に変換する構文

    VARCHAR (日時式 )

日時式
式の値は、日付、時刻、タイムスタンプの何れかの型でなければなりません。
EMPLOYEE表より、"Dolores Quintana"の仕事の説明(CHAR(8)のJOB)を、可変長文字列の値として選択する。

    SELECT VARCHAR(JOB)
    FROM EMPLOYEE
    WHERE LASTNAME = 'QUINTANA'

XMLEXISTS 演算子
XMLEXISTSは、SQLにてXMLを問い合わせるときに利用できるSQL/XML演算子です。
XMLEXISTS演算子は二つの引数を取ります。XML問合せ式とDerbyXML値です。
構文

    XMLEXISTS ( xquery文字列リテラル
        PASSING BY REF XML値式 [ BY REF ] )

xquery文字列リテラル
文字列のリテラルとして与えられる必要があります。もし引数がパラメータであったり、リテラルでない式であったり、文字列でない(整数のような)リテラルであった場合、Derbyはエラーを挙げます。 xquery文字列リテラルはApache XalanがサポートしているXPath式でなければなりません。Derbyは、XML問合せ式を評価するとき常にApache Xalanを使います。XalanはXQueryを完全にサポートしないので、Derbyもその制約を受けます。 もしXalanが引数に与えられた問合せをコンパイルして実行できなかった場合、Xalanが挙げた例外をDerbyは補足してSQLExceptionとして投げなおします。 XPathおよびXQuery式の詳細については、次のウェブサイトを参照してください。http://www.w3.org/TR/xpathおよび、http://www.w3.org/TR/xquery/
XML値式
XMLのデータ値かつ整形式のSQL/XML文書でなければなりません。 XML値式はパラメータであってはなりません。 Derbyは暗黙の構文解析やXML値の型変換を行いません。従って、文字列やその他のデータタイプを使うとエラーが発生します。 もし引数がDerby XMLQUERY演算子によって返された並びであった場合、 その並びが、一つの文書ノードであるノードの並びであった場合にのみ、その引数は許されます。 そうではなければ、Derbyはエラーを挙げます。
BY REF
省略可能なこのキーワードにて、Derbyにて利用可能な引数渡しの方法が記述されます。 BY REFは既定の引数渡しの方法なので、XMLEXISTS演算子はこのキーワードの有無にかかわらず同様に振舞います。引数渡しの方法の詳細については、SQL/XML仕様を参照してください。
演算子の結果と他の演算子との組み合わせ
XMLEXISTS演算子の結果は、xquery文字列リテラルをXML値式に対して評価した結果に基づく、SQL真偽値です。 XMLEXISTS演算子が返す値は、
UNKNOWN
XML値式がnullであった場合です。
TRUE
問合せの式をxmlの値に対して評価して、空ではないノードや値の並びが返った場合です。
FALSE
問合せの式をxmlの値に対して評価して、空の並びが返った場合です。
XMLEXISTS演算子は問合せが評価された結果を直接に返しません。問合せが評価された結果を直接に得たい場合、XMLQUERY演算子を使う必要があります。
XMLEXISTS演算子の結果はSQLの真偽値なので、真偽型の関数を置くことができる場所なら何処でもXMLEXISTS演算子を使うことができます。たとえば、XMLEXISTS演算子を表定義のチェック制約に使うことや、WHERE節の述部に置くこともできます。
例
x_table表にて、各行のxcolというXMLの列に、age属性が20のstudentという要素があるかを知るには次のように書きます。

    SELECT id, XMLEXISTS('//student[@age=20]' PASSING BY REF xcol)
        FROM x_table

x_table表から、xcolというXMLの列がnullでなく、その列の値に/roster/studentという要素を持つ、各行のIDを返すにはこの文を書きます。

    SELECT id FROM x_table WHERE XMLEXISTS('/roster/student' PASSING BY REF xcol)

x_tableという表にて、xcolというXMLの列に挿入できるXMLの値を制限することもできます。この例では、age属性が25より小さいstudent要素を、少なくとも一つ持たなければならない、という制約を設けます。 表を作るにはこのように書きます。

    CREATE TABLE x_table ( id INT, xcol XML CHECK (XMLEXISTS ('//student[@age < 25]' PASSING BY REF xcol)) )

使い方の覚書
DerbyにてXMLの機能を使う場合、Apache XercesのようなJAXP parserとApache XalanがJavaのクラスパスに記述されている必要があります。 JAXP parserあるいはXalanがクラスパスに記述されていなかった場合、XMLEXISTS演算子を利用するとエラーになります。
XMLPARSE演算子
XMLPARSEは、文字列式を構文解析してDerbyXML値にするSQL/XML演算子です。
この演算子の結果を一時的な値として使うこともできますし、DerbyのXML列に値を格納することもできます。 一時的か永続的かにかかわらず、XMLの値をXMLEXISTSやXMLQUERYのような、他のDerbyXML演算子の入力とすることができます。
構文

    XMLPARSE (DOCUMENT 文字列値式 PRESERVE WHITESPACE)

DOCUMENT
この省略できないキーワードにより、Derbyが構文解析できるXMLの入力のタイプが記述されます。 Derbyが構文解析可能な文字列式は、整形式のXML文書を構成するものに限られます。 これは、DerbyがJAXP構文解析器を使って文字列を構文解析しているからです。 JAXP構文解析器は、文字列値式が整形式のXML文書を構成することを期待します。 もし文字列が整形式のXML文書を構成しない場合、JAXPはエラーを挙げます。 Derbyはそのエラーを補足して、SQLExceptionとしてエラーを挙げなおします。
文字列値式
CHAR、VARCHAR、LONGVARCHAR、CLOB等の、SQLの文字型と評価されるあらゆる式を置くことができます。文字列値式の引数はパラメータであってもかまいません。パラメータに型をあたえるために、CAST関数を使う必要があります。Derbyは、XML文書として構文解析する前に、パラメータが正しい型であるかを検証する必要があります。 もしパラメータがCAST関数なしで指定されたり、CAST関数で文字のデータ型以外の型が与えられた場合、Derbyはエラーを挙げます。
PRESERVE WHITESPACE
省略できないこのキーワードは、Derbyが連続したXMLの節の間にある空白文字をどのように扱うかを記述します。 PRESERVE WHITESPACEキーワードが指定されると、空白文字をそのままとするSQL/XMLの規則にそって、Derbyは空白文字をそのままにします。
整形式のXML文書については、次の仕様を参照してください。http://www.w3.org/TR/REC-xml/#sec-well-formed .
制約事項: SQL/XMLの標準に拠れば、XMLPARSE演算子の引数はバイナリの列でも可能です。しかし、DerbyでXMLPARSE演算子の引数にとることができるのは文字列のみです。
例
次の文で、x_table表のxcolXML列に単純なXML文書を挿入すします。:

    INSERT INTO x_table VALUES
        (1,
        XMLPARSE(DOCUMENT '
            <roster>
              <student age="18">AB</student>
              <student age="23">BC</student>
              <student>NOAGE</student>
            </roster>'
          PRESERVE WHITESPACE)
        )

JDBCにより、x_table表のxcolXML列に、大きなXML文書を挿入するには、次の文を書きます。

    INSERT INTO x_table VALUES
        (2,
        XMLPARSE (DOCUMENT CAST (? AS CLOB) PRESERVE WHITESPACE)
        )

この文には、setCharacterStream()メソッドや、型変換した対照型に可能なJDBCの他のsetXXXメソッドを使って、値を与える必要があります。
利用上の覚書
DerbyのXML機能が動作するためには、Apache XercesのようなJAXP構文解析器およびApache XalanがJavaのクラスパスに記述されている必要があります。もしどちらかが欠けていると、XMLPARSE演算子を使おうとしたときエラーが発生します。
XMLQUERY演算子
XMLQUERYはSQLにてXMLの値を問い合わせることができるSQL/XML演算子です。
XMLQUERY演算子には二つの引数があります。片方はXML問合せ式で、もう一つはDerbyXML値です。
構文

    XMLQUERY ( xquery文字列リテラル
        PASSING BY REF xml値式
        [ RETURNING SEQUENCE [ BY REF ] ]
        EMPTY ON EMPTY
        )

xquery文字列リテラル
文字列のリテラルが指定されなければなりません。もし引数にパラメータが与えられたり、リテラルではない式が与えられたり、文字列ではない(整数のような)リテラルが与えられた場合、Derbyはエラーを挙げます。 引数のxquery文字列リテラルは、Apache XalanがサポートするXPath式でなければなりません。DerbyはどのようなXML問合せ式を評価するでもApache Xalanを利用します。XalanはXQueryを完全にサポートしないので、Derbyも同様に完全にサポートしません。 もしXalanが問合せのコンパイルや実行を行えなかった場合、DerbyはXalanが挙げたエラーを補足して、SQLExceptionとして挙げなおします。 XPathおよびXQuery式の詳細については、次のWebサイトを参照してください。http://www.w3.org/TR/xpathとhttp://www.w3.org/TR/xquery/
xml値式
これはXMLの値でなければならず、また整形式のSQL/XML文書でなければなりません。 xml値式はパラメータであってはなりません。 Derbyは暗黙の構文解析や、XML値への変換を行わないので、文字列やその他のデータ型を使うとエラーとなります。 もし引数がDerbyのXMLQUERY演算子により返る並びであった場合、もしその並びが一つの文書ノードであるノードからなる並びであれば、引数にとる事ができます。そうではなければ、Derbyはエラーを挙げます。
BY REF
この省略可能なキーワードにより、Derbyにて可能な引数渡しの仕組みが記述されます。BY REFは規定の引数渡しの仕組みなので、このキーワードのあるなしにかかわらず、XMLQUERY演算子は同様に振舞います。引数渡しの仕組みについてのより詳細な情報は、SQL/XML仕様を参照してください。
RETURNING SEQUENCE
省略可能なこのキーワードにより、DerbyのXMLQUERY演算子にて唯一返すことのできるXMLの種類を記述します。SEQUENCEは既定の返却値の種類なので、このキーワードのあるなしにかかわらず、XMLQUERY演算子は同様に振舞います。他のXML返却値の種類についてのより詳細な情報は、SQL/XML仕様を参照してください。
EMPTY ON EMPTY
省略できないこのキーワードにより、XMLQUERY演算子の結果が空の並びであった時の振る舞いが記述されます。XMLQUERY演算子は空の並びをそのまま返します。XMLQUERY演算子はnull値に変換しません。空の並びは直列化されると空文字列になります。Derbyは、空の並びを整形式のXML文書としません。
XMLQUERY演算子の結果は、XML型の値です。 結果はXMLノードや値の並びを表します。文字列のような値は、結果の並びの一部となることができます。XMLQUERY演算子の結果は整形式のXML文書であることが保障されず、XML列にXMLQUERY演算子の結果を挿入できないことがあります。 XML列に結果を記録するためには、その結果は唯一つの項目を持つ並びで、その項目が整形式の文書ノードでなければなりません。 結果はXMLSERIALIZE 演算子によって直列化することによってのみ見られるようにできます。
例
x_table表にて、xcolというXML列を検索して、age属性が20より大きいstudents要素を返すには次の文を書きます。

    SELECT ID,
        XMLSERIALIZE(
            XMLQUERY('//student[@age>20]' PASSING BY REF xcol EMPTY ON EMPTY)
        AS VARCHAR(50))
    FROM x_table

この問合せでは、XMLQUERY演算子が実際に結果を返すか否かにかかわらず、結果にはx_tableの全行毎に結果行があります。
x_table表にてxcolというXML列を検索して、BCという名前の生徒の年齢を返すには、次の文を書きます。

    SELECT ID,
        XMLSERIALIZE(
            XMLQUERY('string(//student[text() = "BC"]/@age)' PASSING BY REF xcol EMPTY ON EMPTY)
        AS VARCHAR(50))
    FROM x_table
    WHERE
        XMLEXISTS('//student[text() = "BC"]' PASSING BY REF xcol)

この問合せでは結果には、x_table中のBCという名前の生徒の行のみあります。
利用上の覚書
DerbyはXMLの機能を動作させるために、Apache XercesのようなJAXP構文解析器とApache XalanがJavaのクラスパスに記述されている必要があります。JAXP構文解析器、Xalanの何れかがクラスパスに記述されていない場合に、XMLQUERY演算子を利用しようとするとエラーが発生します。
XMLSERIALIZE 演算子
XMLSERIALIZEはXML型の情報を文字型の情報に変換するSQL/XML演算子です。これはDerby XML値を変換する唯一の方法です。
重要: 直列化はSQL/XMLの直列化規則に沿います。 DerbyはXMLSERIALIZEの構文の一部しかサポートしないこともあいまって、XMLSERIALIZE演算子の結果が元のXMLと全く同じであることは保障されせん。 例えば、[xString]が整形式のXML文書を表す文字表現であるとして、次の文が発行されたとします。

    INSERT INTO x_table (id, xcol)
        VALUES (3, XMLPARSE(DOCUMENT '[xString]' PRESERVE WHITESPACE));

    SELECT id, XMLSERIALIZE(xcol AS VARCHAR(100))
        FROM x_table WHERE id = 3;

このときXMLSERIALIZE演算子の結果が、元の[xString]の値と同じである保障はありません。 XMLSERIALIZEの処理にてSQL/XMLの仕様に沿って何らかの変更が起きる可能性があります。 XMLSERIALIZEの結果が元の文字表現と同じであることもありますが、同じであることは保障されません。
問合せの最上位の結果セットにXMLSERIALIZE演算子が書かれた場合、XMLSERIALIZEにて文字情報型引数で指定した型に適用できるJDBCの全てのgetXXXメソッドによって結果を得ることができます。XMLSERIALIZE演算子を使わずにXMLの値を最上位の結果セットで取得しようとすると、Derbyはエラーを挙げます。 DerbyはXML値を暗黙裡に直列化しません。
構文

    XMLSERIALIZE ( xml値式 AS 文字情報型 )

xml値式
あらゆるDerby XML値を取ることができます。XMLQUERYによる結果のXMLの結果の並びでもかまいません。xml値式にパラメータを指定することはできません。
文字情報型
CHAR、VARCHAR、LONG VARCHARあるいはCLOB等の、SQLの文字列型を指定しなければなりません。 有効な文字列型が指定されなかった場合、Derbyはエラーを挙げます。
例
x_table表にて、xcolXML列の値を表示するには、次の文を書きます。

    SELECT ID,
        XMLSERIALIZE(
        xcol AS CLOB)
    FROM x_table

JDBCを使ってこの結果を取り出すためには、JDBCのgetCharacterStream()やgetString()メソッドを使うことができます。
XMLQUERY演算子の結果を表示するには、次の文を書きます。

    SELECT ID,
        XMLSERIALIZE(
            XMLQUERY('//student[@age>20]'
               PASSING BY REF xcol EMPTY ON EMPTY)
        AS VARCHAR(50))
    FROM x_table

利用上の覚書
DerbyにてXML機能が動作するには、Apache XercesのようなJAXP構文解析器とApache XalanがJavaのクラスパスに記述されている必要があります。クラスパスに記述がなかった場合、XMLSERIALIZEを使ったときにエラーが発生します。
YEAR関数
YEAR関数は値の年の部分を返します。引数は、日付、タイムスタンプ、および日付やタイムスタンプを表す有効な文字列でなければなりません。 関数の返り値は1から9999までの間の整数です。 引数がnullをとる事がある場合、返り値はnullとなることがあります。 もし引数がnullなら、返り値はnullです。
構文

    YEAR ( 式 )

Example
PROJECT表にあるプロジェクトから、開始日(PRSTDATE)と完了日(PRENDATE)が暦の上で同年であるものを選択します。

    SELECT * FROM PROJECT
    WHERE YEAR(PRSTDATE) = YEAR(PRENDATE)

組込みシステム関数
この節では様々なDerbyの組込みシステム関数を説明します。
SYSCS_UTIL.SYSCS_CHECK_TABLEシステム関数
SYSCS_UTIL.SYSCS_CHECK_TABLE関数は引数に指定した表を検証して、その全ての索引と整合が取れていることを確かめます。もし表と索引が整合していれば、メソッドはSMALLINTの1を返します。 もし表と索引が不整合であれば、関数は例外を挙げます。
構文

    SMALLINT SYSCS_UTIL.SYSCS_CHECK_TABLE(IN SCHEMANAME VARCHAR(128),
    IN TABLENAME VARCHAR(128))

SCHEMANAMEもしくはTABLENAMEがnullである場合、エラーが発生します。
例

    VALUES SYSCS_UTIL.SYSCS_CHECK_TABLE('SALES', 'ORDERS');

SYSCS_UTIL.SYSCS_GET_DATABASE_PROPERTYシステム関数
SYSCS_UTIL.SYSCS_GET_DATABASE_PROPERTY関数は、接続中のデータベースのKEYで指定された属性を取得します。
構文

    VARCHAR(32762) SYSCS_UTIL.SYSCS_GET_DATABASE_PROPERTY(IN KEY VARCHAR(128))

KEYがnullである場合、エラーが返ります。
例

    VALUES SYSCS_UTIL.SYSCS_GET_DATABASE_PROPERTY('key_value_string');

SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS システム関数
SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS関数は、java.sql.ResultSetに対する問合せの実行計画および処理時間の統計を表す、VARCHAR(32762)の値を返します。 問合せの実行計画は実行ノードからなる木構造の情報です。 このノードには幾つかの種類があります。 統計はそれぞれのノードが実行されるたびに合計されてゆきます。統計される値には、特定の処理にかかった時間の合計、ノードの子から渡された行数、そのノードから親に返された行数等あります。(実際に何が集計されるのかは、それぞれのノードの種類により決まります。) SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICSが最も有意義に機能するのは、SELECT、INSERT、UPDATE等のDML文に対してです。
構文

    VARCHAR(32762) SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS()

例

    VALUES SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS()

SYSCS_UTIL.SYSCS_GET_USER_ACCESS システム関数
SYSCS_UTIL.SYSCS_GET_USER_ACCESS関数は、指定したユーザの接続におけるアクセス権限を返します。
ユーザーの権限が明示的に指定されない場合、既定の接続モードがユーザーのアクセス権限となります。既定の接続モードはderby.database.defaultConnectionMode属性により設定されます。より詳細な情報については、Derbyのチューニングの「Derbyの属性」を参照してください。
構文

    SYSCS_UTIL.SYSCS_GET_USER_ACCESS (USERNAME VARCHAR(128)) RETURNS VARCHAR(128)

USERNAME
DerbyデータベースのユーザーIDを指定する、VARCHAR(128)型の入力引数です。
この関数が返す値は、fullAccess、readOnlyAccess、noAccessのいずれかです。
noAccessという返り値はユーザによる接続の試みが拒絶されることを表します。これは、derby.database.fullAccessUsersプロパティあるいはderby.database.readOnlyAccessUsersプロパティいずれにもユーザが設定されておらず、derby.database.defaultConnectionModeがnoAccessである状況でおきる事です。
接続権限の名前はDerbyにて使われている名前です。
例

    VALUES SYSCS_UTIL.SYSCS_GET_USER_ACCESS ('BRUNNER')

組み込みシステム手続き
幾つかの組み込みシステム手続きは、他の関係性データベースで使われているSQLの構文とは互換性がありません。これらの手続きはDerbyでのみ使えます。
SYSCS_UTIL.SYSCS_BACKUP_DATABASEシステム手続き
SYSCS_UTIL.SYSCS_BACKUP_DATABASEシステム手続きにより、指定したバックアップディレクトリにデータベースをバックアップします。
構文

    SYSCS_UTIL.SYSCS_BACKUP_DATABASE(IN BACKUPDIR VARCHAR())

この手続きは結果を返しません。
BACKUPDIR
この引数の型はVARCHAR(32672)です。この引数によりバックアップが記録されるパスを指定します。相対パスを与えた場合、データベースをバックアップするJVMのuser.dirで与えられる現在のユーザのディレクトリに基づいて解決されます。従って相対パスの解決はderbyのホームディレクトリには基づきません。 混乱を避けるため、絶対パスを使ってください。
JDBCの例
次の例では、データベースをc:/backupdirディレクトリにバックアップします。

    CallableStatement cs = conn.prepareCall
    ("CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE(?)");
    cs.setString(1, "c:/backupdir");
    cs.execute();
    cs.close();

SQLの例
次の例では、データベースをc:/backupdirディレクトリにバックアップします。

    CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE('c:/backupdir');

SYSCS_UTIL.SYSCS_BACKUP_DATABASE_NOWAIT システム手続き
SYSCS_UTIL.SYSCS_BACKUP_DATABASE_NOWAITシステム手続きにより、データベースを指定したバックアップディレクトリに、データベースをバックアップします。
もしバックアップを開始する時にログのとられてない処理中のトランザクションがあった場合、SYSCS_UTIL.SYSCS_BACKUP_DATABASE_NOWAITシステム手続きは、トランザクションの終了を待たず直ぐエラーを返します。
構文

    SYSCS_UTIL.SYSCS_BACKUP_DATABASE_NOWAIT(IN BACKUPDIR VARCHAR())

この手続きは結果を返しません。
BACKUPDIR
この引数の型はVARCHAR(32672)です。この引数によりバックアップを記録するディレクトリへのパスを指定します。相対パスが指定された場合、バックアップの処理を行うJVMのuser.dirに基づき解決されます。従って相対パスを解決するとき元になるのは、derbyのホームディレクトリではありません。混乱を避けるために、絶対パスを指定してください。
JDBCの例
次の例ではデータベースをc:/backupdirディレクトリにバックアップします。

    CallableStatement cs = conn.prepareCall
    ("CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE_NOWAIT(?)");
    cs.setString(1, "c:/backupdir");
    cs.execute();
    cs.close();

SQLの例
次の例ではデータベースをc:/backupdirディレクトリにバックアップします。

    CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE_NOWAIT('c:/backupdir');

SYSCS_UTIL.SYSCS_BACKUP_DATABASE_AND_ENABLE_LOG_ARCHIVE_MODEシステム手続き
SYSCS_UTIL.SYSCS_BACKUP_DATABASE_AND_ENABLE_LOG_ARCHIVE_MODEシステム手続きはバックアップディレクトリにデータベースをバックアップして、データベースをログアーカイブモードで有効にします。
構文

    SYSCS_UTIL.SYSCS_BACKUP_DATABASE_AND_ENABLE_LOG_ARCHIVE_MODE
    (IN BACKUPDIR VARCHAR(32672), IN SMALLINT DELETE_ARCHIVED_LOG_FILES)

この手続きは結果を返しません。
BACKUPDIR
この引数の型はVARCHAR(32672)です。この引数はバックアップが記録されるディレクトリへのパスを取ります。 相対パスはバックアップを行うJVMのuser.dirで与えられる、現在のユーザディレクトリに基づき解決されます。従って相対パスの解決はderbyのホームディレクトリに基づきません。混乱を避けるために絶対パスを使ってください。
DELETE_ARCHIVED_LOG_FILES
もし引数のDELETE_ARCHIVED_LOG_FILESが零以外の値であった場合、バックアップ前に作成されたオンラインアーカイブログファイルは削除されます。このログファイルの削除が行われるのは、バックアップが成功した後です。
JDBCの例
次の例ではデータベースはc:/backupdirディレクトリにバックアップされます。

    CallableStatement cs = conn.prepareCall
    ("CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE_AND_ENABLE_LOG_ARCHIVE_MODE(?, ?)");
    cs.setString(1, "c:/backupdir");
    cs.setInt(2, 0);
    cs.execute();

SQLの例
次の例ではデータベースはc:/backupdirディレクトリにバックアップされ、ログアーカイブモードが有効となります。またこの時オンラインアーカイブログは削除されません。

    SYSCS_UTIL.SYSCS_BACKUP_DATABASE_AND_ENABLE_LOG_ARCHIVE_MODE('c:/backupdir', 0)

次の例ではデータベースをc:/backupdirディレクトリにバックアップして、もしバックアップが成功したら、オンラインアーカイブログを削除します。

    SYSCS_UTIL.SYSCS_BACKUP_DATABASE_AND_ENABLE_LOG_ARCHIVE_MODE('c:/backupdir', 1)

SYSCS_UTIL.SYSCS_BACKUP_DATABASE_AND_ENABLE_LOG_ARCHIVE_MODE_NOWAITシステム手続き
SYSCS_UTIL.SYSCS_BACKUP_DATABASE_AND_ENABLE_LOG_ARCHIVE_MODE_NOWAITシステム手続きはデータベースを指定したバックアップディレクトリにバックアップして、そのデータベースをログアーカイブモードで有効にします。 この手続きが開始した時、ログに格納されていない進行中のトランザクションがあった場合、トランザクションの完了を待たずに手続きはエラーとなります。
構文

    SYSCS_UTIL.SYSCS_BACKUP_DATABASE_AND_ENABLE_LOG_ARCHIVE_MODE_NOWAIT
    (IN BACKUPDIR VARCHAR(32672),
    IN SMALLINT DELETE_ARCHIVED_LOG_FILES)

この手続きは結果を返しません。
BACKUPDIR
この引数の型はVARCHAR(32672)です。この引数はバックアップが記録されるディレクトリへのパスをとります。 バックアップを行うJVMのuser.dirで与えられる現在のユーザディレクトリに基づき、相対パスは解決されます。相対パスの解決は、derbyのホームディレクトリに基づきません。 混乱を避けるため、絶対パスを使ってください。
DELETE_ARCHIVED_LOG_FILES
もし引数のDELETE_ARCHIVED_LOG_FILESが、零以外の値だった場合、バックアップ前に作られたオンラインアーカイブログのファイルは削除されます。ログファイルが削除されるのはバックアップが成功した後です。
JDBCの例
次の例ではデータベースをc:/backupdirディレクトリにバックアップして、ログアーカイブモードを有効にします。

    CallableStatement cs = conn.prepareCall
    ("CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE_AND_ENABLE_LOG_ARCHIVE_MODE_NOWAIT(?, ?)");
    cs.setString(1, "c:/backupdir");
    cs.setInt(2, 0);
    cs.execute();

SQLの例
次の例では、データベースをc:/backupdirディレクトリにバックアップして、ログアーカイブモードを有効にします。この時オンラインアーカイブログのファイルは削除されません。

    SYSCS_UTIL.SYSCS_BACKUP_DATABASE_AND_ENABLE_LOG_ARCHIVE_MODE_NOWAIT('c:/backupdir', 0)

次の例では、データベースをc:/backupdirディレクトリにバックアップして、バックアップが成功したら、オンラインアーカイブログのファイルを削除します。

    SYSCS_UTIL.SYSCS_BACKUP_DATABASE_AND_ENABLE_LOG_ARCHIVE_MODE_NOWAIT('c:/backupdir', 1)

SYSCS_UTIL.SYSCS_EMPTY_STATEMENT_CACHE システム手続き
システム手続きのSYSCS_UTIL.SYSCS_EMPTY_STATEMENT_CACHEはシステム診断の便利な道具です。
構文

    SYSCS_UTIL.SYSCS_EMPTY_STATEMENT_CACHE()

例

    CALL SYSCS_UTIL.SYSCS_EMPTY_STATEMENT_CACHE()

SYSCS_UTIL.SYSCS_CHECKPOINT_DATABASEシステム手続き
SYSCS_UTIL.SYSCS_CHECKPOINT_DATABASEシステム手続きにより、キャッシュされた情報を全てディスクに書き出して、チェックポイントを処理します。
構文

    SYSCS_UTIL.SYSCS_CHECKPOINT_DATABASE()

この手続きでは結果は返りません。
JDBCの例

    CallableStatement cs = conn.prepareCall
    ("CALL SYSCS_UTIL.SYSCS_CHECKPOINT_DATABASE()");
    cs.execute();
    cs.close();

SQLの例

    CALL SYSCS_UTIL.SYSCS_CHECKPOINT_DATABASE();

SYSCS_UTIL.SYSCS_COMPRESS_TABLEシステム手続き
SYSCS_UTIL.SYSCS_COMPRESS_TABLEシステム手続きを使って、表や索引に割り当てられている未使用の領域を再利用することができます。 典型的な状況では、割り当てられた未使用の領域は表から大容量の情報が削除された場合や、索引が更新された場合に存在します。既定では、Derbyは未使用の領域を基本ソフト(OS)に返却しません。例えばページが表や索引に一度割り当てられると、その表や索引が破棄されるまでは、領域はOSに自動的に返却されません。 SYSCS_UTIL.SYSCS_COMPRESS_TABLEにより利用されていない領域を基本ソフト(OS)に返却できます。
SYSCS_UTIL.SYSCS_COMPRESS_TABLEシステム手続きは索引の再構築処理の一環として、全ての索引の統計情報を更新します。
構文

    SYSCS_UTIL.SYSCS_COMPRESS_TABLE (IN SCHEMANAME VARCHAR(128),
    IN TABLENAME VARCHAR(128), IN SEQUENTIAL SMALLINT)

SCHEMANAME
このVARCHAR(128)の型の引数により、表の存在するスキーマを指定します。空を渡すとエラーとなります。
TABLENAME
このVARCHAR(128)の型の引数により、表の表名を指定します。値は大文字小文字も含めて、一致しなければならず、引数に"Fred"と渡すと、SQLレベルでデリミトされた識別子の'Fred'として渡されます。 空の値を渡すとエラーとなります。
SEQUENTIAL
零以外のSMALLINT型の引数を渡すと、シーケンシャルモードで処理を行わせることになり、0を引数に渡すと、シーケンシャルモードでは処理を行わせないこととなります。空の値を渡すとエラーとなります。
SQL の例
SEQUENTIALを指定して、USスキーマにあるCUSTOMERという表を圧縮します。

    call SYSCS_UTIL.SYSCS_COMPRESS_TABLE('US', 'CUSTOMER', 1)

Java の例
SEQUENTIALを指定して、USスキーマにあるCUSTOMERという表を圧縮します。

    CallableStatement cs = conn.prepareCall
    ("CALL SYSCS_UTIL.SYSCS_COMPRESS_TABLE(?, ?, ?)");
    cs.setString(1, "US");
    cs.setString(2, "CUSTOMER");
    cs.setShort(3, (short) 1);
    cs.execute();

SEQUENTIALの値を特定しない場合、Derbyは、表にある全ての索引への処理を並列して処理します。 SEQUENTIALの値を特定しないと、この手続きは多量にメモリを必要として、ディスクの多量の一時領域を使うこととなります。(そのおおよその量は、使われている領域と割り当てられた使われていない領域の2倍ほどです。) これは表を圧縮するときに、Derbyが、 (既存の領域を並べ替えたり切り捨てたりするのではなく、)生きてる行を新規に割り当てた領域に写すからです。余分な領域はCOMMITのとき、基本ソフト(OS)に返されます。
SEQUENTIALの値が特定された場合、Derbyは、まず表を圧縮してから個々の索引を順に圧縮します。SEQUENTIALを利用すると、必要なメモリやディスク領域を少なくすることができますが、処理時間はより長くなります。メモリやディスク領域の利用を減らすなら、SEQUENTIALの引数を指定してください。
SYSCS_UTIL.SYSCS_COMPRESS_TABLEは、COMMITが発行されるまでは、ディスクの容量を基本ソフト(OS)に返しません。 つまり表やその索引が占めていた領域は解放されないということです。COMMIT前に基本ソフトに返却されるのは、ソートのために一時的に確保されていたディスク領域だけです。
ヒント: オートコミットモードでは、SYSCS_UTIL.SYSCS_COMPRESS_TABLEシステム手続きの発行をお勧めします。
Note: この手続きでは、圧縮する表への排他的な表ロックを取得する必要があります。また、表やその索引に依存するすべての文の実行計画は無効となります。利用されていない領域を特定する方法については、Derby サーバと管理ガイドを参照してください。
SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLEシステム手続き
SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLEシステム手続きを使って、表や索引に割り当てられた未使用の領域を回収することができます。 未利用の割り当てられた領域が存在する典型的な状況は、表から大規模な情報が情報が削除された後、それで空いた領域を使う情報が挿入されていない場合です。 既定ではDerbyは未使用の領域を基本ソフト(OS)に返却しません。例えば表や索引に割り当てられたページは、表や索引が破棄されるまでは基本ソフト(OS)に返却されません。 SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLEにより使われていない領域を基本ソフト(OS)に返却することができます。
このシステム手続きにより、三種類の圧縮をSQL表の記録された領域にて行います。 その三種類とはPURGE_ROWS、DEFRAGMENT_ROWSそれと TRUNCATE_ENDです。またSYSCS_UTIL.SYSCS_COMPRESS_TABLE()とは異なり、既存の表および索引が記録された領域だけを使って全処理が行われます。
構文

    SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE(
    		IN SCHEMANAME VARCHAR(128),
    		IN TABLENAME VARCHAR(128),
    		IN PURGE_ROWS SMALLINT,
    		IN DEFRAGMENT_ROWS SMALLINT,
    		IN TRUNCATE_END SMALLINT )

SCHEMANAME
この引数はVARCHAR(128)型の値をとり、表のあるスキーマを指定します。空の値を渡すとエラーとなります。
TABLENAME
この引数はVARCHAR(128)型の値をとり、表の表名を指定します。文字列と表名は、大文字小文字も一致していなければならず、"Fred"と引数にとれば、SQLのレベルでデリミトされた識別子の'Fred'となります。 空の値を渡すとエラーとなります。
PURGE_ROWS
PURGE_ROWSが0以外の値であった場合、表全体が一度走査されて、表から削除とコミットが完了した行が取り除かれます。こうして空いた領域は、以降の行の挿入にて利用できますが、表に割り当てられたままとなります。 このオプションをとる場合は表の全ページが走査されるので、パフォーマンスは表のサイズに正比例します。
DEFRAGMENT_ROWS
DEFRAGMENT_ROWSが0以外の値であった場合、表にある行を後方から前方に移動する、断片化解消の走査が一度行われます。 この断片化解消の走査は、表の末尾にあるページを空にしようとします。こうしてできた空のページは、続いてTRUNCATE_ENDを指定して基本ソフト(OS)に返却可能となります。 TRUNCATE_ENDを指定する時は、DEFRAGMENT_ROWSを指定する事をお勧めします。 DEFRAGMENT_ROWSが指定されると、表の全体が走査され、移動した表の全行について索引が更新されます。従って実行時間は表のサイズに正比例します。
TRUNCATE_END
TRUNCATE_ENDが0以外の値であった場合、表の末尾にある隣接したページを基本ソフト(OS)に返却しようとします。PURGE_ROWSとDEFRAGMENT_ROWSの両方あるいは片方を同時に指定することで、処理の対象となるページ数を増やす事ができます。この処理自身は表の走査は行われません。
SQLの例
USというスキーマにあるCUSTOMERという表を圧縮するために、全ての圧縮処理を指定します。

    call SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE('US', 'CUSTOMER', 1, 1, 1);

同じ表の末尾にある空き領域を返すなら、全ての処理を指定するより次のように呼び出す方が、処理が短時間で済みます。しかし返却される領域は少なくなるでしょう。

    call SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE('US', 'CUSTOMER', 0, 0, 1);

Javaの例
USというスキーマにあるCUSTOMERという表を圧縮するために、全ての圧縮処理を指定します。

    CallableStatement cs = conn.prepareCall
    ("CALL SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE(?, ?, ?, ?, ?)");
    cs.setString(1, "US");
    cs.setString(2, "CUSTOMER");
    cs.setShort(3, (short) 1);
    cs.setShort(4, (short) 1);
    cs.setShort(5, (short) 1);
    cs.execute();

同じ表の末尾にある空き領域を返すなら、全ての処理を指定するより次のように呼び出す方が、処理が短時間で済みます。しかし返却される領域は少なくなるでしょう。

    CallableStatement cs = conn.prepareCall
    ("CALL SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE(?, ?, ?, ?, ?)");
    cs.setString(1, "US");
    cs.setString(2, "CUSTOMER");
    cs.setShort(3, (short) 0);
    cs.setShort(4, (short) 0);
    cs.setShort(5, (short) 1);
    cs.execute();

ヒント: SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE手続きは、自動コミットモードで実行する事をお勧めします。
Note: この手続きは圧縮する表に排他表ロックを必要とします。表やその索引へのあらゆる文の計画は無効となります。利用されていない領域を識別する方法については、Derby サーバと管理ガイドを参照してください。
SYSCS_UTIL.SYSCS_DISABLE_LOG_ARCHIVE_MODEシステム手続き
SYSCS_UTIL.SYSCS_DISABLE_LOG_ARCHIVE_MODEシステム手続きにより、ログアーカイブモードは無効になります。このとき引数のDELETE_ARCHIVED_LOG_FILESに零以外の値を与えていれば、オンラインアーカイブログは削除されます。
構文

    SYSCS_UTIL.SYSCS_DISABLE_LOG_ARCHIVE_MODE(IN SMALLINT DELETE_ARCHIVED_LOG_FILES)

この手続きからは結果は返りません。
DELETE_ARCHIVED_LOG_FILES
もしDELETE_ARCHIVED_LOG_FILESへの引数の値が零でなければ、存在するアーカイブログは削除されます。 もし引数の値が零なら、存在するアーカイブログは削除されません。
JDBCの例
以下の例ではデータベースのログアーカイブは無効となり、存在するログアーカイブのファイルは削除されます。

    CallableStatement cs = conn.prepareCall
    ("CALL SYSCS_UTIL.SYSCS_DISABLE_LOG_ARCHIVE_MODE(?)");
    cs.setInt(1, 1);
    cs.execute();
    cs.close();

SQLの例
以下の例ではデータベースのログアーカイブモードは無効となります。存在するログアーカイブのファイルはそのまま残ります。

    CALL SYSCS_UTIL.SYSCS_DISABLE_LOG_ARCHIVE_MODE DELETE_ARCHIVED_LOG_FILES(0);

以下の例ではデータベースのログアーカイブモードは無効となり、存在するログアーカイブのファイルは削除されます。

    CALL SYSCS_UTIL.SYSCS_DISABLE_LOG_ARCHIVE_MODE DELETE_ARCHIVED_LOG_FILES(1);

SYSCS_UTIL.SYSCS_EXPORT_TABLE システム手続き
SYSCS_UTIL.SYSCS_EXPORT_TABLEシステム手続きにより、基本ソフト(OS)のファイルへ、表にある全ての情報をエクスポートすることができます。
SYSCS_UTIL.SYSCS_EXPORT_TABLEシステム手続きは、デリミトされたデータファイルの書式で、表から基本ソフト(OS)のファイルへエクスポートを行います。
セキュリティ的な配慮と意図せぬファイルの破壊を避けるため、このエクスポートの手続きは情報を既存ファイルへエクスポートしません。エクスポートの手続きでは新規のファイル名を指定する必要があります。この手続きを実行すると、作成した新規ファイルへ情報がエクスポートされます。
デリミトされたファイル書式により情報はエクスポートされます。
構文

    SYSCS_UTIL.SYSCS_EXPORT_TABLE (IN SCHEMANAME  VARCHAR(128),
    IN TABLENAME VARCHAR(128), IN FILENAME VARCHAR(32672),
    IN COLUMNDELIMITER CHAR(1), IN CHARACTERDELIMITER CHAR(1),
    IN CODESET VARCHAR(128))

このシステム手続きは結果を返しません。
SCHEMANAME
An input argument of type VARCHAR(128) that specifies the schema name of the table. Passing a NULL value will use the default schema name.
TABLENAME
この引数の型はVARCHAR(128)で、この引数により情報をエクスポートする表やビューの名前を指定します。空の値を渡すとエラーになります。
FILENAME
情報をエクスポートする新規ファイルの名称を指定します。パスが省略された場合、現在のディレクトリが使われます。もし既存ファイルの名前が指定された場合、エクスポートの手続きはエラーを返します。ネットワークサーバを使っている場合、サーバ上のファイル位置を指定する必要があります。NULL値を指定するとエラーとなります。FILENAMEパラメータはVARCHAR (32672)型の値を入力にとる引数です。
COLUMNDELIMITER
この引数の型はCHAR(1)で、列のデリミタを指定します。指定された文字はコンマの代わりに列の終わりを表すために用いられます。空の値を渡した場合は既定の値が使われ、既定値はコンマ(,)です。
CHARACTERDELIMITER
この引数の型はCHAR(1)で、文字のデリミタを指定します。指定された文字は二重引用符の代わりに文字列を囲うために用いられます。 空の値を渡すと既定値が用いられ、既定値は二重引用符(")です。
CODESET
この引数の型はVARCHAR(128)で、エクスポートされるファイルにおける情報のコードセットを指定します。コードセットの名前はJavaのサポートする文字エンコーディングの内の一つでなければなりません。情報はファイルに書き出す前に、データベースのコードセットから指定されたコードセットに変換されます。 空の値を渡した場合、情報は実行中のJVMと同じコードセットで出力されます。
もしスキーマや表の名前をデリミトされない識別子で作成した場合、エクスポートを行う手続きに渡す名前は全て大文字としなければなりません。もしスキーマや表、列名をデリミトされた識別子で作成した場合、エクスポートを行う手続きに渡す名前の大文字小文字は、作成したときと同じでなければなりません。
使い方
この手続きの使い方のより詳細な情報は、Derby ツールとユーティリティーガイドの「バルクインポートとエクスポートの手続きを使う」の章を参照してください。
例
次の例ではSAMPLEデータベースにあるSTAFF表からmyfile.delというファイルへエクスポートを行う方法を示します。

    CALL SYSCS_UTIL.SYSCS_EXPORT_TABLE (null, 'STAFF', 'myfile.del', null, null, null);

SYSCS_UTIL.SYSCS_EXPORT_TABLE_LOBS_TO_EXTFILE システム手続き
SYSCS_UTIL.SYSCS_EXPORT_TABLE_LOBS_TO_EXTFILEシステム手続きをつかって、表の全情報をエクスポートできます。このときLOBの情報は別ファイルにエクスポートして書かれます。LOBが書かれた場所への参照は、主となるエクスポートファイルのLOB列にあります。
セキュリティへの配慮や意図しないファイルの破壊を避ける理由で、この手続きは既存のファイルへのエクスポートは行いません。手続きのファイル名には存在しないファイル名を指定する必要があります。手続きを実行するとファイルが作成され、そのファイルへ情報がエクスポートされます。
情報はデリミトされたファイル書式によりエクスポートされます。
構文

    SYSCS_UTIL.SYSCS_EXPORT_TABLE_LOBS_TO_EXTFILE (
        IN SCHEMANAME VARCHAR(128),
        IN TABLENAME VARCHAR(128),
        IN FILENAME VARCHAR(32672),
        IN COLUMNDELIMITER CHAR(1),
        IN CHARACTERDELIMITER CHAR(1),
        IN CODESET VARCHAR(128)
        IN LOBSFILENAME VARCHAR(32672)
        )

この手続きを実行すると、列の情報は主となるエクスポートファイルにデリミトされたデータファイルの書式で書かれます。
SCHEMANAME
表のスキーマを指定します。既定のスキーマ名を利用するため、NULLを指定することもできます。SCHEMANAMEパラメータには、VARCHAR (128)データ型の引数を入力として与えます。
TABLENAME
情報をエクスポートする表やビューの名前を指定します。この表はシステム表や一時表であってはなりません。文字列は表名と大文字小文字が一致していなければなりません。TABLENAMEパラメータには、VARCHAR (128)型の引数を入力に与えます。
FILENAME
情報がエクスポートされる新規ファイルの名前を指定します。もしパスが省略されている場合、現在のディレクトリが使われます。もし既存ファイルの名前が指定された場合、エクスポート手続きはエラーを返します。 ネットワークサーバを利用している場合、指定するファイルの位置はサーバサイドでの位置です。NULLの値を指定するとエラーとなります。FILENAMEパラメータには、VARCHAR (32672)データ型の引数を入力に与えます。
COLUMNDELIMITER
列のデリミタを指定します。指定された文字は列の終了を表すために、コンマに代わって使われます。既定値のコンマを使う場合、NULLを指定することができます。 COLUMNDELIMITERパラメータはCHAR (1)データ型でなければなりません。
CHARACTERDELIMITER
文字のデリミタを指定します。指定された文字は文字列を囲うために、二重引用符に代わって使われます。既定値の二重引用符を使う場合、NULLを指定することができます。 CHARACTERDELIMITERパラメータには、CHAR (1)データ型の引数を入力に与えます。
CODESET
エクスポートファイルの情報のコードセットを指定します。コードセットの名前はJavaにて利用可能な文字エンコードでなければなりません。ファイルに情報が書き出される前に、データベースのコードページから指定されたコードページへの情報の変換がおこなわれます。プログラムを実行しているJVMのコードページで情報を書き出す場合、NULLを指定することができます。CODESETパラメータには、VARCHAR (128)データ型の引数を入力に与えます。
LOBSFILENAME
ラージオブジェクトの情報が書き出されるファイルを指定します。もしパスが省略された場合、LOBファイルは主となるエクスポートファイルと同じディレクトリに作成されます。もし既存ファイルの名前が指定された場合、エクスポートユーティリティはファイルの内容を上書きします。情報がファイルに追加されることはありません。 ネットワークサーバを利用する場合、ファイルはサーバサイドでの位置である必要があります。 NULLを引数に与えるとエラーとなります。 LOBSFILENAMEパラメータは、VARCHAR (32672)データ型の引数を入力に与えます。
スキーマ、表、列名がデリミトされない識別子で作成されていた場合、エクスポートの手続きに渡す名前は全文字が大文字からなっている必要があります。 スキーマ、表、列名がデリミトされた識別子で作成されていた場合、エクスポートの手続きに渡す名前は作成した時の名前と大文字小文字が一致していなければなりません。
使い方
この手続きの使い方について追加の情報が、Derby ツールとユーティリティーガイドの「バルクインポートとエクスポートの手続きを使う」にあります。
表の全情報をLOBの情報を別ファイルに分けてエクスポートする例
以下の例にて、サンプルデータベースにあるSTAFF表から、staff.delという主ファイルとpictures.datというLOBエクスポートファイルに、情報をエクスポートする方法を示します。

    CALL SYSCS_UTIL.SYSCS_EXPORT_TABLE_LOBS_TO_EXTFILE(
        'APP', 'STAFF', 'c:＼data＼staff.del', ',' ,'"',
        'UTF-8', 'c:＼data＼pictures.dat');

SYSCS_UTIL.SYSCS_EXPORT_QUERYシステム手続き
The SYSCS_UTIL.SYSCS_EXPORT_QUERY system procedure exports the results of a SELECT statement to an operating system file.
セキュリティ的な配慮と予期せぬファイルの破損を避けるため、このエクスポートを行う手続きでは既存ファイルへ情報はエキスポートされません。まだ存在しないファイルのファイル名のみ、エクスポートで指定できます。手続きを実行するとファイルが作成されて、そのファイルへ情報がエクスポートされます。
情報はデリミトされたファイル書式によりエクスポートされます。
構文

    SYSCS_UTIL.SYSCS_EXPORT_QUERY(IN SELECTSTATEMENT VARCHAR(32672),
    IN FILENAME VARCHAR(32672), IN COLUMNDELIMITER CHAR(1),
    IN CHARACTERDELIMITER CHAR(1), IN CODESET VARCHAR(128))

この手続きは結果を返しません。
SELECTSTATEMENT
この引数の型はVARCHAR(32672)です。この引数にはエクスポートする情報を返す選択文(問合せ)を渡します。引数に空の値を渡すとエラーとなります。
FILENAME
情報をエキスポートする新規ファイルを指定します。パスが省略された場合、現在のディレクトリが使われます。もし既存ファイルの名前が指定された場合、エクスポートの手続きはエラーを返します。ネットワークサーバを利用している場合、指定するファイルの位置はサーバ上の位置です。NULL値を指定するとエラーとなります。 FILENAMEパラメータはVARCHAR (32672)型の値を入力にとる引数です。
COLUMNDELIMITER
この引数の型はCHAR(1)で、列のデリミタを指定します。与えた文字はコンマの代わりに列の終わりを表します。空の値が渡された場合は既定値が使われ、既定値はコンマ(,)です。
CHARACTERDELIMITER
この引数の型はCHAR(1)で、文字のデリミタを指定します。与えた文字は二重引用符の代わりに文字列の囲いを表します。空の値が渡された場合は既定値が使われ、既定値は二重引用符(")です。
CODESET
この引数の型はVARCHAR(128)で、エクスポートされるファイルの情報のコードセットを表します。 コードセットの名前はJavaがサポートするエンコーディングの何れかでなければなりません。 情報はファイルに書き出される前に、データベースのコードセットから指定されたコードセットに変換されます。 空の値を渡すと実行中のJVMと同じコードセットで情報は書き出されます。
使い方
この手続きの利用に関する更なる情報については、Derby ツールとユーティリティーガイドの「バルクインポートとエクスポートの手続きを使う」という章を参照してください。
例
次の例ではSAMPLEデータベースにあるSTAFF表から、myfile.delというファイルにエクスポートを行う方法を示します。

    CALL SYSCS_UTIL.SYSCS_EXPORT_QUERY('select * from staff where dept =20',
    'c:/output/awards.del', null, null, null);

SYSCS_UTIL.SYSCS_EXPORT_QUERY_LOBS_TO_EXTFILE システム手続き
SYSCS_UTIL.SYSCS_EXPORT_QUERY_LOBS_TO_EXTFILE手続きを使って、主エクスポートファイルと、別になったLOBの情報のエクスポートファイルに、SELECT文の結果をエクスポートすることができます。
セキュリティ的な配慮と意図せぬファイルの破壊を避けるため、このエクスポートの手続きでは既存ファイルへの情報のエクスポートは行いません。このエクスポートの手続きには存在しないファイルを指定する必要があります。この手続きを実行するとファイルが新規で作成されて、そのファイルへ情報がエクスポートされます。
情報のエクスポートはデリミトファイル書式により行われます。
構文

    SYSCS_UTIL.SYSCS_EXPORT_QUERY_LOBS_TO_EXTFILE (
        IN SELECTSTATEMENT VARCHAR(32672),
        IN FILENAME VARCHAR(32672),
        IN COLUMNDELIMITER CHAR(1),
        IN CHARACTERDELIMITER CHAR(1),
        IN CODESET VARCHAR(128)
        IN LOBSFILENAME VARCHAR(32672)
        )

この手続きを実行すると、主エクスポートファイルに、情報がデリミトされたファイル書式で列の情報が書き出されます。
SELECTSTATEMENT
エクスポートする情報を返す問い合わせを記述します。 NULL値を指定するとエラーになります。SELECTSTATEMENTパラメータはVARCHAR (32672)型の値を入力にとる引数です。
FILENAME
情報をエクスポートする新規ファイルの名称を指定します。パスが省略された場合、現在のディレクトリが用いられます。既存ファイルの名前が指定された場合、エクスポートの手続きからエラーが返ります。ネットワークサーバを利用している場合、サーバ上のファイル位置を指定します。NULL値を取るとエラーになります。FILENAMEパラメータはVARCHAR (32672)型の値を入力にとる引数です。
COLUMNDELIMITER
列のデリミタを指定します。指定した文字は列の終わりを表すコンマの代わりに使われます。 NULL値を指定して既定のコンマを使うこともできます。COLUMNDELIMITERパラメータはCHAR (1)データ型の値を入力にとる引数です。
CHARACTERDELIMITER
文字のデリミタを指定します。指定した文字は文字列を囲う二重引用符の代わりに使われます。 NULL値を指定して既定の二重引用符を使うこともできます。CHARACTERDELIMITERパラメータはCHAR (1)データ型の値を入力にとる引数です。
CODESET
エクスポートファイルに書かれる情報のコードセットを指定します。コードセットの名称はJavaで利用可能なキャラクタエンコーディングセットのものである必要があります。情報はファイルに出力される前に、データベースのコードページから指定したコードページに変換されます。 NULL値を指定して実行中のJVMと同じコードページを指定することもできます。CODESETパラメータはVARCHAR (128)型の値を入力にとる引数です。
LOBSFILENAME
large objectの情報がエクスポートされるファイルを指定します。パスが省略された場合、lobのファイルは主エクスポートファイルと同じディレクトリに作成されます。もし既存のファイルと同じ名前を指定した場合、エクスポートユーティリティはファイルの内容を上書きします。ファイルに情報を追記する振る舞いはしません。 ネットワークサーバを利用している場合、サーバ上のファイル位置を指定します。 NULL値を指定するとエラーとなります。LOBSFILENAMEパラメータはVARCHAR (32672)型の値を入力にとる引数です。
使い方
この手続きの使い方に関する追加の情報は、Derby ツールとユーティリティーガイドの「バルクインポートとエクスポートの手続きを使う」という章を参照してください。
LOBの情報を別エクスポートファイルにして、問い合わせた情報をエクスポートする例
サンプルデータベースにあるSTAFF表から、20の部署の従業員の情報を、主ファイルをstaff.del、lobの情報をpictures.datにエクスポートする方法を、次の例で示します。

    CALL SYSCS_UTIL.SYSCS_EXPORT_QUERY_LOBS_TO_EXTFILE(
        'SELECT * FROM STAFF WHERE dept=20',
        'c:＼data＼staff.del', ',' ,'"',
        'UTF-8','c:＼data＼pictures.dat');

SYSCS_UTIL.SYSCS_IMPORT_DATAシステム手続き
SYSCS_UTIL.SYSCS_IMPORT_DATAシステム手続きは、表にある一部の列に情報をインポートします。これらの一部の列は、情報を挿入する時に指定します。 またこの手続きにて、列の番号を指定して、ファイルから一部の列をインポートできます。
構文

    SYSCS_UTIL.SYSCS_IMPORT_DATA (IN SCHEMANAME VARCHAR(128),
    IN TABLENAME VARCHAR(128), IN INSERTCOLUMNS VARCHAR(32672),
    IN COLUMNINDEXES VARCHAR(32672), IN FILENAME VARCHAR(32672),
    IN COLUMNDELIMITER CHAR(1), IN CHARACTERDELIMITER CHAR(1),
    IN CODESET VARCHAR(128), IN REPLACE SMALLINT)

この手続きは結果を返しません。
SCHEMANAME
この引数の型はVARCHAR(128)で、値により表のあるスキーマを指定します。空の値を渡すと、既定のスキーマ名が用いられます。
TABLENAME
この引数の型はVARCHAR (128)で、値により情報のインポート先となる表の表名を指定します。この表にはシステム表や一時表を指定することはできません。空の値を渡すと、エラーとなります。
INSERTCOLUMNS
この引数の型はVARCHAR (32762)で、表にある列から情報のインポート先となる列の名称を(コンマで区切られた)値で指定します。
COLUMNINDEXES
この引数の型はVARCHAR (32762)で、インポートする入力情報フィールドの(1からはじまり、コンマで区切られる)番号を指定します。空の値を渡すと入力ファイルの全入力情報フィールドが用いられます。
FILENAME
この引数の型はVARCHAR(32672)で、インポートする情報のあるファイルを指定します。 もしパスが指定されない場合、現在の作業ディレクトリが用いられます。空の値を渡すとエラーとなります。
COLUMNDELIMITER
この引数の型はCHAR(1)で、列のデリミタを指定します。指定した文字はコンマの代わりに列の終わりを表すために用いられます。空の値を渡すと既定値が用いられます。既定値はコンマ(,)です。
CHARACTERDELIMITER
この引数の型はCHAR(1)で、文字のデリミタを指定します。指定した文字は二重引用符の代わりに文字列を囲います。空の値を渡すと既定値が用いられます。既定値は二重引用符(")です。
CODESET
この引数の型はVARCHAR(128)で、入力ファイルにある情報のコードセットを指定します。コードセットの名前はJavaのサポートする文字エンコーディングのうちの一つでなければなりません。　 情報は個々で指定したコードセットからデータベースのコードセット(utf-8)に変換されます。空の値を渡すとデータベースは処理中のJVMと同じコードセットで解釈されます。
REPLACE
この引数の型はSMALLINTです。値が零でなければREPLACEモードとなり、零ならINSERTモードとなります。REPLACEモードでは、表は切り捨てられて存在する全情報が削除され、それからインポートする情報が挿入されます。 なお表の定義や索引の定義は変わりませ年。表が存在するときにのみ、REPLACEモードは可能です。INSERTモードでは、表にある既存の情報を変更せずに、インポートする情報が表に追加されます。空の値を渡すとエラーとなります。
スキーマ、表や列の名前がデリミトされない識別子で作成されていた場合、インポートの手続きに渡す名前は全て大文字でなければなりません。 スキーマ、表や列の名前がデリミトされた識別子で作成されていた場合、インポートの手続きに渡す名前の大文字小文字は、作成時に指定した値と同じでなければなりません。
使い方
この手続きの使い方に関しては、Derby ツールとユーティリティーガイドの「バルクインポートとエクスポートの手続きを使う」の章も読んでください。
例
次の例では、data.delというデリミトされたデータファイルにある一部のフィールドを、staff表にインポートします。

    CALL SYSCS_UTIL.SYSCS_IMPORT_DATA
    (NULL, 'STAFF', null, '1,3,4', 'data.del', null, null, null,0)

SYSCS_UTIL.SYSCS_IMPORT_DATA_LOBS_FROM_EXTFILE システム手続き
SYSCS_UTIL.SYSCS_IMPORT_DATA_LOBS_FROM_EXTFILEシステム手続きを使って表にある列にインポートすることができます。このときLOBのデータは別ファイルから分けてインポートされます。 主となるインポートファイルには、LOBの情報がある場所への参照と他の全データが置かれます。
構文

    SYSCS_UTIL.SYSCS_IMPORT_DATA_LOBS_FROM_EXTFILE (
       IN SCHEMANAME VARCHAR(128),
       IN TABLENAME VARCHAR(128),
       IN INSERTCOLUMNS VARCHAR(32672),
       IN COLUMNINDEXES VARCHAR(32672),
       IN FILENAME VARCHAR(32672),
       IN COLUMNDELIMITER CHAR(1),
       IN CHARACTERDELIMITER CHAR(1),
       IN CODESET VARCHAR(128),
       IN REPLACE SMALLINT)
       )

インポートユーティリティはLOBの情報がある場所への参照を主となるインポートファイルから探します。
SCHEMANAME
表のスキーマを指定します。既定のスキーマ名を利用するために、NULLの値を指定することができます。 SCHEMANAMEパラメータは、VARCHAR (128)型の引数を入力にとります。
TABLENAME
情報がインポートされる表の名前を指定します。 表はシステム表や一時表であってはなりません。 文字列は表名と大文字小文字が一致していなければなりません。NULL値を指定するとエラーとなります。 TABLENAMEパラメータは、VARCHAR (128)型の引数を入力にとります。
INSERTCOLUMNS
情報がインポートされる表の列の名前を、コンマで区切って指定します。 表の全列へインポートする場合、NULL値を指定することができます。 INSERTCOLUMNSパラメータは、VARCHAR (32672)型の引数を入力にとります。
COLUMNINDEXES
入力される情報のうち、インポートされる欄の列番号(1から数えます。)をコンマで区切って指定します。 ファイルの全欄を指定する場合、NULL値を指定することもできます。COLUMNINDEXESパラメータは、VARCHAR (32762)型の引数を入力にとります。
FILENAME
インポートする情報のあるファイルの名前を指定します。パスが省略された場合、現在の作業ディレクトリが使われます。ネットワークサーバで利用する場合、ファイルの位置はサーバサイドの位置を参照します。 NULLを指定するとエラーになります。 fileNameパラメータは、VARCHAR (32672)型の引数を入力にとります。
COLUMNDELIMITER
列のデリミタを指定します。指定された文字はコンマの代わりに列の終わりを表します。既定値のコンマを利用する場合、NULL値を指定できます。 COLUMNDELIMITERパラメータは、CHAR (1)型の引数を入力にとります。
CHARACTERDELIMITER
文字のデリミタを指定します。指定された文字は二重引用符の代わりに列の終わりを表します。既定値の二重引用符を利用する場合、NULL値を指定できます。 CHARACTERDELIMITERパラメータは、 CHAR (1)型の引数を入力にとります。
CODESET
入力ファイル中の情報のコードセットを指定します。コードセットの名前はJavaで利用可能な文字円コーディングでなければなりません。 情報は指定されたコードセットから、データベースのコードセット(UTF-8)へと変換されます。 実行するJVMと同じコードセットでデータファイルを解釈する場合、NULL値を指定することができます。 CODESETパラメータは、VARCHAR (128)データ型を入力にとります。
REPLACE
このパラメータに0以外の値を指定すると、インポートがREPLACEモードで行われます。一方で0を指定すると、インポートはINSERTモードで行われます。 REPLACEモードでは表にある既存の情報はすべて切り捨てられたのち、インポートした情報が挿入されます。 表の定義や索引の定義には変更がありません。表が既にある場合のみ、REPLACEモードで情報をインポートすることができます。INSERTモードでは既存の表の情報に変更を加えずに、インポートした情報を追加します。 パラメータにNULL値を指定するとエラーが発生します。 REPLACEパラメータは、SMALLINTデータ型を入力にとります。
デリミトされない識別子でスキーマ、表、列が作成された場合、インポートの手続きに渡す名前はすべて大文字でなければなりません。 デリミトされた識別子でスキーマ、表、列が作成された場合、インポートの手続きに渡す名前は作成された名前と大文字と小文字が一致しなければなりません。
使い方
この手続きは主となるインポートファイルに書かれた参照を使って、LOBの情報を読みます。 主となるインポートファイルに書かれたLOBへの参照は、lobsFileName.Offset.length/という書式に決まっています。

• |  | Offsetは外部ファイル中のバイト数で数えた位置です。
• |  | lengthはバイト数で数えたLOB列の情報の長さです。

この手続きの使い方については、Derby ツールとユーティリティーガイドの「バルクインポートとエクスポートの手続きを使う」の章も参照してください。
指定した列にデータをインポートする例。LOBデータは別ファイルからインポートされる。
以下の例では、STAFF表のいくつかの列に情報をインポートする方法を示します。 STAFF表にはサンプルデータベースのLOB列があります。 インポートファイルのstaff.delは、デリミトされたデータファイルです。staff.delファイルには、LOBデータの書かれた外部ファイルへの参照が書かれます。 入力ファイルの情報は、文字のデリミタが二重引用符(")、列のデリミタがコンマ(')という書式となっています。 インポートした情報はSTAFF表の既存の情報に追加されます。

    CALL SYSCS_UTIL.SYSCS_IMPORT_DATA_LOBS_FROM_EXTFILE
        (null, 'STAFF', 'NAME,DEPT,SALARY,PICTURE', '2,3,4,6',
    +    'c:＼data＼staff.del', ',','"','UTF-8',  0);

SYSCS_UTIL.SYSCS_IMPORT_TABLEシステム手続き
SYSCS_UTIL.SYSCS_IMPORT_TABLEシステム手続きは、入力ファイルから表の全ての列に情報をインポートします。 インポート先の表に既に情報がある場合、既存の情報を置き換えることも、新たに情報を追加することもできます。
構文

    SYSCS_UTIL.SYSCS_IMPORT_TABLE (IN SCHEMANAME VARCHAR(128),
    IN TABLENAME VARCHAR(128), IN FILENAME VARCHAR(32672),
    IN COLUMNDELIMITER CHAR(1), IN CHARACTERDELIMITER CHAR(1),
    IN CODESET VARCHAR(128), IN REPLACE SMALLINT)

この手続きは結果を返しません。
SCHEMANAME
この引数の型はVARCHAR(128)で、値には表のスキーマを指定します。空の値を与えた場合は既定のスキーマ名が用いられます。
TABLENAME
この引数の型はVARCHAR (128)で、値には情報をインポートする表の表名を指定します。 この表はシステム表や一時表であってはなりません。空の値を与えた場合はエラーとなります。
FILENAME
この引数の型はVARCHAR(32672)で、値にはインポートする情報の書かれたファイルを指定します。 パスを指定しなければ、現在の作業ディレクトリが使われます。空の値を与えた場合はエラーとなります。
COLUMNDELIMITER
この引数の型はCHAR(1)で、値には列のデリミタを指定します。 指定した文字はコンマの代わりに列の最後を表すために用いられます。 空の値を渡すと既定値が使われます。既定値はコンマ(,)です。
CHARACTERDELIMITER
この引数の型はCHAR(1)で、値には文字のデリミタを指定します。 指定した文字は二重引用符の代わりに文字を囲うために用いられます。 空の値を渡すと既定値が使われます。既定値は二重引用符(")です。
CODESET
この引数の型はVARCHAR(128)で、値には入力ファイルに書かれた情報のコードセットを指定します。コードセットの名称はJavaがサポートする文字エンコーディングのうちの一つでなければなりません。情報は指定したコードセットからデータベースのコードセット(utf-8)に変換されます。 空の値を渡すと、手続きを実行しているJVMと同じコードセットで、データファイルを読み取ります。
REPLACE
この引数の型はSMALLINTです。値が零でなければREPLACEモードで動作して、値が零であればINSERTモードで動作します。 REPLACEモードでは情報を切り捨てて、表にある全ての情報を削除してから、インポートする情報を挿入します。 なお表の定義や索引の定義は変わりません。INSERTモードでは表にある既存の情報はそのままにして、表にインポートする情報を追加します。空の値を渡すとエラーとなります。
スキーマ、表あるいは列の名称をデリミトされない識別子として作成した場合、インポートの手続きには、その名称を全て大文字で指定しなければなりません。 スキーマ、表あるいは列の名称をデリミトされた識別子として作成した場合、インポートの手続きには、大文字・小文字を作成したときと同じにして名称を指定しなければなりません。
使い方
この手続きの使い方については、Derby ツールとユーティリティーガイドにある「バルクインポートとエクスポートの手続き」の章も参照してください。
例
以下の例では、myfile.delというデリミトされたデータファイルからSTAFF表に情報をインポートします。このとき、文字列のデリミタとしてはパーセンテージ(%)を、列のデリミタとしてはセミコロン(;)を指定します。

    CALL SYSCS_UTIL.SYSCS_IMPORT_TABLE
    (null, 'STAFF', 'c:/output/myfile.del', ';', '%', null,0);

インポートの詳細についてはDerby ツールとユーティリティーガイドを参照してください。
SYSCS_UTIL.SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE システム手続き
SYSCS_UTIL.SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILEシステム手続きを使って情報を表にインポートできます。このときLOBの情報は別ファイルに置かれます。 主インポートファイルには、LOBの位置への参照とそれ以外の情報のすべてが置かれます。
構文

    SYSCS_UTIL.SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE (
       IN SCHEMANAME VARCHAR(128),
       IN TABLENAME VARCHAR(128),
       IN FILENAME VARCHAR(32672),
       IN COLUMNDELIMITER CHAR(1),
       IN CHARACTERDELIMITER CHAR(1),
       IN CODESET VARCHAR(128),
       IN REPLACE SMALLINT)
       )

インポートユーティリティは、LOBの情報が置かれた場所への参照を主インポートファイルから取得します。
SCHEMANAME
表のスキーマを指定します。既定のスキーマを指定する場合、NULLとすることができます。SCHEMANAMEパラメータはVARCHAR (128)型の入力値を取る引数です。
TABLENAME
情報がインポートされる表の名前を指定します。表はシステム表や一時表であってはなりません。文字列は表名と完全に一致していなければなりません。NULLを指定した場合エラーとなりあｍす。TABLENAMEパラメータはVARCHAR (128)型の入力値を取る引数です。
FILENAME
インポートする情報のあるファイルの名前を指定します。パスが省略されている場合、現在のディレクトリが使われます。ネットワークサーバを使っている場合、指定するファイルの位置はサーバ側の位置です。NULLを指定するとエラーとなります。FILENAMEパラメータは(32672)型の入力値を取る引数です。
COLUMNDELIMITER
列のデリミタを指定します。指定した文字はコンマの代わりに列の終わりを表します。既定値のコンマを指定するために、NULLとすることもできます。COLUMNDELIMITERパラメータはCHAR (1)型の入力値を取る引数です。
CHARACTERDELIMITER
文字のデリミタを指定します。指定された文字は二重引用符の代わりに文字列を囲うために用いられます。既定値の二重引用符を指定するために、NULLとすることもできます。CHARACTERDELIMITERパラメータはCHAR (1)型の入力値をとる引数です。
CODESET
入力ファイルの情報のコードセットを指定します。コードセットの名前はJavaにて利用可能な文字エンコーディングセットのうちのひとつである必要があります。情報は指定されたコードセットからデータベースのコードセット(UTF-8)に変換されます。実行中のJVMと同じコードセットを指定するために、NULLとすることもできます。CODESETパラメータはVARCHAR (128)型の入力値を取る引数です。
REPLACE
0以外の値が指定された場合、REPLACEモードでインポートが行われます。一方、0が指定された場合、INSERTモードでインポートが行われます。REPLACEモードでは表を切り捨てて全情報が削除されたのちに、情報がインポートされます。表の定義や索引の定義は変わりません。既存表へは、REPLACEモードでのみ情報をインポートできます。INSERTモードでは、既存の表の情報はそのままにして、インポートした情報が表へ追加されます。NULLを指定するとエラーとなります。REPLACEパラメータはSMALLINTデータ型の値を入力にとる引数です。
スキーマ、表、列名をデリミトされない識別子で作成した場合、名前の全文字を大文字にして、インポートの手続きに渡さなければなりません。スキーマ、表、列名をデリミトされた識別子で作成した場合、名前の全文字の大文字小文字を作成した時と同じにして、インポートの手続きに渡さなければなりません。
使い方
この手続きは主インポートファイルに記録された参照を使ってLOBの情報を読み出します。 Derby以外の情報源からインポートを行う場合、主インポートファイルに書かれたLOBへの参照の書式は、lobsFileName.Offset.length/として下さい。

• |  | Offsetは外部ファイルの中の位置をバイト数で表します。
• |  | lengthはLOB列の情報の大きさをバイト数で表します。

この手続きの使い方に関するこのほかの情報は、Derby ツールとユーティリティーガイドの「バルクインポートとエクスポートの手続きを使う」を参照してください。
LOBの情報の書かれた外部ファイルを参照する主インポートファイルから、情報をインポートする例
以下の例ではサンプルデータベースにあるSTAFFへ、staff.delというデリミトされたデータファイルから情報をインポートします。この例ではコンマが列のデリミタです。情報は表の既存の情報に追記されます。

    CALL SYSCS_UTIL.SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE(
        'APP','STAFF','c:\data\staff.del',',','"','UTF-8',0);

SYSCS_UTIL.SYSCS_FREEZE_DATABASEシステム手続き
SYSCS_UTIL.SYSCS_FREEZE_DATABASEシステム手続きにより、データベースをバックアップのため一時的に凍結します。
構文

    SYSCS_UTIL.SYSCS_FREEZE_DATABASE()

この手続きは結果を返しません。
例

    String backupdirectory = "c:/mybackups/" + JCalendar.getToday();
    CallableStatement cs = conn.prepareCall
    ("CALL SYSCS_UTIL.SYSCS_FREEZE_DATABASE()");
    cs.execute();
    cs.close();
    // "backupdirectory"全体のバックアップをとる、ユーザのコード
    // バックアップの終了後に、データベースを解凍します。
    CallableStatement cs = conn.prepareCall
    ("CALL SYSCS_UTIL.SYSCS_UNFREEZE_DATABASE()");
    cs.execute();
    cs.close();

SYSCS_UTIL.SYSCS_UNFREEZE_DATABASE システム手続き
バックアップ後に、SYSCS_UTIL.SYSCS_UNFREEZE_DATABASEシステム手続きによりデータベースを解凍します。
構文

    SYSCS_UTIL.SYSCS_UNFREEZE_DATABASE()

この手続きは結果を返しません。
例

    String backupdirectory = "c:/mybackups/" + JCalendar.getToday();
    CallableStatement cs = conn.prepareCall
    ("CALL SYSCS_UTIL.SYSCS_FREEZE_DATABASE()");
    cs.execute();
    cs.close();
    // "backupdirectory"全体のバックアップを取るユーザのコード
    // バックアップが終わったら、データベースを解凍します。
    now unfreeze the database once backup has completed:
    CallableStatement cs = conn.prepareCall
    ("CALL SYSCS_UTIL.SYSCS_UNFREEZE_DATABASE()");
    cs.execute();
    cs.close();

SYSCS_UTIL.SYSCS_RELOAD_SECURITY_POLICY システム手続き
SYSCS_UTIL.SYSCS_RELOAD_SECURITY_POLICYシステム手続きはセキュリティポリシーを再読み込みして、実行中にJavaのセキュリティ設定を変更することができます。 セキュリティポリシーのより詳細な情報は、Derby サーバと管理ガイドの「セキュリティマネージャの下でネットワークサーバを実行する」という章と、Derby ディベロッパーズ ガイドの「Derbyをセキュリティマネージャの下で実行する」という章を読んでください。
構文

    SYSCS_UTIL.SYSCS_RELOAD_SECURITY_POLICY()

この手続きから結果は返りません。
例

    CallableStatement cs = conn.prepareCall
    ("CALL SYSCS_UTIL.SYSCS_RELOAD_SECURITY_POLICY()");
    cs.execute();
    cs.close();

SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTYシステム手続き
SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTYシステム手続きを使って、現在の接続しているデータベースの属性値を設定/削除します。
"VALUE"がnullではないときは、"KEY"でキー値を与えられた属性値が、"VALUE"に設定されます。"VALUE"がnullの時は、"KEY"でキー値を与えられた属性値は、データベースの属性値集合から削除されます。
構文

    SYSCS_UTIL.SYSCS_GET_DATABASE_PROPERTY(IN KEY VARCHAR(128),
    IN VALUE VARCHAR(32672))

この手続きは結果を返しません。
JDBCの例
derby.locks.deadlockTimeout属性を10という値に設定します。

    CallableStatement cs = conn.prepareCall
    ("CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(?, ?)");
    cs.setString(1, "derby.locks.deadlockTimeout");
    cs.setString(2, "10");
    cs.execute();
    cs.close();

SQLの例
derby.locks.deadlockTimeout属性を10という値に設定します。

    CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY
    ('derby.locks.deadlockTimeout', '10');

SYSCS_UTIL.SYSCS_SET_RUNTIMESTATISTICSシステム手続き
SYSCS_UTIL.SYSCS_SET_RUNTIMESTATISTICS()システム手続きにより、接続に対する実行時統計のonとoffを切り替えられます。 既定では実行時統計は動作していません。runtimestatistics属性をonにすると、属性がoffになるまでの間、Derbyは、接続で実行されたcommit以外の各文の実行計画の情報をたもち続けます。 runtimestatistics属性をoffにするには、引数を0で手続きを呼びます。 runtimestatistics属性をonにするには、引数を0ではない任意の数で手続きを呼びます。
行を返さない文に対して実行計画の情報が作られるのは、クライアントプログラムに処理を返す前の内部処理が終わった時です。行を返す文に対しては、初めて呼んだnext()が0行返した時、あるいはclose()が呼び出された時の、何れか早いほうです。
構文

    SYSCS_UTIL.SYSCS_SET_RUNTIMESTATISTICS(IN SMALLINT ENABLE)

例

    -- 接続します。
    -- 接続のRUNTIMESTATISTICをonにします。
    CALL SYSCS_UTIL.SYSCS_SET_RUNTIMESTATISTICS(1);
    -- 複雑な問合せを行います。
    -- 結果セットをなめます。
    -- 実行時統計の情報にアクセスします。
    CALL SYSCS_UTIL.SYSCS_SET_RUNTIMESTATISTICS(0);

SYSCS_UTIL.SYSCS_SET_STATISTICS_TIMINGシステム手続き
SYSCS_UTIL.SYSCS_SET_STATISTICS_TIMINGシステム手続きによって、接続の時刻統計のonとoffを切り替えることができます。 既定で時刻統計はoffです。 runtimestatistics属性が既にonである時のみ、時刻統計をonにできます。 runtimestatistics属性がoffの時は、時刻統計をonにしようとしても無視されます。
時刻統計をonにするには、引数に0以外の値をとって手続きを呼びます。 時刻統計をoffにするには、引数に0をとって手続きを呼びます。
時刻統計がonになっている時、Derbyは実行された文の様々な時刻の情報を残します。この残された情報は、SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICSシステム手続きが返す情報の一部となります。 時刻統計がoffの時、SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICSシステム手続きが表示する時刻の情報は全て0になります。
構文

    SYSCS_UTIL.SYSCS_SET_STATISTICS_TIMING(IN SMALLINT ENABLE)

例
runtimestatistics属性と時刻統計の属性をそれぞれonにします。

    CALL SYSCS_UTIL.SYSCS_SET_RUNTIMESTATISTICS(1);
    CALL SYSCS_UTIL.SYSCS_SET_STATISTICS_TIMING(1);

SYSCS_UTIL.SYSCS_SET_USER_ACCESSシステム手続き
SYSCS_UTIL.SYSCS_SET_USER_ACCESSシステム手続きは、指定したユーザの接続権限を指定します。
構文

    SYSCS_UTIL.SYSCS_SET_USER_ACCESS USERNAME VARCHAR(128), CONNECTION_PERMISSION VARCHAR(128))

USERNAME
VARCHAR(128)型の入力値を取る引数で、DerbyデータベースのユーザIDを指定します。
CONNECTION_PERMISSION
有効なCONNECTION_PERMISSIONの値は以下の通りです。
fullAccess
ユーザをデータベースにてフルアクセスの権限を持つユーザに加えます。データベースプロパティでは、derby.database.fullAccessUsersが該当します。
readOnlyAccess
ユーザをデータベースにて読み取りのみできる権限を持つユーザに加えます。データベースプロパティでは、derby.database.readOnlyAccessUsersが該当します。
null
ユーザを権限管理の一覧から外して、既定の権限のみもつようにします。引用符なしでnullを指定する必要があります。
例

    CALL SYSCS_UTIL.SYSCS_SET_USER_ACCESS ('BRUNNER', 'readOnlyAccess')

権限の一覧からユーザを除くには、nullを引用符なしで指定します。例を次に示します。

    CALL SYSCS_UTIL.SYSCS_SET_USER_ACCESS ('ISABEL', null)

SYSCS_DIAG 診断表および関数
Derbyにはシステム表式が用意されており、データベースの状態やデータベースへの接続の診断情報を取得できます。
Derbyには二種類の診断表式があります。
診断表
Derbyの一般的な表と同様なものです。 表名を置くことができる場所ならどこにでも診断表の名前をおけます。
診断表関数
Derbyの一般的な関数と同様なものです。診断表関数には関数に応じて、0あるいはそれ以上の引数を取ることができます。SQLに定義された表関数の構文に基づき、これらの関数を使う必要があります。
以下の表にはDerbyの診断表式の名称と種類を記します。
表 9. Derbyのシステム診断表式

診断表式 | 式の種類
SYSCS_DIAG.ERROR_LOG_READER | 表関数
SYSCS_DIAG.ERROR_MESSAGES | 表
SYSCS_DIAG.LOCK_TABLE | 表
SYSCS_DIAG.SPACE_TABLE | 表関数
SYSCS_DIAG.STATEMENT_CACHE | 表
SYSCS_DIAG.STATEMENT_DURATION | 表関数
SYSCS_DIAG.TRANSACTION_TABLE | 表

制約事項: DDLや圧縮の手続きにて診断表を参照した場合、Derbyは例外を返します。
SYSCS_DIAG.ERROR_LOG_READER 診断表関数
SYSCS_DIAG.ERROR_LOG_READER診断表関数からは、derby.logファイルや指定した任意のログファイルにある全てのSQL文が得られます。
この診断表関数を使うことで、活動中のトランザクションおよび任意の時点のトランザクションを知ることができます。たとえばデッドロックやロックの時間切れが発生した場合、エラーログからタイムスタンプ(timestampConstant)を見つけることができます。
SYSCS_DIAG.ERROR_LOG_READER診断表関数を使うには、SQL表関数の構文に基づく必要があります。
例を挙げます。:

    SELECT *
        FROM TABLE (SYSCS_DIAG.ERROR_LOG_READER())
        AS T1

ここでT1はユーザが指定した表の名前で、これは任意の識別子です。
SYSCS_DIAG.ERROR_LOG_READER診断表関数には、随意で指定する引数としてログファイルの名前を与えることができます。ログファイルの名前を指定する場合、ファイル名はJavaで文字列とみなせる式でなければなりません。
For example:

    SELECT *
        FROM TABLE (SYSCS_DIAG.ERROR_LOG_READER('myderbyerrors.log'))
        AS T1

ヒント: 既定ではDerbyのログファイルには起動、終了、エラーメッセージしかありません。 より詳細な情報をDerbyのログファイルに出力する方法は、Derbyのチューニングガイドのderby.stream.error.logSeverityLevel属性と、derby.language.logStatementText属性を読んでください。
SYSCS_DIAG.ERROR_MESSAGES 診断表
SYSCS_DIAG.ERROR_MESSAGES診断表には、全てのSQLState、地域に対応したエラーメッセージ、 Derbyデータベースでの例外深刻度が記述されます。 文にて直接にSYSCS_DIAG.ERROR_MESSAGES診断表を参照することができます。
例を挙げます。

    SELECT * FROM SYSCS_DIAG.ERROR_MESSAGES

SYSCS_DIAG.LOCK_TABLE 診断表
SYSCS_DIAG.LOCK_TABLE診断表には、現在時点のDerbyデータベースの全ロックが記述されます。 SYSCS_DIAG.LOCK_TABLE診断表は文にて直接参照することができます。
例を挙げます。

    SELECT * FROM SYSCS_DIAG.LOCK_TABLE

SYSCS_DIAG.LOCK_TABLE診断表が文にて参照される場合、表のロックのスナップショットが撮られます。 このスナップショットは診断表を参照しても、アプリケーションの通常処理時間や処理の流れに影響が出ないように用意されるものです。 このスナップショットが撮られる時、ロックが状態遷移中である可能性があります。
SYSCS_DIAG.SPACE_TABLE 診断表関数
SYSCS_DIAG.SPACE_TABLE診断表関数では、指定した表とその索引が利用している領域を表示できます。 この診断表関数により表や索引を圧縮することで、どれだけ領域を節約できるか知ることができます。
SYSCS_DIAG.SPACE_TABLE診断表関数を使うには、SQL表関数の構文に従う必要があります。 この診断表関数は二つの引数をとります。スキーマ名と表名です。 表名は必須です。スキーマ名を指定しなかった場合、現在のスキーマが適用されます。
たとえば以下の問い合わせでは、データベースにある全ユーザ表と索引の利用する領域を返します。

    SELECT T2.*
        FROM
            SYS.SYSTABLES systabs,
            TABLE (SYSCS_DIAG.SPACE_TABLE(systabs.tablename)) AS T2
        WHERE systabs.tabletype = 'T'

ここでT2はユーザ指定の表名で、任意の識別子を指定できます。
スキーマ名と表名は、何れもJavaの文字列型とみなされる式でなければなりません。 スキーマ名と表名がデリミトされない識別子であった場合、名前は大文字で指定しなければなりません。
例を挙げます。

    SELECT *
        FROM TABLE (SYSCS_DIAG.SPACE_TABLE('MYSCHEMA', 'MYTABLE'))
        AS T2

SYSCS_DIAG.STATEMENT_CACHE 診断表
SYSCS_DIAG.STATEMENT_CACHE診断表にはSQL文キャッシュの内容が記述されます。 SYSCS_DIAG.STATEMENT_CACHE診断表は文から直接参照できます。
例を挙げます。

    SELECT * FROM SYSCS_DIAG.STATEMENT_CACHE

SYSCS_DIAG.STATEMENT_DURATION 診断表関数
SYSCS_DIAG.STATEMENT_DURATION診断表関数を使って、derby.logファイルや指定したログファイルにあるSQL文の実行時間を知ることができます。
この診断関数を使うことで、アプリケーションのJDBCコードのどこにボトルネックがあるかの、手がかりを得ることができます。
SYSCS_DIAG.STATEMENT_DURATION診断表関数を使うには、SQLの表関数構文に基づく必要があります。
例を挙げます。

    SELECT *
        FROM TABLE (SYSCS_DIAG.STATEMENT_DURATION())
        AS T1

ここでT1はユーザが指定した表名で、任意の識別子を指定できます。
制約事項: この表では、個々のトランザクションIDにおける最後の文毎に、行が対応していません。トランザクションによる情報の変更があった場合、トランザクションIDはコミットやロールバンクの前後で値が変わります。
SYSCS_DIAG.STATEMENT_DURATION診断表関数には随意の引数としてログファイルを指定できます。 ログファイル名を指定した場合、ファイル名はJavaの文字列とみなせる式でなければなりません。
例を挙げます。

    SELECT *
        FROM TABLE (SYSCS_DIAG.STATEMENT_DURATION('somederby.log'))
        AS T1

ヒント: 既定ではDerbyのログファイルには起動、終了、エラーメッセージだけが出力されます。 より詳細な情報をDerbyのログファイルに出力する方法は、Derbyのチューニングガイドのderby.stream.error.logSeverityLevel属性と、derby.language.logStatementText属性を読んでください。 それ以外の情報もあれば、SYSCS_DIAG.STATEMENT_DURATION診断表関数で問い合わせ可能です。
SYSCS_DIAG.TRANSACTION_TABLE 診断表
SYSCS_DIAG.TRANSACTION_TABLE診断表には現在データベースに存在する全トランザクションが記述されます。SYSCS_DIAG.TRANSACTION_TABLE診断表は文から直接参照できます。
例を挙げます。

    SELECT * FROM SYSCS_DIAG.TRANSACTION_TABLE

文にてSYSCS_DIAG.TRANSACTION_TABLE診断表が参照されると、トランザクション表のスナップショットが撮られます。スナップショットは診断表を参照しても、アプリケーションの通常処理時間や処理の流れに影響が出ないよう用意されます。トランザクションはスナップショットの作成時に状態遷移中である場合もあります。
データ型
この節ではDerbyにて利用できるデータ型を説明します。
組み込まれた型の概要
言語のコンパイラや言語の実行システムは、SQLの型を使います。前者はコンパイル時に式の型を判断して、後者は実行時に式の型を判断します。実行時の式の型はコンパイル時の型のサブタイプまたはその実装の何れかとすることができます。
型にはそれぞれにその型の値があります。さらにデータベースに格納された値や式から返される値は、空(NULL)であることがあります。これは値がない、またはわからない事を意味します。 キーワードのNULLを明示する文脈もありますが、空は独立した値ではありません。なぜならば値は関連した型を必要として、空にはそれがないからです。
この章で説明する構文は、CREATE TABLE文にて列のデータ型を指定する構文です。
数値型
Derbyの数値型です。
数値型の概要:
数値型には以下の型があります。それぞれの型は異なるサイズの記憶容量を持ちます。

• |  | 整数
• |  | SMALLINT (2 bytes)
• |  | INTEGER (4 bytes)
• |  | BIGINT (8 bytes)
• |  | 近似数または浮動小数点数
• |  | REAL (4 bytes)
• |  | DOUBLE PRECISION (8 bytes)
• |  | FLOAT (DOUBLE PRECISIONあるいはREALの別名)
• |  | 正確な数
• |  | DECIMAL (精度に応じた記録)
• |  | NUMERIC (DECIMALの別名)

式にて行われる数値型の項目:
式にて整数型が使われると、Derbyは結果の型を少なくともINTEGERにまで昇格します。式にて整数型と非整数型が混在して使われると、Derbyは式の結果を式中の最も高い型に昇格します。式にて行われる型の昇格にて、式中のデータ型の昇格を説明します。
表 10. 式にて行われる型の昇格

式における最も大きな型 | 式の結果型
DOUBLE PRECISION | DOUBLE PRECISION
REAL | DOUBLE PRECISION
DECIMAL | DECIMAL
BIGINT | BIGINT
INTEGER | INTEGER
SMALLINT | INTEGER

例:

    -- 倍精度浮動小数点数を返します。
    VALUES 1 + 1.0e0
    -- 小数の数を返します。
    VALUES 1 + 1.0
    -- 整数を返します。
    VALUES CAST (1 AS INT) + CAST (1 AS INT)

数値を異なる数値型の列に記録する:
大きな記憶領域を占める浮動小数点型の値を、小さな記憶領域の場所に代入するとき、その値が小さな記憶領域の場所に記録できない値であればエラーとなります。 次に例を示します。

    create table mytable (r REAL, d DOUBLE PRECISION);
    0 rows inserted/updated/deleted
    INSERT INTO mytable (r, d) values (3.4028236E38, 3.4028235E38);
    ERROR X0X41: The number '3.4028236E38' is outside the range for
    the data type REAL.

浮動小数点型の値を、INTEGERの列に記録できます。小数点以下の部分は切り捨てられます。次に例を示します。

    INSERT INTO mytable(integer_column) values (1.09e0);
    1 row inserted/updated/deleted
    SELECT integer_column
    FROM mytable;
    I
    ---------------
    1

整数型には、その範囲内で小数のある数値を置くことができますが、精度は失われます。
小数のある数値型には、その精度の範囲内にある整数を置くことができます。例を挙げます。

    ij> insert into mytable (decimal_column)
    VALUES (55555555556666666666);
    ERROR X0Y21: The number '55555555556666666666' is outside the
    range of the target DECIMAL/NUMERIC(5,2) datatype.

大きな記憶領域を占める整数の値を、小さな記憶領域に代入するとき、その値が小さな記憶領域では記録できないとき、エラーとなります。以下に例を挙げます。

    INSERT INTO mytable (int_column) values 2147483648;
    ERROR 22003: The resulting value is outside the range for the
    data type INTEGER.

Note: NUMERICの値から小数以下を取り除く場合、Derbyは切捨てを行います。
小数を計算するときの目盛り:
SQL文には、異なる精度(小数点をはさんだ両方にある桁の数です)や目盛り(小数部の桁の数です)の小数型を使った計算式を書くことができます。 計算結果にて小数型の精度や目盛りがどうなるかはオペランドに依存します。
小数のオペランドが二つ与えられたとして、:

• |  | lpは左辺のオペランドの精度とします。
• |  | rpは右辺のオペランドの精度とします。
• |  | lsは左辺のオペランドの目盛りとします。
• |  | rsは右辺のオペランドの目盛りとします。

結果のデータ型の目盛りは、それぞれの計算方法について、次式のとおりです。

• |  | 掛け算 ls + rs
• |  | 割り算 31 - lp + ls - rs
• |  | AVG() max(max(ls, rs), 4)
• |  | その他全部 max(ls, rs)

例えば、次式の結果ではデータ型の目盛りは27です。

    11.0/1111.33
    // 31 - 3 + 1 - 2 = 27

結果のデータ型の精度は、それぞれの計算方法について、次式のとおりです。

• |  | 掛け算 lp + rp
• |  | 足し算 2 * (p - s) + s
• |  | 割り算 lp - ls + rp + max(ls + rp - rs + 1, 4)
• |  | その他全部 max(lp - ls, rp - rs) + 1 + max(ls, rs)

データ型と、代入・比較・並び替え・順序付け
表 11. Derbyにて可能な代入
この表ではDerbyにて代入の可能なデータ型の組み合わせを説明します。"Y"は代入できることを表します。

Types |
    S
    M
    A
    L
    L
    I
    N
    T
    I
    N
    T
    E
    G
    E
    R
    B
    I
    G
    I
    N
    T
    D
    E
    C
    I
    M
    A
    L
    R
    E
    A
    L
    D
    O
    U
    B
    L
    E
    F
    L
    O
    A
    T
    C
    H
    A
    R
    V
    A
    R
    C
    H
    A
    R
    L
    O
    N
    G

    V
    A
    R
    C
    H
    A
    R
    C
    H
    A
    R

    F
    O
    R

    B
    I
    T

    D
    A
    T
    A
    V
    A
    R
    C
    H
    A
    R

    F
    O
    R

    B
    I
    T

    D
    A
    T
    A
    L
    O
    N
    G

    V
    A
    R
    C
    H
    A
    R

    F
    O
    R

    B
    I
    T

    D
    A
    T
    A
    C
    L
    O
    B
    B
    L
    O
    B
    D
    A
    T
    E
    T
    I
    M
    E
    T
    I
    M
    E
    S
    T
    A
    M
    P
    X
    M
    L
SMALL INT | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | -
INTEGER | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | -
BIGINT | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | -
DECIMAL | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | -
REAL | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | -
DOUBLE | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | -
FLOAT | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | -
CHAR | - | - | - | - | - | - | - | Y | Y | Y | - | - | - | Y | - | Y | Y | Y | -
VARCHAR | - | - | - | - | - | - | - | Y | Y | Y | - | - | - | Y | - | Y | Y | Y | -
LONG VARCHAR | - | - | - | - | - | - | - | Y | Y | Y | - | - | - | Y | - | - | - | - | -
CHAR FOR BIT DATA | - | - | - | - | - | - | - | - | - | - | Y | Y | Y | - | - | - | - | - | -
VARCHAR FOR BIT DATA | - | - | - | - | - | - | - | - | - | - | Y | Y | Y | - | - | - | - | - | -
LONG VARCHAR FOR BIT DATA | - | - | - | - | - | - | - | - | - | - | Y | Y | Y | - | - | - | - | - | -
CLOB | - | - | - | - | - | - | - | Y | Y | Y | - | - | - | Y | - | - | - | - | -
BLOB | - | - | - | - | - | - | - | - | - | - | - | - | - | - | Y | - | - | - | -
DATE | - | - | - | - | - | - | - | Y | Y | - | - | - | - | - | - | Y | - | - | -
TIME | - | - | - | - | - | - | - | Y | Y | - | - | - | - | - | - | - | Y | - | -
TIME STAMP | - | - | - | - | - | - | - | Y | Y | - | - | - | - | - | - | - | - | Y | -
XML | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | Y

表 12. Derbyにて可能な比較
この表ではDerbyにて比較することのできる、データ型の組み合わせを示します。 "Y"は比較が可能であることを表します。

Types |
    S
    M
    A
    L
    L
    I
    N
    T
    I
    N
    T
    E
    G
    E
    R
    B
    I
    G
    I
    N
    T
    D
    E
    C
    I
    M
    A
    L
    R
    E
    A
    L
    D
    O
    U
    B
    L
    E
    F
    L
    O
    A
    T
    C
    H
    A
    R
    V
    A
    R
    C
    H
    A
    R
    L
    O
    N
    G

    V
    A
    R
    C
    H
    A
    R
    C
    H
    A
    R

    F
    O
    R

    B
    I
    T

    D
    A
    T
    A
    V
    A
    R
    C
    H
    A
    R

    F
    O
    R

    B
    I
    T

    D
    A
    T
    A
    L
    O
    N
    G

    V
    A
    R
    C
    H
    A
    R

    F
    O
    R

    B
    I
    T

    D
    A
    T
    A
    C
    L
    O
    B
    B
    L
    O
    B
    D
    A
    T
    E
    T
    I
    M
    E
    T
    I
    M
    E
    S
    T
    A
    M
    P
    X
    M
    L
SMALL INT | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | -
INTEGER | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | -
BIGINT | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | -
DECIMAL | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | -
REAL | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | -
DOUBLE | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | -
FLOAT | Y | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | -
CHAR | - | - | - | - | - | - | - | Y | Y | - | - | - | - | - | - | Y | Y | Y | -
VARCHAR | - | - | - | - | - | - | - | Y | Y | - | - | - | - | - | - | Y | Y | Y | -
LONG VARCHAR | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | -
CHAR FOR BIT DATA | - | - | - | - | - | - | - | - | - | - | Y | Y | - | - | - | - | - | - | -
VARCHAR FOR BIT DATA | - | - | - | - | - | - | - | - | - | - | Y | Y | - | - | - | - | - | - | -
LONG VARCHAR FOR BIT DATA | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | -
CLOB | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | -
BLOB | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | -
DATE | - | - | - | - | - | - | - | Y | Y | - | - | - | - | - | - | Y | - | - | -
TIME | - | - | - | - | - | - | - | Y | Y | - | - | - | - | - | - | - | Y | - | -
TIME STAMP | - | - | - | - | - | - | - | Y | Y | - | - | - | - | - | - | - | - | Y | -
XML | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | -

BIGINT データ型
BIGINTでは整数の記録のため8バイトの領域が割り当てられます。
構文

    BIGINT

コンパイル時の対応するJavaの型
java.lang.Long
JDBCメタ情報での型(java.sql.Types)
BIGINT
最小値
-9223372036854775808 (java.lang.Long.MIN_VALUE)
最大値
9223372036854775807 (java.lang.Long.MAX_VALUE)
他のデータ型と混在させて利用した場合、結果のデータ型は式にて行われる数値型の項目に書かれたルールに従います。
小さな記憶領域しか持たない場所に、それより大きな記憶領域を占める整数値を代入しようとすると、その整数値が小さな記憶領域では記録できずにエラーとなることがあります。またどのような整数でも、適切にnumericの値とする事ができます。BIGINTであれば、充分な精度を持つDECIMALに記録することができます。

    9223372036854775807

BLOBデータ型
BLOB(バイナリラージオブジェクト)は、最大2,147,483,647文字からなる可変長のバイナリ列です。他のバイナリの型と同様にBLOBの列には関連づくコードページがありません。さらにBLOBの列は文字の情報を持ちません。
BLOBの長さはバイトで指定します。また長さには、1024、1024*1024、1024*1024*1024を表す、K、MやGのうち何れかのサフィックスを指定することが可能です。
Note: BLOBに対してLengthはバイト数で指定されます。
構文

    { BLOB | BINARY LARGE OBJECT } [ ( length [{K |M |G }] ) ]

既定の設定
既定でBLOBの長さは2GB(2,147,483,647)です。
コンパイル時の対応するJavaの型
java.sql.Blob
JDBCのメタデータ型
BLOB
格納された情報を扱うためBLOBのハンドルを取得するには、java.sql.ResultSetのgetBlobメソッドを使います。
関連する情報
java.sql.Blobインターフェイスとjava.sql.Clobインターフェイスの対応も参照してください。

    create table pictures(name varchar(32) not null primary key, pic blob(16M));

    --あらゆるロゴの画像を見つける。
    select length(pic), name from pictures where name like '%logo%';
    --重複した画像を見つける(blobの比較)
    select a.name as double_one, b.name as double_two
    from pictures as a, pictures as b
    where a.name < b.name
    and a.pic = b.pic
    order by 1,2;

CHAR データ型
CHARは固定長の領域で文字列を記録します。
Syntax

    CHAR[ACTER] [(長さ)]

長さ は符号のない定数の整数値です。長さの既定値は1です。
実行時の対応するJavaの型
java.lang.String
JDBCのメタデータ型(java.sql.Types)
CHAR
Derbyは文字列値が型の長さより短い場合、空白で空きを詰めます。Derby は文字列値が型の長さより長い場合、空白を切り捨てます。空白以外の文字を残した文字列が長すぎる場合、例外が挙がります。比較演算子がCHARに適用された場合、文字列長の短い値には空白がつめられて、文字列長の長い値と同じ長さになるように処理されます。
CHARとVARCHARの値が式にて混在して利用されていた場合、長さの短い値はスペースで詰められて、文字列長の長い値と同じ長さになるよう処理されます。
文字列の定数の型はCHARです。
実装レベルで定義されている事
CHARデータ型の最大長はjava.lang.Integer.MAX_VALUEです。

    -- 文字列の定数では連続した引用符により、
    -- 一重引用符あるいはアポストロフィーを表します。
    VALUES 'hello this is Joe''s string'

CHAR FOR BIT DATA データ型
CHAR FOR BIT DATA型により、決められた長さのバイトの並びを記録する事ができます。これは、文字列による記録が適切ではない構造化されていない情報を記録するに便利です。
構文

    { CHAR | CHARACTER }[(長さ)] FOR BIT DATA

長さは符号のない整数のリテラルで、長さをバイトで指定します。
CHAR FOR BIT DATA型の既定の長さは1です。さらに最大の長さは254バイトです。
JDBC メタ情報型(java.sql.Types)
BINARY
CHAR FOR BIT DATAは固定長のバイト列を記録します。もし値が対象にて定義された長さより短いものであった場合、空きは0x20というバイト値でつめられます。
CHAR FOR BIT DATAとVARCHAR FOR BIT DATAの値は正確に比較されます。両方のビット列が等しいと評価されるためには、両方が実際に同じ長さでなければなりません。 (これは、他のDBMSにおけるバイナリの値の扱いとは違うのですが、これはSQL-92にて定義された振る舞いです。
VARCHAR FOR BIT DATAやCHAR FOR BIT DATAの値への操作(例えば連結など)はVARCHAR FOR BIT DATAに準じます。

    CREATE TABLE t (b CHAR(2) FOR BIT DATA);
    INSERT INTO t VALUES (X'DE');
    SELECT *
    FROM t;
    -- 次の出力が得られます。
    B
    -----
    de20

CLOBデータ型
CLOB(キャラクタラージオブジェクト)の値は、最大で2,147,483,647の文字長とすることができます。CLOBはユニコードの文字情報を記録するとき使うことができます。このような情報には様々な文字からなるサイズの大きな文書などが考えられます。
CLOBの長さは数で与えられます。もしK、MやGが数のサフィックスに与えられた場合は、それぞれ1024、1024*1024、1024*1024*1024を意味します。
CLOBの長さは(ユニコードの)文字数をあらわします。
構文

    {CLOB |CHARACTER LARGE OBJECT} [ ( 長さ [{K |M |G}] ) ]

既定の設定
長さを指定しない場合、CLOBの長さは2ギガ(2,147,483,647)バイトとなります。
対応する実行時のJavaの型
java.sql.Clob
JDBC メタデータの型(java.sql.Types)
CLOB
CLOBへのハンドルを取得するには、java.sql.ResultSetにあるgetClobメソッドを使ってください。
関連する情報
java.sql.Blobインターフェイスとjava.sql.Clobインターフェイスの対応を参照してください。

    import java.sql.*;

    public class clob
    {
    	public static void main(String[] args) {
    		try {
    			String url = "jdbc:derby:clobberyclob;create=true";

    			Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
    			Connection conn = DriverManager.getConnection(url);

                Statement s = conn.createStatement();
                s.executeUpdate("CREATE TABLE documents (id INT, text CLOB(64 K))");
                conn.commit();

                // --- ファイルを追加する。
                java.io.File file = new java.io.File("asciifile.txt");
                int fileLength = (int) file.length();

                // - 最初に入力ストリームを作成する。
                java.io.InputStream fin = new java.io.FileInputStream(file);
                PreparedStatement ps = conn.prepareStatement("INSERT
                INTO documents VALUES (?, ?)");
                ps.setInt(1, 1477);

                // - 入力パラメータの値を入力ストリームにする。
                ps.setAsciiStream(2, fin, fileLength);
                ps.execute();
                conn.commit();

                // --- 列を読む。
                ResultSet rs = s.executeQuery("SELECT text FROM documents
                 WHERE id = 1477");
                while (rs.next()) {
                    java.sql.Clob aclob = rs.getClob(1);
                    java.io.InputStream ip = rs.getAsciiStream(1);
                    int c = ip.read();
                    while (c > 0) {
                        System.out.print((char)c);
                        c = ip.read();
                    }
                    System.out.print("\n");
                    // ...
                }
            } catch (Exception e) {
                System.out.println("Error! "+e);
            }
        }
    }

DATEデータ型
DATEにより、java.sql.Dateの範囲で年月日を記録できます。
構文

    DATE

対応する実行時のJavaの型
java.sql.Date
JDBCメタデータ型(java.sql.Types)
DATE
一つの式に日付、時刻、タイムスタンプを混在させてはなりません。
java.sql.Dateのメソッドにより扱うことのできる全ての値が、対応するSQLの日付や時刻のデータ型の列にて許されています。DerbyはDATEの値に対して次の書式を用意しています。

    yyyy-mm-dd
    mm/dd/yyyy
    dd.mm.yyyy

上に示した三つの書式のうち、最初のものはjava.sql.Dateの書式です。
年は常に4桁の数字で表されなければなりません。それに対して月や日は一桁あるいは二桁の数字で表すことができます。
さらに、DerbyはDB2サーバのロケールに特有な日時の書式を受け付けます。もしとるべき書式があいまいである場合は、上で示した組込みの書式が優先されます。
例

    VALUES DATE('1994-02-23')

    VALUES '1993-09-01'

DECIMAL データ型
DECIMALにより精度と目盛りを指定して正確な数を扱えます。 この型では精度(小数点の左右の桁数の合計)と目盛り(小数点以下の桁数)を指定できます。 記憶装置にて必要とされる領域のサイズは、精度により決まります。
構文

    { DECIMAL | DEC } [(精度 [, 目盛り ])]

精度は1から31の数をとります。目盛りは精度以下の数をとります。
目盛りが指定されなかった場合の既定値は0となります。精度が指定されなかった場合の既定値は5となります。
DECIMALに代入することが可能なのは、小数部以外が失われない範囲の数です。 DECIMALの値から小数部を無くする場合、Derbyは切捨てを行います。
例えば、

    -- この型変換で失われるのは小数部のみです。
    values cast (1.798765 AS decimal(5,2));
    1
    --------
    1.79
    -- この型変換はうまく行きません。
    values cast (1798765 AS decimal(5,2));
    1
    --------
    ERROR 22003: The resulting value is outside the range
    for the data type DECIMAL/NUMERIC(5,2).

他のデータ型が式にて混在して利用されていた場合、式の結果となる型は式にて行われる数値型の項目で書かれたとおりに決まります。
数値を異なる数値型の列に記録するも参照してください。
二つのDECIMALの値が式にて用いられていた場合、式の結果となる型は小数を計算するときの目盛りに記述された規則に従って決まります。
対応するコンパイル時のJavaの型
java.math.BigDecimal
JDBC のメタデータ型 (java.sql.Types)
DECIMAL

    VALUES 123.456

    VALUES 0.001

BIGINTには大きすぎる整数の定数は、DECIMALの定数となります。
DOUBLE データ型
DOUBLEはDOUBLE PRECISIONの別名です。
構文

    DOUBLE

DOUBLE PRECISION データ型
DOUBLE PRECISIONはIEEE浮動小数点表記に基づいて数を、8バイトの領域に記録します。
構文

    DOUBLE PRECISION

または、

    DOUBLE

DOUBLEはDOUBLE PRECISIONと同じ意味で用いることができます。
制限
DOUBLEの値は以下の範囲です。

• |  | DOUBLEの最小値: -1.79769E+308
• |  | DOUBLEの最大値: 1.79769E+308
• |  | DOUBLEの最小の正の値: 2.225E-307
• |  | DOUBLEの最大の負の値: -2.225E-307

これらの制限は、Javaの型であるjava.lang.Doubleの制限とは異なります。
これらの範囲外の値が計算されたり代入されると例外が挙がります。 数の演算処理では、結果の値は零に丸め処理されません。 もし値が小さすぎた場合は例外となります。
浮動小数点数の定数は30文字までに制限されます。

    -- この例では定数値が長すぎるため、失敗します。
    values 01234567890123456789012345678901e0;

対応するコンパイル時のJavaの型
java.lang.Double
JDBC のメタデータ型 (java.sql.Types)
DOUBLE
式にて他のデータ型が混在する場合、式の結果の型は式にて行われる数値型の項目で記述された規則に従い決まります。
数値を異なる数値型の列に記録するも参照してください。
例

    3421E+09
    425.43E9
    9E-10
    4356267544.32333E+30

FLOATデータ型
FLOATは、指定した精度によりREALあるいはDOUBLE PRECISIONの別名となります。
構文

    FLOAT [ (精度) ]

既定の精度は53で、これはDOUBLE PRECISIONと同等です。 精度が23以下である場合、FLOATはREALと同等になります。精度が24以上である場合、FLOATはDOUBLE PRECISIONと同等となります。もし精度に0を指定すると、エラーとなります。もし負の精度を指定すると、構文エラーとなります。
JDBC のメタデータ型 (java.sql.Types)
REAL or DOUBLE
制限
もし24以上の精度を指定した場合、FLOATにはDOUBLEと同じ制限がかかります。
もし23以下の精度を指定した場合、FLOATにはREALと同じ制限がかかります。
INTEGER データ型
INTEGERは整数を4バイトの領域に記録します。
構文

    { INTEGER | INT }

対応するコンパイル時のJavaの型
java.lang.Integer
JDBCのメタデータ型 (java.sql.Types)
INTEGER
最小値
-2147483648 (java.lang.Integer.MIN_VALUE)
最大値
2147483647 (java.lang.Integer.MAX_VALUE)
他のデータ型と混在して式中で利用された場合、式の結果となる型は式にて行われる数値型の項目に記述された規則にのっとって決まります。
数値を異なる数値型の列に記録するも参照してください。

    3453
    425

LONG VARCHAR型
LONG VARCHAR型により最大で32,700文字からなる文字列を記録できます。この型の列を定義するとき、最大長を指定する必要がないことを除けば、この型はVARCHARと同様です。
構文

    LONG VARCHAR

対応するコンパイル時のJavaの型
java.lang.String
JDBCメタデータ型 (java.sql.Types)
LONGVARCHAR
Javaの値をSQLの値に変換するとき、LONG VARCHARに対応するJavaの型は存在しません。
LONG VARCHAR FOR BIT DATAデータ型
LONG VARCHAR FOR BIT DATA型には最大で32,700バイトのビット列を記録できます。この型は列の定義を行うときに最大長を指定する必要がないことを除き、VARCHAR FOR BIT DATAと同じです。
構文

    LONG VARCHAR FOR BIT DATA

JDBC メタデータ型(java.sql.Types)
LONGVARBINARY
NUMERICデータ型
NUMERICはDECIMALの別名で、同様に機能します。 DECIMAL データ型を参照してください。
構文

    NUMERIC [(精度 [, 目盛り ])]

対応するコンパイル時のJavaの型
java.math.BigDecimal
対応するJDBCのメタデータ型(java.sql.Types)
NUMERIC

    123.456
    .001

REAL データ型
REAL型ではIEEE浮動小数点数の記法に従う数が4バイトの領域に記録されます。
記法

    REAL

対応するコンパイル時のJavaの型
java.lang.Float
JDBCのメタデータ型(java.sql.Types)
REAL
制限
REALの値の範囲:

• |  | REALの最小値: -3.402E+38
• |  | REALの最大値: 3.402E+38
• |  | REALの最小の正の値: 1.175E-37
• |  | REALの最大の負の値: -1.175E-37

これらの制限はJavaでのjava.lang.Float型の制限とは異なります。
これらの範囲外の値が計算されたり代入されると例外があがります。 算術演算では結果は零に丸め処理されません。 もし値が小さすぎる場合は例外が挙がります。アンダーフローを検知するために、算術演算は倍精度で行われます。
浮動小数点数の定数は文字長が30文字までに制限されています。

    -- この例では定数が長すぎるためエラーとなります。
    values 01234567890123456789012345678901e0;

式において他のデータ型と混在して利用された場合、結果のデータ型は式にて行われる数値型の項目に記述された規則にのっとって決まります。
数値を異なる数値型の列に記録するを参照してください。
定数は常にDOUBLE PRECISIONとされます。REALに変換するにはCASTを使ってください。
SMALLINT データ型
SMALLINTでは2バイトの記憶領域を提供します。
Syntax

    SMALLINT

対応するコンパイル時のJavaの型
java.lang.Short
JDBCのメタデータ型 (java.sql.Types)
SMALLINT
最小値
-32768 (java.lang.Short.MIN_VALUE)
最大値
32767 (java.lang.Short.MAX_VALUE)
他のデータ型が式にて混在して利用された場合、結果のデータ型は式にて行われる数値型の項目に記された規則に則り決まります。
数値を異なる数値型の列に記録するも参照してください。
整数の定数は、その値によりINTEGERあるいはBIGINTとなります。
TIMEデータ型
TIMEでは時刻を記録する領域が提供されます。
構文

    TIME

対応するコンパイル時のJavaの型
java.sql.Time
JDBC メタデータ型 (java.sql.Types)
TIME
日付・時刻・タイムスタンプをCASTなしで式に混在させることはできません。
SQLの日付/時刻のデータ型では、java.sql.Timeのメソッドで認識できる値が全て許されます。Derbyは時刻について、以下の書式を用意します。

    hh:mm[:ss]
    hh.mm[.ss]
    hh[:mm] {AM | PM}

上記の三つのうち最初の書式はjava.sql.Timeの書式です。
時は一文字あるいは二文字の数字です。分と秒があるなら、それらは二文字の数字で表されなければなりません。
Derbyは、データベースサーバのロケールに特有な日時の書式を受け付けます。もし文脈が曖昧になる場合、組込みの書式が優先されます。
例

    VALUES TIME('15:09:02')
    VALUES '15:09:02'

TIMESTAMPデータ型
TIMESTAMPでは日付と時刻が結合された値が記録されます。また秒の小数点以下、9桁の値も記録されます。
構文

    TIMESTAMP

対応するコンパイル時のJavaの型
java.sql.Timestamp
JDBC メタデータ型 (java.sql.Types)
TIMESTAMP
日付、時刻、タイムスタンプは、一つの式で混在して使えません。
DerbyではTIMESTAMPを以下の書式で書けます。

    yyyy-mm-dd hh:mm:ss[.nnnnnn]
    yyyy-mm-dd-hh.mm.ss[.nnnnnn]

上記の二つの書式のうち、最初の一つはjava.sql.Timestampの書式です。
年は常に4文字の数字で表されなければなりません。月や日、時は1文字あるいは2文字の数字とすることができます。分や秒は2文字の数字で表されなければなりません。ナノセカンドが書かれる場合、1文字から6文字の数字で表されます。
Derby はデータベースサーバのロケールに固有の日時書式で書かれた文字列を受け付けます。もし適用するべき書式が曖昧である場合、先に述べた組込みの書式が優先されます。
例

    VALUES '1960-01-01 23:03:20'
    VALUES TIMESTAMP('1962-09-23 03:23:34.234')
    VALUES TIMESTAMP('1960-01-01 23:03:20')

VARCHARデータ型
VARCHARでは文字列を記録する可変長の領域が提供されます。
構文

    { VARCHAR | CHAR VARYING | CHARACTER VARYING }(長さ)

長さは符号のない整数の定数です。 文字列の長さは長さの値や、java.lang.Integer.MAX_VALUEより大きな値であってはなりません。
VARCHARの文字列の最大長は32,672文字です。
対応するコンパイル時のJavaの型
java.lang.String
JDBCのメタデータ型 (java.sql.Types)
VARCHAR
Derby は指定された長さに満たないVARCHARの値を文字詰めしません。 DerbyはVARCHARで指定されたより大きな文字数の値が与えられた場合、文字列から空白を切り捨てます。 空白以外の文字は切り捨てられないので、例外が挙がる原因となります。 VARCHARに対して比較演算子が適用された場合、オペランドの長さが変わることはありませんが、値の末尾にある空白は無視されます。
一つの式にてCHARやVARCHARが混在して使われた場合、文字列長の短い値は文字列長の長い値に合わせて、空白文字で文字詰めされます。
文字列定数の型はVARCHARではなくCHARです。
VARCHAR FOR BIT DATA データ型
VARCHAR FOR BIT DATAでは指定された長さ以下のバイナリ列を記録することができます。これは画像のような文字列とすることが適当ではない、構造のない情報を記録するのに便利です。
構文

    { VARCHAR | CHAR VARYING | CHARACTER VARYING } (長さ) FOR BIT DATA

長さは符号のない整数のリテラルで、長さをバイト数で指定します。
CHAR FOR BIT DATAとは異なり、VARCHAR FOR BIT DATAには、既定の長さは存在しません。長さは最大で32,672バイトにする事ができます。
JDBCメタデータ型 (java.sql.Types)
VARBINARY
VARCHAR FOR BIT DATAでは可変長のバイト列が記録されます。CHAR FOR BIT DATAとは異なり、VARCHAR FOR BIT DATAでは長さをそろえるための値詰めはありません。
値の連結などをVARCHAR FOR BIT DATAとCHAR FOR BIT DATAの値に行うと、得られる結果の値はVARCHAR FOR BIT DATAとなります。
バイトのリテラル値は常にVARCHAR FOR BIT DATAです。CHAR FOR BIT DATAではありません。
XML data type
The XML data type is used for Extensible Markup Language (XML) documents.
XMLデータ型は以下のように使います。

• |  | SQL/XMLに定義された、整形されたXML(DOCUMENT(ANY))の値を記録する。
• |  | 一時的に整形されたXML(DOCUMENT(ANY))の値ではない、XML(SEQUENCE)の値を扱う。

Note: XMLデータの値を、取得・更新・問合せ等、何らかの方法で操作するアプリケーションでは、JAXP構文解析器とXalanのクラスをクラスパスに持たなければなりません。もし、構文解析器・Xalanの何れかが見つからなければ、Derbyはエラーを発行します。
DerbyではJDBCにて、SQL/XMLを扱う機能が実装されていないので、XMLの値を直接バインドしたり、JDBCの結果セットから直接XMLの値を取得することは不可能です。 その代わりに、XMLPARSEやXMLSERIALIZE等の適切なXMLの演算子を明示的にSQLに書いて、XMLの情報をJavaの文字列や文字のストリームとして、バインドしたり取得する必要があります。
構文

    XML

対応するコンパイル時のJavaの型
無し
XMLの値に対応するJavaの型のjava.sql.SQLXMLは存在します。しかし、java.sql.SQLXML型はDerbyにてサポートされていません。
JDBC メタデータ型 (java.sql.Types)
無し
XMLの値に対応するメタデータ型のSQLXMLは存在します。しかし、SQLXMLはDerbyにてサポートされていません。
DerbyのデータベースからXMLの値を取得するときには、問合せのSQLにてXMLSERIALIZE演算子を使ってください。 例を挙げます。

    SELECT XMLSERIALIZE (xcol as CLOB) FROM myXmlTable

こうすることで、直列化した型に対応するgetXXXメソッドを使って、XMLの値を、取得することができます。この例ではCLOB型となります。
DerbyのデータベースにJDBCを使ってXMLの値を記録するときは、SQL文にてXMLPARSE演算子を使ってください。 例を挙げます。

    INSERT INTO myXmlTable(xcol) VALUES XMLPARSE(
        DOCUMENT CAST (? AS CLOB) PRESERVE WHITESPACE)

そして、文字列の型と互換性のあるsetXXXメソッドを使ってください。 この例ではPreparedStatement.setStringまたはPreparedStatement.setCharacterStreamメソッドを使って、演算子に値を与えます。
SQL予約語
この章ではDerbyの全予約語を一覧で示します。これにはSQL-92にて定められたものも含めます。 これらのキーワードを二重引用符(")で囲むことなく識別子として利用した場合、Derbyはエラーを返します。 詳細はSQL92識別子の規則を参照してください。

|  | ADD
|  | ALL
|  | ALLOCATE
|  | ALTER
|  | AND
|  | ANY
|  | ARE
|  | AS
|  | ASC
|  | ASSERTION
|  | AT
|  | AUTHORIZATION
|  | AVG
|  | BEGIN
|  | BETWEEN
|  | BIGINT
|  | BIT
|  | BOOLEAN
|  | BOTH
|  | BY
|  | CALL
|  | CASCADE
|  | CASCADED
|  | CASE
|  | CAST
|  | CHAR
|  | CHARACTER
|  | CHECK
|  | CLOSE
|  | COALESCE
|  | COLLATE
|  | COLLATION
|  | COLUMN
|  | COMMIT
|  | CONNECT
|  | CONNECTION
|  | CONSTRAINT
|  | CONSTRAINTS
|  | CONTINUE
|  | CONVERT
|  | CORRESPONDING
|  | CREATE
|  | CURRENT
|  | CURRENT_DATE
|  | CURRENT_TIME
|  | CURRENT_TIMESTAMP
|  | CURRENT_USER
|  | CURSOR
|  | DEALLOCATE
|  | DEC
|  | DECIMAL
|  | DECLARE
|  | DEFAULT
|  | DEFERRABLE
|  | DEFERRED
|  | DELETE
|  | DESC
|  | DESCRIBE
|  | DIAGNOSTICS
|  | DISCONNECT
|  | DISTINCT
|  | DOUBLE
|  | DROP
|  | ELSE
|  | END
|  | END-EXEC
|  | ESCAPE
|  | EXCEPT
|  | EXCEPTION
|  | EXEC
|  | EXECUTE
|  | EXISTS
|  | EXPLAIN
|  | EXTERNAL
|  | FALSE
|  | FETCH
|  | FIRST
|  | FLOAT
|  | FOR
|  | FOREIGN
|  | FOUND
|  | FROM
|  | FULL
|  | FUNCTION
|  | GET
|  | GETCURRENTCONNECTION
|  | GLOBAL
|  | GO
|  | GOTO
|  | GRANT
|  | GROUP
|  | HAVING
|  | HOUR
|  | IDENTITY
|  | IMMEDIATE
|  | IN
|  | INDICATOR
|  | INITIALLY
|  | INNER
|  | INOUT
|  | INPUT
|  | INSENSITIVE
|  | INSERT
|  | INT
|  | INTEGER
|  | INTERSECT
|  | INTO
|  | IS
|  | ISOLATION
|  | JOIN
|  | KEY
|  | LAST
|  | LEFT
|  | LIKE
|  | LOWER
|  | LTRIM
|  | MATCH
|  | MAX
|  | MIN
|  | MINUTE
|  | NATIONAL
|  | NATURAL
|  | NCHAR
|  | NVARCHAR
|  | NEXT
|  | NO
|  | NOT
|  | NULL
|  | NULLIF
|  | NUMERIC
|  | OF
|  | ON
|  | ONLY
|  | OPEN
|  | OPTION
|  | OR
|  | ORDER
|  | OUTER
|  | OUTPUT
|  | OVERLAPS
|  | PAD
|  | PARTIAL
|  | PREPARE
|  | PRESERVE
|  | PRIMARY
|  | PRIOR
|  | PRIVILEGES
|  | PROCEDURE
|  | PUBLIC
|  | READ
|  | REAL
|  | REFERENCES
|  | RELATIVE
|  | RESTRICT
|  | REVOKE
|  | RIGHT
|  | ROLLBACK
|  | ROWS
|  | RTRIM
|  | SCHEMA
|  | SCROLL
|  | SECOND
|  | SELECT
|  | SESSION_USER
|  | SET
|  | SMALLINT
|  | SOME
|  | SPACE
|  | SQL
|  | SQLCODE
|  | SQLERROR
|  | SQLSTATE
|  | SUBSTR
|  | SUBSTRING
|  | SUM
|  | SYSTEM_USER
|  | TABLE
|  | TEMPORARY
|  | TIMEZONE_HOUR
|  | TIMEZONE_MINUTE
|  | TO
|  | TRANSACTION
|  | TRANSLATE
|  | TRANSLATION
|  | TRIM
|  | TRUE
|  | UNION
|  | UNIQUE
|  | UNKNOWN
|  | UPDATE
|  | UPPER
|  | USER
|  | USING
|  | VALUES
|  | VARCHAR
|  | VARYING
|  | VIEW
|  | WHENEVER
|  | WHERE
|  | WITH
|  | WORK
|  | WRITE
|  | XML
|  | XMLEXISTS
|  | XMLPARSE
|  | XMLQUERY
|  | XMLSERIALIZE
|  | YEAR

DerbyのサポートするSQL-92の機能
SQL-92のサポートには4つのレベルがあります。

• |  | SQL92E 初歩的
• |  | SQL92T 過渡的　FIPS 127-2という発行物にてNISTが定義
• |  | SQL92I 中級
• |  | SQL92F 完全

基本データ型
次の表ではDerbyにて利用可能なSQL-92の基本データ型を示します。
表 13. 利用可能なSQL-92の機能: 基本データ型

機能 | 定義する仕様 | Derby
SMALLINT | SQL92E | Yes
INTEGER | SQL92E | Yes
DECIMAL(p,s) | SQL92E | Yes
NUMERIC(p,s) | SQL92E | Yes
REAL | SQL92E | Yes
FLOAT(p) | SQL92E | Yes
DOUBLE PRECISION | SQL92E | Yes
CHAR(n) | SQL92E | Yes

基本算術演算
表 14. SQL-92の機能のサポート:基本的な算術演算

機能 | 定義する仕様 | Derby
+, *, -, /, unary +, unary - | SQL92E | Yes

基本的な比較
表 15. SQL-92の機能のサポート:基本的な比較

機能 | 定義する仕様 | Derby
<, >, <= ,>=, <>, = | SQL92E | Yes

基本的な述語
表 16. SQL-92の機能のサポート:基本的な述語

機能 | 定義する仕様 | Derby
BETWEEN, LIKE, NULL | SQL92E | Yes

定量的な述語
表 17. SQL-92の機能のサポート:定量的な述語

機能 | 定義する仕様 | Derby
IN, ALL/SOME, EXISTS | SQL92E | Yes

スキーマの定義
表 18. SQL-92の機能のサポート:スキーマの定義

機能 | 定義する仕様 | Derby
表 | SQL92E | Yes
ビュー | SQL92E | Yes
権限 | SQL92E | Yes

列の属性
表 19. SQL-92の機能のサポート:列の属性

機能 | 定義する仕様 | Derby
既定値 | SQL92E | Yes
空値をとれるかの定義 | SQL92E | Yes

制約(延期できない)
表 20. SQL-92の機能のサポート: 制約(延期できない)

機能 | 定義する仕様 | Derby
NOT NULL | SQL92E | Yes (SYSCONSTRAINTSには記録されない)
UNIQUE/PRIMARY KEY | SQL92E | Yes
FOREIGN KEY | SQL92E | Yes
CHECK | SQL92E | Yes
View WITH CHECK OPTION | SQL92E | No ビューの更新はできない

カーソル
表 21. SQL-92の機能のサポート:カーソル

機能 | 定義する仕様 | Derby
DECLARE, OPEN, FETCH, CLOSE | SQL92E | Yes JDBCのメソッド呼び出しが該当
UPDATE, DELETE CURRENT | SQL92E | Yes

動的なSQL1
表 22. SQL-92の機能のサポート: 動的なSQL1

機能 | 定義する仕様 | Derby
ALLOCATE / DEALLOCATE / GET / SET DESCRIPTOR | SQL92T | Yes JDBCのメソッド呼び出しにより実現
PREPARE / EXECUTE / EXECUTE IMMEDIATE | SQL92T | Yes JDBCのメソッド呼び出しにより実現
DECLARE, OPEN, FETCH, CLOSE, UPDATE, DELETE dynamic cursor | SQL92T | Yes JDBCのメソッド呼び出しにより実現
DESCRIBE output | SQL92T | JDBCにより実現

基本的な情報スキーマ
表 23. SQL-92の機能のサポート 基本的な情報スキーマ

機能 | 定義する仕様 | Derby
TABLES | SQL92T | SYS.SYSTABLES, SYS.SYSVIEWS, SYS.SYSCOLUMNS
VIEWS | SQL92T | SYS.SYSTABLES, SYS.SYSVIEWS, SYS.SYSCOLUMNS
COLUMNS | SQL92T | SYS.SYSTABLES, SYS.SYSVIEWS, SYS.SYSCOLUMNS

基本的なスキーマへの操作
表 24. SQL-92の機能のサポート: 基本的なスキーマへの操作

機能 | 定義する仕様 | Derby
CREATE / DROP TABLE | SQL92T | Yes
CREATE / DROP VIEW | SQL92T | Yes
GRANT / REVOKE | SQL92T | Yes
ALTER TABLE ADD COLUMN | SQL92T | Yes
ALTER TABLE DROP COLUMN | SQL92T | Yes

表の結合
表 25. SQL-92の機能のサポート: 表の結合

機能 | 定義する仕様 | Derby
INNER JOIN | SQL92T | Yes
natural join | SQL92T | No
LEFT, RIGHT OUTER JOIN | SQL92T | Yes
join condition | SQL92T | Yes
named columns join | SQL92T | Yes

日時のデータ型
表 26. SQL-92の機能のサポート: 日時のデータ型

機能 | 定義する仕様 | Derby
単純なDATE, TIME, TIMESTAMP, INTERVAL | SQL92T | Yes ただしINTERVALは無い。
日時の定数 | SQL92T | Yes
日時の演算 | SQL92T | Yes Javaのメソッドにて可能
日時の比較 | SQL92T | Yes
述語: OVERLAPS | SQL92T | Yes Javaのメソッドにて可能

VARCHAR データ型
表 27. SQL-92の機能のサポート: VARCHAR

機能 | 定義する仕様 | Derby
LENGTH | SQL92T | Yes
連結 (||) | SQL92T | Yes

トランザクションの分離
表 28. SQL-92の機能のサポート: トランザクションの分離

機能 | 定義する仕様 | Derby
READ WRITE / READ ONLY | SQL92T | JDBCの利用、データベースの属性、記録媒体による
RU, RC, RR, SER | SQL92T | Yes

ユーザ毎に複数スキーマを持つ
表 29. SQL-92の機能のサポート: ユーザ毎に複数スキーマを持つ

機能 | 定義する仕様 | Derby
SCHEMATA ビュー | SQL92T | SYS.SYSSCHEMAS

権限表
表 30. SQL-92の機能のサポート: 権限表

機能 | 定義する仕様 | Derby
TABLE_PRIVILEGES | SQL92T | No
COLUMNS_PRIVILEGES | SQL92T | No
USAGE_PRIVILEGES | SQL92T | No

表への操作
表 31. SQL-92の機能のサポート: 表への操作

機能 | 定義する仕様 | Derby
UNION relaxation | SQL92I | Yes
EXCEPT | SQL92I | Yes
INTERSECT | SQL92I | Yes
CORRESPONDING | SQL92I | No

スキーマの定義文
表 32. SQL-92の機能のサポート: スキーマの定義文

機能 | 定義する仕様 | Derby
CREATE SCHEMA | SQL92I | 部分的に実現

ユーザ認証
表 33. SQL-92の機能のサポート: ユーザ認証

機能 | 定義する仕様 | Derby
SET SESSION AUTHORIZATION | SQL92I | SET SCHEMAを使う
CURRENT_USER | SQL92I | Yes
SESSION_USER | SQL92I | Yes
SYSTEM_USER | SQL92I | No

表の制約
表 34. SQL-92の機能のサポート:表の制約

機能 | 定義する仕様 | Derby
TABLE CONSTRAINTS | SQL92I | SYS.SYSCONSTRAINTS
REFERENTIAL CONSTRAINTS | SQL92I | SYS.SYSFOREIGNKEYS
CHECK CONSTRAINTS | SQL92I | SYS.SYSCHECKS

スキーマ情報の提供
表 35. SQL-92の機能のサポート: スキーマ情報の提供

機能 | 定義する仕様 | Derby
SQL_FEATURES | SQL92I/FIPS 127-2 | JDBCのDatabaseMetaDataを利用
SQL_SIZING | SQL92I/FIPS 127-2 | JDBCのDatabaseMetaDataを利用

日時の全機能
表 36. SQL-92の機能のサポート: 日時の全機能

機能 | 定義する仕様 | Derby
TIMEやTIMESTAMPの精度 | SQL92F | Yes

全ての文字列処理
表 37. SQL-92の機能のサポート: 全ての文字列処理

機能 | 定義する仕様 | Derby
POSITION式 | SQL92F | JavaのメソッドあるいはLOCATEを利用
UPPER/LOWER 関数 | SQL92F | Yes

様々
表 38. SQL-92の機能のサポート: 様々

機能 | 定義する仕様 | Derby
デリミトされた識別子 | SQL92E | Yes
相互に関連した副問合せ | SQL92E | Yes
挿入・更新・削除文 | SQL92E | Yes
結合 | SQL92E | Yes
Whereによる限定 | SQL92E | Yes
Group by | SQL92E | Yes
Having | SQL92E | Yes
集約関数 | SQL92E | Yes
Order by | SQL92E | Yes
選択式 | SQL92E | Yes
Select * | SQL92E | Yes
SQLCODE | SQL92E | No SQL-92では推奨されない。
SQLSTATE | SQL92E | Yes
ビューでのUNION、INTERSECTおよびEXCEPT | SQL92T | Yes
暗黙の数値型変換 | SQL92T | Yes
暗黙の文字列型変換 | SQL92T | Yes
診断情報の取得 | SQL92T | JDBCのSQLExceptionsを利用
グループへの処理 | SQL92T | Yes
selectの選択項目一覧における限定された* | SQL92T | Yes
小文字の識別子 | SQL92T | Yes
空値とすることのできる主キー | SQL92T | No
複数のモジュールサポート | SQL92T | No (JDBCの一部ではなく、必要ではない。)
参照性の削除処理 | SQL92T | CASCADE、SET NULL、RESTRICTやNO ACTION
CAST関数 | SQL92T | Yes
INSERT式 | SQL92T | Yes
明示的な既定値 | SQL92T | Yes
キーワードの緩和 | SQL92T | Yes
Domainの定義 | SQL92I | No
CASE式 | SQL92I | 部分的にサポート
合成された文字列の定数 | SQL92I | 連結が利用できる
LIKEの機能強化 | SQL92I | Yes
UNIQUEの述語 | SQL92I | No
表の利用情報 | SQL92I | SYS.SYSDEPENDS
中間的な情報スキーマ | SQL92I | JDBCのDatabaseMetaDataおよびDerbyのシステム表が利用可
副プログラムのサポート | SQL92I | より機能が豊富なJDBCでは関係が無い。
中間的なSQLへのフラグ付け | SQL92I | No
スキーマの操作 | SQL92I | Yes
長い識別子 | SQL92I | Yes
両側への外部結合 | SQL92I | No
タイムゾーンの指定 | SQL92I | No
スクロール可能なカーソル | SQL92I | 部分的 (JDBC2.0ではスクロール可能なinsensitiveなカーソル。)
中間的な集合関数のサポート | SQL92I | 部分的に実現
文字セットの定義 | SQL92I | Javaのロケールをサポート
文字セットへの名前付け | SQL92I | Javaのロケールをサポート
スカラー副問合せの値 | SQL92I | Yes
拡張されたnull述部 | SQL92I | Yes
制約の管理 | SQL92I | Yes (ADD/DROP CONSTRAINT)
FOR BIT DATA 型 | SQL92F | Yes
Assertion 制約 | SQL92F | No
一時表 | SQL92F | DECLARE GLOBAL TEMPORARY TABLEで、部分的に実現。
完全な動的SQL | SQL92F | No
完全なvalues式 | SQL92F | Yes
真の値判定 | SQL92F | Yes
導出表をFROMにおける | SQL92F | Yes
アンダースコアを後につけることができる | SQL92F | Yes
Indicatorデータ型 | SQL92F | JDBCとは関連しない。
参照する名前の順番 | SQL92F | No
完全なSQLのフラグ付け | SQL92F | No
行および表の構築子 | SQL92F | Yes
カタログ名の限定子 | SQL92F | No
単純表 | SQL92F | No
CHECK制約での副問合せ | SQL92F | No ただしJavaのメソッドで同等のことができる。
Union join | SQL92F | No
Collationやtranslation | SQL92F | Javaのロケールが利用可能
参照性の更新処理 | SQL92F | RESTRICTおよびNO ACTION。 トリガによりその他も可能。
ALTER domain | SQL92F | No
INSERT 列権限 | SQL92F | No
参照性のMATCH型 | SQL92F | No
ビューのCHECK制約の機能強化 | SQL92F | No、ビューは更新できない。
Session管理 | SQL92F | JDBCを利用
接続管理 | SQL92F | JDBCを利用
自己参照的な操作 | SQL92F | Yes
insensitiveなカーソル | SQL92F | Yes JDBC 2.0を通して可能
完全な集合関数 | SQL92F | 部分的な実現
カタログへのフラグ付け | SQL92F | No
局所的な表への参照 | SQL92F | No
カーソル全体の更新 | SQL92F | No

Derbyのシステム表
Derbyにはシステム表があります。
システム表への問合せを行うことはできますが、変更はできません。
これらのシステム表はSYSスキーマにあります。このスキーマは既定のスキーマではないので、システム表にアクセスする時は、問合せにてスキーマ名のSYSで限定するようにしてください。
これらの表にある情報にアクセスする場合、Javaの java.sql.DatabaseMetaDataインターフェイスを利用する事をお勧めします。
SYSALIASES システム表
データベースにある手続きや関数を記述します。

列名 | 型 | 長さ | 空許容 | 内容
ALIASID | CHAR | 36 | 不可 | aliasの一意な識別子
ALIAS | VARCHAR | 128 | 不可 | alias
SCHEMAID | CHAR | 36 | 可 | 将来の利用のために予約
JAVACLASSNAME | LONGVARCHAR | 255 | 不可 | Javaのクラス名
ALIASTYPE | CHAR | 1 | 不可 | 'F' (関数)'P' (手続き)
NAMESPACE | CHAR | 1 | 不可 | 'F' (関数)'P' (手続き)
SYSTEMALIAS | BOOLEAN | ' | 不可 | 可 (システムが提供あるいは組込みのalias) false (ユーザが作成したalias)
ALIASINFO |
    org.apache.derby.
    catalog.AliasInfo:
このクラスは公開APIの一部ではない。 | ' | 可 | alias固有の追加情報をカプセル化したインターフェイス
SPECIFICNAME | VARCHAR | 128 | 不可 | システムが作成した識別子

SYSCHECKSシステム表
データベースのチェック制約について記述します。

列名 | 型 | 長さ | 空許容 | 内容
CONSTRAINTID | CHAR | 36 | 不可 | 制約の識別子
CHECKDEFINITION | LONG VARCHAR | ' | 不可 | チェック制約定義の文字列
REFERENCEDCOLUMNS | org.apache.derby.catalog. ReferencedColumns: このクラスは公開APIではない。 | ' | 不可 | チェック制約が参照する列の説明

SYSCOLPERMS システム表
SYSCOLPERMS 表には権限が付与されている列の情報が記録されます。
全ての権限について、GRANTEE, TABLEID, TYPE, GRANTORの組み合わせ毎に、SYSCOLPERMS表に行が一行あります。SYSCOLPERMS表のキーは以下のとおりです。

• |  | 主キー (GRANTEE, TABLEID, TYPE, GRANTOR)
• |  | 一意キー (COLPERMSID)
• |  | 外部キー (TABLEID references SYS.SYSTABLES)

列名 | 型 | 長さ | Null可 | 内容
COLPERMSID | CHAR | 36 | 不可 | 依存関係管理機能にて、ビューやトリガ、制約の、列ごとの権限への依存を処理するために使われます。
GRANTEE | VARCHAR | 30 | 不可 | 権限が与えられたユーザの認証識別子です。
GRANTOR | VARCHAR | 30 | 不可 | 権限を与えたユーザの認証識別子です。データベース上の情報を保有するユーザだけがその情報への権限を与えることができます。
TABLEID | CHAR | 36 | 不可 | 権限が与えられた表の一意な識別子です。
TYPE | CHAR | 1 | 不可 | 権限を付与できない場合、とりうる値は、
    SELECTの「s」、UPDATEの「u」、REFERENCESの「r」
です。権限を付与できる場合、とりうる値は、
    SELECTの「S」、UPDATEの「U」、REFERENCESの「R」です。
COLUMNS | org.apache.derby.iapi.services.io.FormatableBitSet | ' | 不可 | 権限が適用される列の一覧です。 このクラスはAPIとして公開されていません。

SYSCOLUMNSシステム表
データベースの表にある列について記述します。

列名 | 型 | 長さ | 空許容 | 内容
REFERENCEID | CHAR | 36 | 不可 | 表の識別子(SYSTABLES.TABLEIDと結合される)
COLUMNNAME | CHAR | 128 | 不可 | 列・パラメータ名
COLUMNNUMBER | INT | 4 | 不可 | 表中の列位置
COLUMNDATATYPE | org.apache.derby.catalog. TypeDescriptor このクラスは公開APIではない。 | ' | 不可 | 情報の、精度、長さ、目盛り、空許容、型名、記録タイプを記述するシステムの型。
COLUMNDEFAULT | java.io.Serializable | ' | 可 | 表について、列の既定値を記述する。この表に記録されたオブジェクトのtoString()メソッドにより、CREATE TABLEやALTER TABLE文で指定された既定値が文字列として返る。
COLUMNDEFAULTID | CHAR | 36 | 可 | 既定値の識別値
AUTOINCREMENT COLUMNVALUE | BIGINT | ' | 可 | 列が識別子列であれば、次の値をとる。
AUTOINCREMENT COLUMNSTART | BIGINT | ' | 可 | 列が識別子列であれば、(指定された場合）開始値をとる。
AUTOINCREMENT COLUMNINC | BIGINT | ' | 可 | 列が識別値列であれば、(指定された場合）自動的な増分の値をとる。

SYSCONGLOMERATES システム表
現在のデータベースに存在するコングロマリットについて記述します。コングロマリットとは情報を記録する構造の単位であり、表あるいは索引に分類されます。

列名 | 型 | 長さ | 空許容 | 内容
SCHEMAID | CHAR | 36 | 不可 | コングロマリットのスキーマ識別子
TABLEID | CHAR | 36 | 不可 | 表の識別子(SYSTABLES.TABLEIDと結合される。)
CONGLOMERATENUMBER | BIGINT | 8 | 不可 | コングロマリット(ヒープあるいは索引)のコングロマリット識別子
CONGLOMERATENAME | VARCHAR | 128 | 可 | もし索引であれば索引名。そうではないなら表の識別子
ISINDEX | BOOLEAN | 1 | 不可 | 索引か否か。
DESCRIPTOR |
    org.apache.derby.
    catalog.IndexDescriptor:
このクラスは公開されたAPIでは無い。 | ' | 可 | 索引を記述するシステム型
ISCONSTRAINT | BOOLEAN | 1 | 可 | 制約の為にシステムが自動的に出力したものか。
CONGLOMERATEID | CHAR | 36 | 不可 | コングロマリットの一意な識別子

SYSCONSTRAINTS システム表
データベースに存在する全ての制約(このバージョンでは主キー・一意性・外部参照・チェックの制約です)に共通する情報を記述します。

列名 | 型 | 長さ | 空許容 | 内容
CONSTRAINTID | CHAR | 36 | 不可 | 制約の識別子
TABLEID | CHAR | 36 | 不可 | 表の識別子(SYSTABLES.TABLEIDを参照)
CONSTRAINTNAME | VARCHAR | 128 | 不可 | 制約名 (ユーザが指定しない場合、システムが内部的に生成)
TYPE | CHAR | 1 | 不可 | P (主キー)、U (一意性)、C (チェック)、 あるいは F (外部キー)
SCHEMAID | CHAR | 36 | 不可 | 制約が所属するスキーマの識別子(SYSSCHEMAS.SCHEMAIDを参照)
STATE | CHAR | 1 | 不可 | 有効ならE、無効ならD
REFERENCECOUNT | INTEGER | 1 | 不可 | この制約を参照する外部参照整合の数。制約が主キー・一意性制約である場合のみ、この値は0より大きい。

SYSDEPENDS システム表
SYSDEPENDS表にはデータベースにある永続的な情報の間の関連が記録されています。
永続的な情報は依存情報と被依存情報に分類されます。 依存情報は他の情報に依存する情報です。 被依存情報は他の情報から依存される情報です。

• |  | 依存情報にはビュー、制約、トリガがあります。
• |  | 被依存情報には表、コングロマリット、制約、権限があります。

列名 | 型 | 長さ | 空許容 | 内容
DEPENDENTID | CHAR | 36 | 不可 | 依存情報の一意な識別子
DEPENDENTFINDER | org.apache.derby.catalog. DependableFinder: この型は公開されたAPIではない。 | 1 | 不可 | 依存している表や制約、トリガを記述するシステム型
PROVIDERID | CHAR | 36 | 不可 | 被依存情報の一意な識別子
PROVIDERFINDER | org.apache.derby.catalog. DependableFinder この型は公開されたAPIではない。 | 1 | false | 被依存情報である、表、コングロマリット、制約、権限を記述する情報。

SYSFILESシステム表
データベースに格納されたjarファイルを記述します。

列名 | 型 | 長さ | 空許容 | 内容
FILEID | CHAR | 36 | 不可 | jarファイルの一意な識別子
SCHEMAID | CHAR | 36 | 不可 | jarファイルのスキーマの識別子(SYSSCHEMAS. SCHEMAIDと結合される)
FILENAME | VARCHAR | 128 | 不可 | jarファイルのSQL名
GENERATIONID | BIGINT | ' | 不可 | ファイルに対して生成された番号。jarファイルが置き換えられると生成された番号は変わる。

SYSFOREIGNKEYSシステム表
現在のデータベースにある外部参照制約を記述します。
Derby では外部参照制約に合わせて、そのための索引を作成します。この索引の名前はSYSFOREIGNKEYS.CONGLOMERATEIDと同じです。

列名 | 型 | 長さ | 空許容 | 内容
CONSTRAINTID | CHAR | 36 | false | unique identifier for the foreign key constraint (join with SYSCONSTRAINTS. CONSTRAINTID)
CONGLOMERATEID | CHAR | 36 | 不可 | 外部参照制約のための索引の一意な識別子(SYSCONGLOMERATES. CONGLOMERATEIDを参照する。)
KEYCONSTRAINTID | CHAR | 36 | 不可 | この外部参照制約により参照される、主キー・一意性制約の一意な識別子(SYSKEYS.CONSTRAINTIDあるいはSYSCONSTRAINTS. CONSTRAINTID)
DELETERULE | CHAR | 1 | 不可 | NO ACTION (既定)ならR、RESTRICTならS、CASCADEならC、SET NULLならU
UPDATERULE | CHAR | 1 | 不可 | NO ACTION(既定)ならR、restrictならS

SYSKEYSシステム表
現在のデータベースにある主キーや一意性制約の情報を記述します。 Derbyはこれらの制約のために、 それぞれ毎の索引を作成します。索引の名前はSYSKEYS.CONGLOMERATEIDと同じです。

列名 | 型 | 長さ | 空許容 | 内容
CONSTRAINTID | CHAR | 36 | 不可 | 制約の一意な識別子
CONGLOMERATEID | CHAR | 36 | 不可 | 制約のための索引の一意な識別子

SYSROUTINEPERMS システム表
SYSROUTINEPERMS表にはルーチンへの権限が記録されています。
それぞれのルーチンにはSYSROUTINEPERMS表にて、EXECUTE権限が指定されています。SYSROUTINEPERMS表のキーは以下のとおりです。

• |  | 主キー (GRANTEE, ALIASID, GRANTOR)
• |  | 一意キー (ROUTINEPERMSID)
• |  | 外部キー (ALIASIDがSYS.SYSALIASESを参照する。)

以下の表にてSYSTABLEPERMS表の各列について説明します。

列名 | 型 | 長さ | 空許容 | 内容
ROUTINEPERMSID | CHAR | 36 | 不可 | 依存性管理機能にて、ビュー・トリガ・制約のルーチンのルーチンレベルの権限への依存性を追跡するために使われる。
GRANTEE | VARCHAR | 30 | 不可 | 権限の付与されたユーザの認証識別子。
GRANTOR | VARCHAR | 30 | 不可 | 権限を付与したユーザの認証識別子。権限は情報の所有者によってのみ付与される。
ALIASID | CHAR | 36 | 不可 | 必要な権限の識別子。もしPERMTYPEが'E'ならALIASIDはSYS.SYSALIASES表を参照する。そうでなければ、ALIASIDはSYS.SYSTABLES表を参照する。
GRANTOPTION | CHAR | 1 | 不可 | GRANTEEがルーチンの所有者ならば指定する。有効な値はYあるいはN。

SYSSCHEMAS システム表
現在のデータベースにあるスキーマの情報を記述します。

列名 | 型 | 長さ | 空許容 | 内容
SCHEMAID | CHAR | 36 | 不可 | スキーマの一意な識別子
SCHEMANAME | VARCHAR | 128 | 不可 | スキーマ名
AUTHORIZATIONID | VARCHAR | 128 | 不可 | スキーマの所有者の認証識別子

SYSSTATISTICSシステム表
現在のデータベースにあるスキーマについて記述します。

列名 | 型 | 長さ | 空許容 | 内容
STATID | CHAR | 36 | 不可 | 統計の一意な識別子
REFERENCEID | CHAR | 36 | 不可 | 統計がとられたコングロマリット(SYSCONGLOMERATES. CONGLOMERATEIDを参照)
TABLEID | CHAR | 36 | 不可 | 情報の採取された表
CREATIONTIMESTAMP | TIMESTAMP | ' | 不可 | 統計が作成/更新された時
TYPE | CHAR | 1 | 不可 | 統計の種類
VALID | BOOLEAN | ' | 不可 | 統計はまだ有効か
COLCOUNT | INTEGER | ' | 不可 | 統計の列数
STATISTICS |
    org.apache.
    derby.catalog.
    Statistics:
このクラスは公開APIではない。 | ' | 可 | 統計情報

SYSSTATEMENTSシステム表
格納されている準備された文毎に行があります。

列名 | 型名 | 長さ | 空許容 | 内容
STMTID | CHAR | 36 | 不可 | 文の一意な識別子
STMTNAME | VARCHAR | 128 | 不可 | 文の名前
SCHEMAID | CHAR | 36 | 不可 | 文の属するスキーマ
TYPE | CHAR | 1 | 不可 | 常に'S'
VALID | BOOLEAN | ' | 不可 | 有効ならTRUE、無効ならFALSE
TEXT | LONG VARCHAR | ' | 不可 | 文のテキスト
LASTCOMPILED | TIMESTAMP | ' | 可 | 文がコンパイルされた時
COMPILATION SCHEMAID | CHAR | 36 | 不可 | 文のあるスキーマの識別子
USINGTEXT | LONG VARCHAR | ' | 可 | CREATE STATEMENTとALTER STATEMENT文のUSING節のテキスト

SYSTABLEPERMS システム表
SYSTABLEPERMS表には権限が付与されているテーブルの情報が記録されます。
全ての権限について、GRANTEE, TABLEID, GRANTORの組み合わせごとに、SYSTABLEPERMS表に行が一行あります。SYSTABLEPERMS表のキーは以下のとおりです。

• |  | 主キー (GRANTEE, TABLEID, GRANTOR)
• |  | 一意キー (TABLEPERMSID)
• |  | 外部キー (TABLEID references SYS.SYSTABLES)

次にSYSTABLEPERMS表にある各列の情報を記します。

列名 | 型 | 長さ | Null可 | 内容
TABLEPERMSID | CHAR | 36 | 不可 | 依存関係管理機能において、ビューやトリガ、制約の、テーブル単位の権限への依存を処理するために使います。
GRANTEE | VARCHAR | 30 | 不可 | 権限が与えられたユーザの認証識別子です。
GRANTOR | VARCHAR | 30 | 不可 | 権限を与えたユーザの認証識別子です。データベース上の情報の所有者だけが権限を与えることができます。
TABLEID | CHAR | 36 | 不可 | 権限が与えられたテーブルの一意な識別子です。
SELECTPRIV | CHAR | 1 | 不可 | SELECT権限が与えられているかをあらわします。有効な値は、'y'(付与されたものではない権限を持つ) 'Y'(付与された権限を持つ) 'N'(権限を持たない)です。
DELETEPRIV | CHAR | 1 | 不可 | DELETE権限が与えられているかをあらわします。 有効な値は、'y'(付与されたものではない権限を持つ) 'Y'(付与された権限を持つ) 'N'(権限を持たない)です。
INSERTPRIV | CHAR | 1 | 不可 | INSERT権限が与えられているかをあらわします。 有効な値は、'y'(付与されたものではない権限を持つ) 'Y'(付与された権限を持つ) 'N'(権限を持たない)です。
UPDATEPRIV | CHAR | 1 | 不可 | UPDATE権限が与えられているかをあらわします。 有効な値は、'y'(付与されたものではない権限を持つ) 'Y'(付与された権限を持つ) 'N'(権限を持たない)です。
REFERENCEPRIV | CHAR | 1 | 不可 | REFERENCE権限が与えられているかをあらわします。 有効な値は、'y'(付与されたものではない権限を持つ) 'Y'(付与された権限を持つ) 'N'(権限を持たない)です。
TRIGGERPRIV | CHAR | 1 | 不可 | TRIGGER権限が与えられているかをあらわします。有効な値は、'y'(付与されたものではない権限を持つ) 'Y'(付与された権限を持つ) 'N'(権限を持たない)です。

SYSTABLES システム表
現在のデータベースにある表やビューを記述します。

列名 | 型 | 長さ | 空許容 | 内容
TABLEID | CHAR | 36 | 不可 | 表やビューの一意な識別子
TABLENAME | VARCHAR | 128 | 不可 | 表やビューの名前
TABLETYPE | CHAR | 1 | 不可 | 'S' (システム表)、'T' (ユーザ表)あるいは 'V' (ビュー)
SCHEMAID | CHAR | 36 | 不可 | 表やビューのスキーマ識別子
LOCK GRANULARITY | CHAR | 1 | 不可 | 表へのロックの粒度を表す。 'T' (表レベルのロック) 'R' (行レベルのロック 既定)

SYSTRIGGERSシステム表
データベースのトリガを記述

列名 | 型 | 長さ | 空許容 | 内容
TRIGGERID | CHAR | 36 | 不可 | トリガの一意な識別子
TRIGGERNAME | VARCHAR | 128 | 不可 | トリガの名称
SCHEMAID | CHAR | 36 | 不可 | トリガのスキーマの識別子(SYSSCHEMAS. SCHEMAIDを参照)
CREATIONTIMESTAMP | TIMESTAMP | ' | 不可 | トリガの作成された時。
EVENT | CHAR | 1 | 不可 | 'U'は更新、 'D'は削除、'I'は挿入を表す。
FIRINGTIME | CHAR | 1 | 不可 | 'B'は先、 'A'は後を表す。
TYPE | CHAR | 1 | 不可 | 'R'は行、'S'は文を表す。
STATE | CHAR | 1 | 不可 | 'E'は有効、'D'は無効を表す。
TABLEID | CHAR | 36 | 不可 | トリガの定義された表の識別子。
WHENSTMTID | CHAR | 36 | 可 | WHEN節があるときのみ利用(現在はサポートしていない。)
ACTIONSTMTID | CHAR | 36 | 可 | トリガされるSQL文の、格納された準備済み文の識別子 (SYSSTATEMENTS. STMTIDを参照)
REFERENCEDCOLUMNS | org.apache.derby.catalog. ReferencedColumns: このクラスは公開APIではない。 | ' | 可 | UPDATEトリガが参照する列の記述子
TRIGGERDEFINITION | LONG VARCHAR | ' | 可 | 実行するSQL文のテキスト
REFERENCINGOLD | BOOLEAN | ' | true | whether or not the OLDREFERENCINGNAME, if non-null, refers to the OLD row or table
REFERENCINGNEW | BOOLEAN | ' | 真 | もし空でなければ、NEWREFERENCINGNAMEが新しい行や表を参照するか否か。
OLDREFERENCINGNAME | VARCHAR | 128 | 真 | REFERENCING OLD AS節を利用した場合の仮名称
NEWREFERENCINGNAME | VARCHAR | 128 | 真 | REFERENCING NEW AS節を利用した場合の仮名称

トリガされるSQL文では、全てのSQL文がコンパイルされてSYSSTATEMENTSに格納されます。ACTIONSTMTIDとWHENSTMTIDは、SYSSTATEMENTS.STMTIDを参照する外部キーです。トリガの文は常にトリガと同じスキーマに置かれます。
SYSVIEWS システム表
現在のデータベースにあるビューの定義を記述します。

列名 | 型 | 長さ | 空許容 | 内容
TABLEID | CHAR | 36 | 不可 | ビューの一意な識別子 (TABLEIDという名称は、参照するSYSTABLESの列名に拠ります。)
VIEWDEFINITION | LONG VARCHAR | ' | 不可 | ビュー定義のテキスト
CHECKOPTION | CHAR | 1 | 不可 | 'N' (チェックのオプションは未だサポートされていません。)
COMPILATION SCHEMAID | CHAR | 36 | 不可 | ビューのあるスキーマの識別子

Derbyの例外メッセージとSQL state
Derbyにて発生する全てのエラーは、JDBCからSQLExceptionとして挙がります。 もしユーザの定義した型から例外が挙がって、その例外がSQLExceptionでは無い場合、その例外はSQLExceptionにラップされています。 Derby固有のSQLExceptionは、SQLStateクラスに定義されたXで始まるコードを用います。標準に定義されたSQLStateの値は、対応する例外に対して返されます。
JDBCドライバにて実装されていない機能には、0Aで始まるSQLStateのSQLExceptionが返されます もしあなたのアプリケーションがJDK 1.6以上の環境で実行されているのであれば、例外クラスはjava.sql.SQLFeatureNotSupportedExceptionとなります。 これらの実装されていないとされる部分は、Derbyにてサポートされていない機能です。
Derbyは、文言とSQLStateのフィールドに値を提供します。さらに、DerbyはnextExceptionの連鎖により複数のSQLExceptionsを返すことがあります。 最初の例外は、常にSQL-92に定義された最も致命的な例外であり、これはDerby固有の例外に先立ちます。
SQLExceptionsの処理については、Derby ディベロッパーズ ガイドを参照してください。
SQLのエラーメッセージと例外
以下の表により例外のSQLStatesを一覧します。Xで始まる例外はDerbyに固有なものです。
表 39. 分類 01:警告

SQLSTATE | 文言
01001 | 既に削除済みの行を更新または削除しようとしました。更新または削除された行はありません。
01003 | 列関数の引数から NULL 値が除去されませんでした。
01006 | 特権がユーザー <認証識別子>から取り消されません。
0100E | XX が戻そうとしている結果セットが多すぎます。
01500 | 表<表名>の制約<制約名>がドロップされました。
01501 | ビュー <ビュー名gt; がドロップされました。
01502 | 表<表名>のトリガー <トリガ名>がドロップされました。
01503 | 表 <表名> の列 <列名> は、非ヌル制約の追加により変更されました。
01504 | 新規索引は既存索引 <索引名> と重複しています。
01505 | 値 <値名> は切り捨てることができません。
01522 | 新規に定義されたシノニム '<別名の名前>' は、現在未定義のオブジェクト '<情報の名前>' に解決されました。
01J01 | データベース '<データベース名>' は作成されませんでした。代わりに既存のデータベースに接続されました。
01J02 | スクロール・センシティブ・カーソルは、現在インプリメントされていません。
01J04 | 列 '<列名>' に対するクラス '<クラス名>' は java.io.Serializable または java.sql.SQLData をインプリメントしていません。 インスタンスを保管するためには、これらのインターフェースのうちの 1 つをインプリメントしている必要があります。
01J05 | データベースのアップグレードが成功しました。 今からアップグレードされたデータベースを使用できます。 保管された準備済みステートメントの再妥当性検査に失敗しました。 失敗の詳細については、次の例外を参照してください。
01J06 | ResultSet は更新できません。 照会は、更新可能な ResultSet を生成するように修飾されていません。
01J07 | グローバル・トランザクションにおける ResultSetHoldability は ResultSet.CLOSE_CURSORS_AT_COMMIT に制限されています。
01J08 | ResultSet 型 <結果セット型> を開くことができません。 ResultSet 型 <結果セット型> が開かれました。
01J10 | スクロール・センシティブ結果セットはサーバーでサポートされていません。前方スクロール専用カーソルに再マップしています。
01J12 | サーバーからメッセージ・テキストを取得できません。 次の例外を参照してください。 ストアード・プロシージャー SYSIBM.SQLCAMESSAGE は、サーバーにインストールされていません。 データベース管理者に連絡してください。
01J13 | 戻された行数 (<数>) は、整数として格納するには大きすぎます。戻された値は切り捨てられます。
01J14 | 先に認証を使用可能にせずに SQL 許可が使用されています。

表 40. 分類 07: 動的SQLのエラー

SQLSTATE | 文言
07000 | 現行ステートメントの少なくとも 1 つのパラメーターが初期化されていません。
07004 | パラメーター <引数名> は <手続名> プロシージャー・パラメーターであり、実行の前に CallableStatement.registerOutParameter に登録される必要があります。
07009 | 入力パラメーターがありません。

表 41. 分類 08: 接続の例外

SQLSTATE | 文言
08000 | 不明の割り込みにより、接続がクローズされました。
08000 | アクティブ・トランザクションがある場合、接続はクローズできません。 トランザクションは開いたままであり、接続はクローズされませんでした。
08001 | セキュリティー・トークンがネットワーク・プロトコルにより許可される最大長を超えているため、接続を確立できませんでした。
08001 | ユーザー ID の長さがゼロであるかネットワーク・プロトコルにより許可される最大長を超えているため、接続を確立できませんでした。
08001 | パスワードの長さがゼロであるかネットワーク・プロトコルにより許可される最大長を超えているため、接続を確立できませんでした。
08001 | 必要な Derby DataSource プロパティー <属性名> が設定されていません。
08001 | <エラー>: ポート <ポート番号> のサーバー <サーバ名> への接続中にメッセージ <文言> でエラーになりました。
08001 | SocketException: '<エラー>'
08001 | ソケット '<エラー>' でストリームを開けません。
08001 | ユーザー ID の長さ (<数>) が 1 から <数> の範囲外です。
08001 | パスワードの長さ (<値>) が 1 から <数> の範囲外です。
08001 | ユーザー ID を NULL にすることはできません。
08001 | パスワードを NULL にすることはできません。
08001 | データベース名 '<データベース名>' がネットワーク・プロトコルにより許可される最大長を超えているため、接続を確立できませんでした。
08003 | 現行接続なし。
08003 | クローズされた PooledConnection に対する getConnection() は無効です。
08003 | 接続のクローズ後に LOB メソッドが呼び出されました。
08003 | 基礎となる物理接続が失効しているかクローズされています。
08004 | 接続が拒否されました: <接続名>
08004 | 接続認証の障害が発生しました。 理由: <理由の説明>。
08004 | データベース <データベース名> が検出されなかったため接続は拒否されました。
08004 | データベース接続が拒否されました。
08004 | User '<認証ID>' cannot shut down database '<データベース名>'. Only the database owner can perform this operation.
08004 | User '<認証ID>' cannot (re)encrypt database '<データベース名>'. Only the database owner can perform this operation.
08004 | User '<認証ID>' cannot hard upgrade database '<データベース名>'. Only the database owner can perform this operation.
08006 | 接続のリセット中にエラーが発生し、接続が終了されました。 詳細については、付随する例外を参照してください。
08006 | データベース '<データベース名>' がシャットダウンされました。

表 42. 分類 0A: サポート外の機能

SQLSTATE | 文言
0A000 | フィーチャーはインプリメントされていません: <機能名>。
0A000 | DRDA コマンド <コマンド名> は現在インプリメントされていません。 接続は終了されました。
0A000 | JDBC メソッドはまだインプリメントされていません。
0A000 | JDBC メソッド <メソッド名> はサーバーでサポートされていません。 サーバーをアップグレードしてください。
0A000 | resultSetHoldability プロパティー <属性名> はサポートされていません。
0A000 | cancel() はサーバーでサポートされていません。
0A000 | セキュリティー・メカニズム '<メカニズム名>' はサポートされていません。
0A000 | データ型 '<データ型名>' はサポートされていません。

表 43. 分類 21: 基数の違反

SQLSTATE | 文言
21000 | スカラー副照会は、単一行しか戻せません。

表 44. 分類 22: データ例外

SQLSTATE | 文言
22001 | <値> '<値>' を長さ <値> に縮小しようとして、切り捨てエラーが発生しました。
22003 | 結果値は、データ型 <データ型名> の範囲外です。
22003 | 年 (<値>) が最大の '<値>' を超えています。
22003 | 使用可能な 10 進数は、31 桁までです。
22003 | '<データ型名>' から <データ型名> への数値データ型変換中にオーバーフローが発生しました。
22004 | 長さ (<数>) が、このデータ型の最大長 (<データ型名>) を超えています。
22005 | 型 '<型名>' の値を型 '<型名>' に変換することはできません。このエンコードはサポートされていません。
22005 | 必要な文字コンバーターを使用できません。
22005 | Unicode ストリングを EBCDIC ストリングに変換することはできません。
22005 | 認識されない JDBC 型です。 型: <型名>、columnCount: <値>、columnIndex: <値>。
22005 | パラメーター <パラメータ名> に対して無効な JDBC 型です。
22005 | 認識されない Java SQL 型 <データ型名> です。
22005 | 型 '<データ型名>' のデータ値から型 '<データ型名>' のデータ値を取得しようとしました。
22007 | 日時値のストリング表記が範囲外です。
22007 | 日時値のストリング表記の構文が正しくありません。
22008 | '<引数>' は <関数名> 関数に対して無効な引数です。
2200L | XML 列に割り当てる値は、整形式 DOCUMENT ノードである必要があります。
2200M | 無効な XML DOCUMENT: <構文解析器のエラー>
2200V | <演算子名> 演算子に対して無効なコンテキスト項目です。コンテキスト項目は整形式 DOCUMENT ノードである必要があります。
2200W | XQuery シリアライゼーション・エラー: 1 つ以上の最上位属性ノードのシリアライズを試行しました。
22011 | SUBSTR 関数の 2 番目または 3 番目の引数が範囲外です。
22012 | ゼロ除算を試行しています。
22013 | 負の数値 '<値>' の平方根を取ろうとしています。
22014 | LOCATE の開始位置が無効です。この位置は正の整数にする必要があります。 検索を開始する索引は '<検索文字列>' です。 検索するストリングは '<元となる文字列>' です。 ストリングの検索元は '<開始位置>' です。
22015 | 無効なデータ変換です。要求された変換を行うと、<値>の精度が失われます。
22015 | '<関数名>' 関数は、次の型のセットでは許可されません。 第 1 オペランドは型 '<型名>' です。 第 2 オペランドは型 '<型名>' です。 第 3 オペランド (開始位置) は型 '<型名>' です。
22018 | 型 <型名> に対して無効な文字ストリング・フォーマットです。
22019 | 無効なエスケープ・シーケンスです: <シーケンス名>。 エスケープ・ストリングは、1 文字にする必要があります。 NULL でも 2 文字以上でもいけません。
22020 | Invalid trim string, '<文字列>'. The trim string must be exactly one character or NULL. It cannot be more than one character.
22025 | エスケープ文字の後にはエスケープ文字 ''_'' または ''%'' が必要です。 エスケープ文字の後にこれ以外の文字を続けたり、エスケープ文字をパターンの終わりに指定することはできません。
22027 | 組み込み TRIM() 関数は、単一トリム文字のみをサポートします。 LTRIM() および RTRIM() 組み込み関数は複数のトリム文字をサポートします。
22028 | ストリングが最大長である <数> を超えています。
22501 | NULL の ESCAPE 文節は未定義の結果を戻すため、許可されていません。

表 45. 分類 23: 制約違反

SQLSTATE | 文言
23502 | 列 '<列名> は NULL 値を受け入れられません。
23503 | 表 '<表名>' 上の <値>' が原因で、キー <キー名> の外部キー制約 '<制約名>' 違反が発生しました。 ステートメントはロールバックされました。
23505 | このステートメントは、ユニークまたは主キー制約、または '<値>' 上で定義された '<値>' によって識別されるユニーク索引において重複キー値の原因となる可能性があったため、打ち切られました。
23513 | 表 '<表名>' で INSERT または UPDATE を実行しているときにチェック制約 '<制約名>' の違反が発生しました。

表 46. 分類 24: 無効な状態のカーソル

SQLSTATE | 文言
24000 | 無効なカーソル状態 - 現在行がありません。
24501 | 指定されたカーソルがオープンされていません。

表 47. Class 25: 無効な状態のトランザクション

SQLSTATE | 文言
25000 | 無効なトランザクション状態です。
25001 | トランザクションがまだアクティブなときに接続をクローズすることはできません。
25501 | アクティブ・トランザクションに接続読み取り専用プロパティーを設定できません。
25502 | 読み取り専用接続、ユーザー、またはデータベースに対する、SQL データ変更は許可されていません。
25503 | 読み取り専用接続、ユーザー、またはデータベースに対する DDL は許可されていません。
25505 | 読み取り専用ユーザーまたは読み取り専用データベースのユーザーは、接続に対する読み取り専用モードを使用不可にすることはできません。

表 48. 分類 28: 無効な権限設定

SQLSTATE | 文言
28502 | ユーザー名 ''<認証識別子>'' は無効です。

表 49. Class 2D: 無効なトランザクションの終了

SQLSTATE | 文言
2D521 | setAutoCommit(true) は、グローバル・トランザクションの間は無効です。
2D521 | アプリケーション実行環境では COMMIT または ROLLBACK は無効です。

表 50. 分類 38: 外部関数の例外

SQLSTATE | 文言
38000 | 式を評価している間に例外 '<例外>' がスローされました。
38001 | 外部ルーチンは SQL ステートメントは実行できません。
38002 | ルーチンがデータを変更しようとしましたが、そのルーチンは MODIFIES SQL DATA として定義されていませんでした。
38004 | ルーチンがデータを読み取ろうとしましたが、そのルーチンは READS SQL DATA として定義されていませんでした。

表 51. 分類 39: 外部ルーチン呼び出しの例外

SQLSTATE | 文言
39004 | プリミティブ型 '<型>' のパラメーターを取るメソッドに NULL 値を渡すことはできません。

表 52. 分類 3B: 無効なSAVEPOINT

SQLSTATE | 文言
3B001 | SAVEPOINT、<SAVEPOINT名> が存在しないか、または、現行トランザクションでアクティブでありません。
3B002 | セーブポイントの最大数に到達しました。
3B501 | パスされた名前の SAVEPOINT はすでに現行トランザクションに存在します。
3B502 | RELEASE または ROLLBACK TO SAVEPOINT が指定されましたが、セーブポイントが存在しません。

表 53. 分類 40: トランザクションのロールバック

SQLSTATE | 文言
40001 | デッドロックが原因でロックを獲得できませんでした。ロックと待機のサイクル:\n<ロックサイクル>。 キャンセル対象としてデータベース・エンジンによって選択されたステートメントの XID : <トランザクション識別子>。
40XC0 | 非活動ステートメント。 原因として、このステートメント内でトランザクション重大度エラーをキャッチしたことが考えられます。
40XD0 | コンテナーがクローズされました。
40XD1 | コンテナーが読み取り専用モードでオープンされました。
40XD2 | コンテナー <コンテナ名> をオープンできません。ドロップされたか、存在しません。
40XL1 | 要求時間内にロックを獲得できませんでした
40XL2 | 要求時間内にロックを獲得できませんでした。 lockTable ダンプ: <表のダンプ>
40XT0 | RawStore モジュールで内部エラーが確認されました。
40XT1 | トランザクションのコミット中に例外がスローされました。
40XT2 | SAVEPOINT のロールバック中に例外がスローされました。
40XT4 | まだアクティブなトランザクションをクローズしようとしました。 トランザクションはアボートされました。
40XT5 | 内部トランザクション中に例外がスローされました。
40XT6 | データベースは静止状態です。トランザクションを活動化できません。 静止状態が終わるまでしばらくお待ちください。
40XT7 | オペレーションは内部トランザクションではサポートされていません。

表 54. 分類 42: 構文エラーまたはアクセス規則違反

SQLSTATE | 文言
42000 | 構文エラーまたはアクセス規則違反。詳しくは追加エラーを参照してください。
42500 | ユーザー '<認証ID>' は、表 '<スキーマ名>'.'<表名>' に対する <許可種類> 許可を与えられていません。
42501 | ユーザー '<認証ID>' は、表 '<スキーマ名>'.'<表名>'に対する GRANT ステートメントの <許可種類> 許可を与えられていません。
42502 | ユーザー '<認証ID>' は、表 '<スキーマ名>'.'<表名>' の列 '<列名>' に対する <許可種類> 許可を与えられていません。
42503 | ユーザー '<認証ID>' は、表 '<スキーマ名>'.'<表名>' の列 '<列名>' に対する GRANT ステートメントの <許可種類> 許可を与えられていません。
42504 | ユーザー '<認証ID>' は、<オブジェクト名> '<スキーマ名>'.'<表名>' に対する実行権限を与えられていません。
42505 | ユーザー '<認証ID>' は、<オブジェクト名> '<スキーマ名>'.'<表名>' に対する GRANT ステートメントの実行権限を与えられていません。
42506 | ユーザー '<認証ID>' は <オブジェクト名> '<スキーマ名>'.'<表名>' の所有者ではありません。
42507 | ユーザー '<認証ID>' は、スキーマ '<スキーマ名>' でオペレーションを実行できません。
42508 | ユーザー '<認証ID>' は、スキーマ '<スキーマ名>' を作成できません。 データベース所有者のみがこのステートメントを実行できます。
42509 | 指定された付与オペレーションまたは取り消しオペレーションは、オブジェクト '<オブジェクト名>' に対して許可されません。
4250A | ユーザー '<認証ID>' は、オブジェクト '<スキーマ名>'.'<オブジェクト名>' に対する <許可名> 許可を与えられていません。
4250B | 無効なデータベース許可プロパティー '<値>=<値>'。
4250C | ユーザー '<認証ID>' を、読み取り専用許可リストとフル・アクセス許可リストの両方に入れることはできません。
4250D | アクセス・リスト '<リスト名>' で反復されたユーザー '<認証ID>'。
4250E | 内部エラー: ステートメント許可リスト内に無効な <認証ID> ID が存在します。
42X24 | Column <columnName> is referenced in the HAVING clause but is not in the GROUP BY list.
42X25 | '<関数名>' 関数は、'<1>' 型では許可されません。
42X26 | 列 '<列名>' に対するクラス '<クラス名>' は存在しないか、アクセス不能です。 これは、このクラスが public でない場合に発生することがあります。
42X28 | 削除表 '<表名>' はカーソル '<カーソル名>' のターゲットではありません。
42X29 | 更新表 '<表名>' はカーソル '<カーソル名>' のターゲットではありません。
42X30 | カーソル '<カーソル名>' が見つかりません。 自動コミットがオフになっていることを確認してください。
42X31 | 列 '<列名>' はカーソル '<カーソル名>' の FOR UPDATE リストにありません。
42X32 | 派生列リストの列数は、表 '<表名>' の列数と一致している必要があります。
42X33 | 派生列リストに、重複する列名 '<列名>' があります。
42X34 | 選択リストに ? パラメーターがあります。 これは許可されません。
42X35 | '<値>' の両方のオペランドを ? パラメーターにすることはできません。
42X36 | '<演算子>' 演算子は、? パラメーターをオペランドとして取ることはできません。
42X37 | 単項 '<演算子>' 演算子は、'<型>' 型では許可されません。
42X38 | 'SELECT *' は、EXISTS および NOT EXISTS 副照会でのみ許可されます。
42X39 | 副照会は、単一列を戻すことしか許可されません。
42X40 | NOT ステートメントがブールでないオペランドを持っています。 NOT のオペランドは、TRUE、FALSE、または UNKNOWN として評価する必要があります。
42X41 | FROM リストのプロパティー文節ではプロパティー '<プロパティー 名>' は無効です (このプロパティーは '<値>' に設定されていました)。
42X42 | 列 '<列名>' は FOR UPDATE リストの一部であるため、その列に対する相関名は許可されません。
42X43 | クラス/オブジェクト '<クラス名>' に対して戻された ResultSetMetaData が NULL でした。 このクラスを外部仮想表として使用するためには、ResultSetMetaData を NULL にすることはできません。
42X44 | 列仕様に無効な長さ '<数>' が指定されています。
42X45 | <型> は <値> の引数番号 <値> に対して無効な型です。
42X46 | '<関数名>' という名前の関数が複数存在します。 完全なシグニチャーか固有の名前を使用してください。
42X47 | '<手続名>' という名前のプロシージャーが複数存在します。 完全なシグニチャーか固有の名前を使用してください。
42X48 | 値 '<値>' は <値> の有効な精度ではありません。
42X49 | 値 '<値>' は有効な整数リテラルではありません。
42X50 | メソッドの呼び出し <メソッド名>.<値>(<値>) に一致するメソッドが見つかりませんでした。オブジェクト型とプリミティブ型のすべての組み合わせと、このメソッド呼び出しが持つ可能性のあるパラメーターに可能な型変換をすべて試しましたが、見つかりませんでした。 このメソッドは存在するが public および (または) 静的でないか、あるいはパラメーター型がメソッド起動変換可能でない可能性があります。
42X51 | クラス '<クラス名>' は存在しないか、アクセス不能です。 これは、このクラスが public でない場合に発生することがあります。
42X52 | Java プリミティブ型 '<型>' の受信側を使ってメソッド ('<メソッド名>') を呼び出すことは許可されていません。
42X53 | LIKE 述部は、''CHAR'' または ''VARCHAR'' オペランドしか持つことができません。 型 '<型>' は許可されません。
42X54 | Java メソッド '<メソッド名>' は受信側として ? を持っています。 これは許可されません。
42X55 | 表名 '<表名>' は '<値>' と同じにする必要があります。
42X56 | ビュー列リスト内の列数が、''{0}'' のビュー定義にある、基本となる照会式の列数と一致しません。
42X57 | 外部仮想表 '<表名>' の getColumnCount() が無効な値 '<値>' を戻しました。 有効値は 1 以上です。
42X58 | <表名>の左側の列と右側の列の数は同じにする必要があります。
42X59 | 各 VALUES コンストラクターの列の数は同じにする必要があります。
42X60 | 表 '<表名>' の insertMode プロパティーに無効値 '<値>' が指定されました。
42X61 | 型 '<型>' と '<型>' は <値> と互換性がありません。
42X62 | '<値>' は '<スキーマ名>' スキーマでは許可されません。
42X63 | USING 文節が結果を戻しませんでした。 パラメーターを設定できません。
42X64 | プロパティー・リストで、useStatistics プロパティーに無効な値 '<値>' が指定されました。 有効な値は TRUE または FALSE のみです。
42X65 | 索引 '<索引>' は存在しません。
42X66 | 列名 '<列名>' は、CREATE INDEX ステートメントで複数回使用されています。
42X68 | クラス '<クラス名>' に属するフィールド '<フィールド名>' が見つかりません。 このフィールドは存在するが public でないか、またはクラスが存在しないか、クラスが public でない可能性があります。
42X69 | Java プリミティブ型 '<型>' の参照式を使ってフィールド ('<フィールド名>') を参照することは許可されていません。
42X70 | The number of columns in the table column list does not match the number of columns in the underlying query expression in the table definition for '<値gt;'.
42X71 | Invalid data type '<データ型名>' for column '<列名>'.
42X72 | クラス ''{1}'' に属する静的フィールド '<フィールド名>' が見つかりません。 このフィールドは存在するが public および (または) 静的でないか、またはクラスが存在しないか、クラスが public でない可能性があります。
42X73 | シグニチャー <値>.<値>(<値>) のメソッド解決が未確定でした。 (最大限に特定の単一メソッドはありません。)
42X74 | 無効な CALL ステートメント構文。
42X75 | シグニチャー <値>(<値>) を持つコンストラクターが見つかりません。 パラメーターの型がメソッド起動変換可能でない可能性があります。
42X76 | 追加されている主キーの少なくとも 1 つの列 '<列名>' が NULL 可能です。 主キー列はどれも NULL 可能にすることはできません。
42X77 | 列位置 '<列位置>' は照会式の範囲外です。
42X78 | 列 '<列名>' が照会式の結果にありません。
42X79 | 列名 '<列名>' は、照会式の結果に複数回使用されています。
42X80 | VALUES 文節には少なくとも 1 つのエレメントが含まれている必要があります。 空のエレメントは許可されません。
42X82 | USING 文節が複数の行を戻しました。 単一行の ResultSet のみが許可されます。
42X83 | 列 '<列名>' 上の制約は、NULL 可能であり、なおかつ NULL 可能でない必要があります。
42X84 | 制約 '<制約名>' を強制するために索引 '<索引>' が作成されました。 この索引をドロップする唯一の方法は、この制約をドロップすることです。
42X85 | 制約 '<制約名>' は、表 '<表名>' と同じスキーマにある必要があります。
42X86 | ALTER TABLE は失敗しました。 表 '<表名>' に制約 '<制約名>' がありません。
42X87 | '<式>' 式の少なくとも 1 つの結果式 (THEN または ELSE) は ''?'' 以外である必要があります。
42X88 | 条件が非ブール・オペランドを持っています。 条件のオペランドは、TRUE、FALSE、または UNKNOWN として評価する必要があります。
42X89 | 型 '<型>' と '<型>' は、互換性のある型ではありません。 どちらの型ももう一方の型に割り当てできません。
42X90 | 表 '<表名>' に対して複数の主キー制約が指定されています。
42X91 | 制約名 '<制約名>' は、CREATE TABLE ステートメントで複数回使用されています。
42X92 | 列名 '<列名>' は、制約の列リストで複数回使用されています。
42X93 | 表 '<表名>' には、この表にない列 '<列名>' を持つ制約定義が含まれています。
42X94 | <値> '<値>' は存在しません。
42X96 | データベース・クラスパスに不明な jar ファイル '<ファイル名>' が含まれています。
42X98 | ビュー定義では、パラメーターは許可されません。
42X99 | Parameters are not allowed in a TABLE definition.
42Y00 | クラス '<クラス名>' は、org.apache.derby.iapi.db.AggregateDefinition をインプリメントしていないため、集合体式として使用できません。
42Y01 | 制約 '<制約名>' は無効です。
42Y03 | '<文>' は関数またはプロシージャーとして認識されません。
42Y04 | ピリオドで分離されたリストでないため、EXTERNAL NAME '<名前>' でプロシージャーまたは関数を作成できません。 予期されているフォーマットは <full java path>.<method name> です。
42Y05 | '<キー>' という名前の外部キーはありません。
42Y07 | スキーマ '<スキーマ名>' は存在しません
42Y08 | 外部キー制約は、システム表では許可されていません。
42Y09 | void メソッドは、CALL ステートメント内でのみ許可されます。
42Y10 | INSERT ステートメントにない表コンストラクターが、列の 1 つにすべて ? のパラメーターを持っています。 各列ごとに、少なくとも 1 つの行がパラメーター以外の値を持っている必要があります。
42Y11 | '<文節名>' 文節には、結合仕様が必要です。
42Y12 | JOIN の ON 文節が '<式の種類>' 式です。 これはブール式にする必要があります。
42Y13 | 列名 '<列名>' は、CREATE VIEW ステートメントで複数回使用されています。
42Y16 | public の静的メソッド '<メソッド名>' がクラス '<クラス名>' に見つかりません。 このメソッドは存在する可能性がありますが、public でないか、静的でない可能性があります。
42Y22 | 集合体 <集約の種類> は、型 <型> に対して操作できません。
42Y23 | 列 <列名> に対して誤った JDBC 型情報が戻されました。
42Y24 | 表示 '<ビュー名>' は、更新不能です。 (ビューは現在更新不能です。)
42Y25 | '<表名>' はシステム表です。 ユーザーがこの表の内容を変更することは許可されていません。
42Y26 | 集合体は GROUP BY リストでは許可されません。
42Y27 | パラメーターは、トリガー・アクションでは許可されません。
42Y29 | グループ化されていない照会の SELECT リストに、少なくとも 1 つの無効な式があります。 SELECT リストに少なくとも 1 つの集合体が含まれている場合は、すべてのエントリーが有効な集合体式である必要があります。
42Y30 | グループ化された照会の SELECT リストに、少なくとも 1 つの無効な式があります。 SELECT リストに GROUP BY がある場合、リストには有効なグループ化式と有効な集合体式しか含むことができません。
42Y32 | 型 {2} に対する集合体 ''{1}'' の Aggregator クラス ''{0}'' は、com.ibm.db2j.aggregates.Aggregator をインプリメントしていません。
42Y33 | 集合体 <集合体名> には、1 つ以上の集合体が含まれています。
42Y34 | 列名 '<列名>' は、表 '<表名>' 内の複数の結果列に一致します。
42Y35 | 列参照 '<参照>' は無効です。 SELECT リストに少なくとも 1 つの集合体が含まれている場合は、すべてのエントリーが有効な集合体式である必要があります。
42Y36 | 列参照 '<参照>' は無効です。 GROUP BY を持つ SELECT リストの場合、リストには有効なグループ化式と有効な集合体式しか含むことができません。
42Y37 | '<値>' は Java プリミティブであり、この演算子と一緒に使用することはできません。
42Y38 | insertMode = replace は、ターゲット表 '<表名>' が SELECT で参照されている場所での挿入では許可されません。
42Y39 | '<値>' は、非 deterministic 結果を戻す可能性があるので、CHECK CONSTRAINT 定義に現れない可能性があります。
42Y40 | '<値>' は、トリガー '<トリガ名>' の UPDATE OF 列リストに複数回現れます。
42Y41 | '<値>' はトリガーの一部なので、EXECUTE STATEMENT を使って直接呼び出すことはできません。
42Y42 | 目盛り '<目盛りの値>' は、<値> に有効な目盛りではありません。
42Y43 | 目盛り '<目盛りの値>' は、'<精度>' の精度に有効な目盛りではありません。
42Y44 | FROM リストのプロパティー・リストに無効なキー '<キー>' が指定されました。 現在サポートされているキー (大/小文字の区別あり) は '<キー>' です。
42Y45 | VTI '<値>' は特殊トリガー VTI であり、このステートメントはトリガー・アクションまたは WHEN 文節の一部でないため、バインドすることはできません。
42Y46 | FROM リストに無効なプロパティー・リスト。 表 '<表名>' に索引 '<索引>' がありません。
42Y48 | "FROM リストに無効なプロパティー・リスト。 名前付き制約 '<制約名>' が表 '<表名>' 上にないか、または制約がバッキング索引を持っていません。
42Y49 | プロパティー・キー '<キー>' に複数の値が指定されています。
42Y50 | 表 '<表名>' のプロパティー・リストには、索引の値または制約の値を入れることができますが、その両方を入れることはできません。
42Y55 | '<値>' は存在しないため、これに対して '<値>' を実行することはできません。
42Y56 | 表 '<表名>' のプロパティー・リストに無効な結合ストラテジー '<ストラテジーの値>' が指定されました。 結合ストラテジーに対して現在サポートされている値: ''hash'' および ''nestedloop''。
42Y58 | 値 '<値>' をオプティマイザー・オーバーライド '<値>' 用に変換しているときに NumberFormatException が発生しました。
42Y59 | hashInitialCapacity オーバーライドに対して無効な値 '<値>' が指定されました。 値は 0 より大きくする必要があります。
42Y60 | hashLoadFactor オーバーライドに対して無効な値 '<値>' が指定されました。 値は、0.0 より大きく、1.0 以下にする必要があります。
42Y61 | hashMaxCapacity オーバーライドに対して無効な値 '<値>' が指定されました。 値は 0 より大きくする必要があります。
42Y62 | ビューであるため、'<ビュー名>' 上での '<文>' は許可されません。
42Y63 | ハッシュ結合には、選択された索引またはヒープ内の列に最適化可能な等価結合述部が必要です。 表または索引 '<索引>' 内のどの列にも、最適化可能な等価結合述部が存在しません。 ''index'' オプティマイザー・オーバーライドを使って、表 '<表名>' にそのような索引またはヒープを指定してください。
42Y64 | '<値>' の bulkFetch 値が無効です。 bulkFetch の最小値は 1 です。
42Y65 | bulkFetch は、'<結合の種類>' 結合では許可されません。
42Y66 | bulkFetch は更新可能なカーソルでは許可されません。
42Y67 | スキーマ '<スキーマ名>' はドロップできません。
42Y69 | このステートメントに対する有効な実行プランが見つかりませんでした。 この原因として次の 2 つのうちの 1 つが考えられます。ハッシュ結合が許可されていないときにハッシュ結合ストラテジーを指定した (最適化可能な等価結合がない)。または、それぞれがお互いを参照しているためにステートメントを評価することのできない、2 つの外部仮想表を結合しようとしている。
42Y70 | ユーザーが正しくない結合順序を指定しました。 この原因として、内部表からの結合列が、パラメーターとして外部仮想表に渡されたことが考えられます。
42Y71 | システム関数およびプロシージャー '<手続名>' をドロップできません。
42Y82 | システム生成の保管された準備済みステートメント '<文>' は、DROP STATEMENT を使ってドロップできません。 これはトリガーの一部です。
42Y83 | 型のない NULL は、集合体 <集合体名> の引数として許可されません。 NULL を適切な型にキャストしてください。
42Y84 | '<値>' は DEFAULT 定義に指定できません。
42Y85 | DEFAULT キーワードは、VALUES 文節が INSERT ステートメント内にあるときにその VALUES 文節でのみ許可されます。
42Y90 | FOR UPDATE は、この型のステートメントでは許可されません。
42Y91 | USING 文節は、トリガー・アクションの EXECUTE STATEMENT では許可されません。
42Y92 | <トリガ名> トリガーは、<値> 遷移変数/表しか参照できません。
42Y93 | 不正な REFERENCING 文節: 遷移変数/表の各タイプごとに 1 つの名前しか許可されません。
42Y94 | AND または OR が非ブール・オペランドを持っています。 AND および OR のオペランドは、TRUE、FALSE、または UNKNOWN として評価する必要があります。
42Y95 | 左のオペランド型 '<オペランド型>' と右のオペランド型 '<オペランド型>' を持つ '<演算子名>' 演算子はサポートされていません。
42Y97 | 行 ''<行番号>'、列 '<列名>' に無効なエスケープ文字。
42Z02 | ここでは、複数の DISTINCT 集合体はサポートされていません。
42Z07 | 集合体は ON 文節では許可されません。
42Z08 | '<値>' は使用可能なトリガー (<値>) を持っているため、これに対するバルク挿入置換は許可されません。
42Z15 | 列 '<列名>' に対して無効な型が指定されました。 列の型は変更できません。
42Z16 | 型 VARCHAR の列のみ変更された長さを持つ可能性があります。
42Z17 | 列 '<列名>' に対して無効な長さが指定されました。 長さは、現行の列の長さよりも長くする必要があります。
42Z18 | 列 '<列名>' は、外部キー制約 '<制約名>' の一部です。 この列の長さを変更するには、まず制約をドロップし、ALTER TABLE を実行してから、制約を再作成してください。
42Z19 | 列 '<列名>' は少なくとも 1 つの外部キー制約 '<制約名>' により参照されています。 この列の長さを変更するには、まず参照制約をドロップし、ALTER TABLE を実行してから、制約を再作成してください。
42Z20 | 列 '<列名>' を NULL 可能にすることはできません。 これは主キーまたはユニーク制約の一部であり、NULL 可能列を持つことはできません。
42Z21 | 列 '<列名>' の ID に対して無効な増分が指定されました。 増分はゼロにできません。
42Z22 | ID 列 '<列名>' に対して無効な型が指定されました。 ID 列に有効な型は、BIGINT、INT および SMALLINT のみです。
42Z23 | ID 列 '<列名>' を変更しようとしました。
42Z24 | 表 '<表名>' の列 '<列名>' に対する ID 値 にオーバーフローが発生しました。
42Z25 | 内部エラー ID カウンター。 現行値 \= NULL のときに、引数なしで更新が呼び出されました。
42Z26 | ID デフォルトを持つ列 '<列名>' は NULL 可能 にできません。
42Z27 | NULL 可能列 '<列名>' を、ID デフォルトを持つように変更することはできません。
42Z50 | 内部エラー: <値> のコードを生成できません。
42Z53 | 内部エラー: ノード選択 <値> に対して生成する Activation のタイプが不明です。
42Z60 | <値> は、データベース・プロパティー <プロパティ名> の値が '<値>' でない場合は許可されません。
42Z70 | XML 値への直接の結合は許可されません。XMLPARSE の使用を試みてください。
42Z71 | 最上位結果セットでは XML 値は許可されません。XMLSERIALIZE の使用を試みてください。
42Z72 | SQL/XML キーワード '<キーワード>' が行 <行番号>、列 <列番号> にありません。
42Z73 | XMLSERIALIZE に無効なターゲット・タイプ: '<タイプの名前>'。
42Z74 | XML フィーチャーはサポートされていません: '<フィーチャー名>'。
42Z75 | XML 照会式は、ストリング・リテラルである必要があります。
42Z76 | 複数の XML コンテキスト項目は許可されません。
42Z77 | コンテキスト項目は ''XML'' 型である必要があります。'<値>' は許可されません。
42Z79 | XMLPARSE のパラメーター型を判別できません。CAST を使用してみてください。
42Z90 | クラス '<クラス名>' は、更新可能な ResultSet を戻しません。
42Z91 | 副照会
42Z92 | 反復可能読み取り
42Z93 | 制約 '<制約名>' と '<制約名>' は同じ列セットを持っていますが、これは許可されません。
42Z97 | 列 '<列名>' を名前変更するとチェック制約 '<制約名>' に違反します。
42Z99 | ストリングまたは 16 進数リテラルは、64K を超えることはできません。
42Z9A | コミットされていない読み取り
42Z9B | 外部仮想表インターフェースは、BLOB または CLOB 列をサポートしません。 '<値>' の列 '<値>'。
42Z9D | BEFORE トリガーでは、SQL データを変更するプロシージャーを使用できません。
42Z9D | '<文>' ステートメントは '<トリガ名>' トリガーでは許可されません。
42Z9E | 制約 '<制約名>' は、<値> 制約ではありません。
42Z9F | 表 <表名> に指定された索引 (<索引>) が多すぎます。 制限は <数> です。
42ZA0 | ステートメントが複雑すぎます。 複雑さを軽減するよう照会を書き直してください。 重複する多数の式を除去するか、照会を分割して一時的な結果を一時表に格納することにより、多くの場合このエラーを解決できます。
42ZA1 | バッチ内に無効な SQL が存在します: '<バッチ>'。
42ZA2 | Operand of LIKE predicate with type <型> and collation <値> is not compatable with LIKE pattern operand with type <型> and collation <値>.
42ZA3 | The table will have collation type <型> which is different than the collation of the schema <型> hence this operation is not supported .

表 55. 分類 57: DRDA ネットワークプロトコル: 実行失敗

SQLSTATE | 文言
57017 | ソース・コード・ページ <コードページ> からターゲット・コード・ページ <コードページ> への変換は使用できません。 接続は終了されました。

表 56. 分類 58: DRDA ネットワークプロトコル: プロトコルエラー

SQLSTATE | 文言
58009 | ネットワーク・プロトコル例外: VCM、VCS の長さのうち 0 より大きくできるのは 1 つのみです。 接続は終了されました。
58009 | サポートされていないエンコード方式であるため接続が終了されました。
58009 | ネットワーク・プロトコル例外: 実際のコード・ポイント <値> が予期されていたコード・ポイント <値> と一致しません。 接続は終了されました。
58009 | ネットワーク・プロトコル例外: DDM コレクションに含まれているデータが 4 バイト未満です。 接続は終了されました。
58009 | ネットワーク・プロトコル例外: 同一の ID チェーンの解析終了時に、コレクション・スタックが空ではありませんでした。 接続は終了されました。
58009 | ネットワーク・プロトコル例外: 同一の ID チェーンの解析終了時に、DSS の長さが 0 ではありませんでした。 接続は終了されました。
58009 | ネットワーク・プロトコル例外: DSS チェーンの次のセグメントが、現行のセグメントと同じ ID 番号 です。接続は終了されました。
58009 | ネットワーク・プロトコル例外: InputStream (パラメーター #<値>) の読み取り中に予期せずストリームの終端に達しました。 接続は終了されました。
58009 | ネットワーク・プロトコル例外: 無効な FDOCA LID です。 接続は終了されました。
58009 | ネットワーク・プロトコル例外: SECTKN が戻されませんでした。 接続は終了されました。
58009 | ネットワーク・プロトコル例外: NVCM、NVCS のうち非ヌルにできるのは 1 つのみです。 接続は終了されました。
58009 | ネットワーク・プロトコル例外: SCLDTA の長さ <長さ> は RDBNAM に対して無効です。 接続は終了されました。
58009 | SocketException: '<エラー>'
58009 | 通信エラーが検出されました: <エラー>。
58009 | 据え置き接続のリセット中にエラーが発生し、接続が終了されました。 詳細については、付随する例外を参照してください。
58009 | ネットワークから読み取り中のデータが不十分です。<数> バイト以上のデータを予期していましたが受信したデータは <数> バイトのみでした。 接続は終了されました。
58009 | JVM に対して大きすぎる LOB データを完全にマテリアライズしようとしました。 接続は終了されました。
58009 | ネットワーク・プロトコル例外: SCLDTA の長さ <長さ> は RDBNAM に対して無効です。 接続は終了されました。
58009 | ネットワーク・プロトコル例外: SCLDTA の長さ <長さ> は PKGID に対して無効です。 接続は終了されました。
58009 | ネットワーク・プロトコル例外: PKGNAMCSN の長さ <長さ> は SQLAM <長さ> では無効です。 接続は終了されました。
58009 | ネットワーク・プロトコル・エラーが発生し、接続が終了されました: <エラー>
58010 | ネットワーク・プロトコル・エラーが発生しました。 レベル <値> のマネージャー <値> はサーバーによりサポートされないため、接続を確立できませんでした。
58014 | DDM コマンド 0x<値> はサポートされていません。 接続は終了されました。
58015 | DDM オブジェクト 0x<値> はサポートされていません。 接続は終了されました。
58016 | DDM パラメーター 0x<値> はサポートされていません。 接続は終了されました。
58017 | DDM パラメーター値 0x<値> はサポートされていません。 入力されたホスト変数は、サーバーがサポートする範囲内でない可能性があります。 接続は終了されました。

表 57. 分類 X0: 実行例外

SQLSTATE | 文言
X0A00 | 選択リストに、列 '<列名>' が 2 回記述されています。 GROUP BY 文節または HAVING 文節を持つ照会では、これは許可されません。 競合する列の 1 つに固有の名前を別名として割り当ててください。
X0X02 | 表 '<表名>' は '<モード> モードにロックできません。
X0X03 | 無効なトランザクション状態です。保留カーソルには同じ分離レベルが必要です。
X0X05 | 表またはビュー '<表名>' は存在しません。
X0X07 | JAR ファイル '<ファイル名>' は derby.database.classpath '<ファイル名>' にあるため除去できません。
X0X0E | 自動生成列の選択配列にリストされた列位置 '<列位置>' が挿入表に見つかりませんでした。
X0X0F | Column name '<columnName>' listed in auto-generated column selection array not found in the insert table.
X0X10 | USING 文節が複数の行を戻しました。単一行の ResultSets のみが許可されます。
X0X11 | USING 文節が結果を戻さなかったため、パラメーターを設定できません。
X0X13 | スキーマ '<スキーマ名>' に JAR ファイル '<ファイル名>' が存在しません。
X0X57 | 型 '<型>' の Java 値を SQL 値に入れようとしましたが、対応する SQL 型がありません。 この Java 値は、おそらくメソッド呼び出しまたはフィールド・アクセスの結果です。
X0X60 | '<カーソル名>' という名前のカーソルはすでに存在します。
X0X61 | 索引 '<列名>' と表 '<索引名>.<スキーマ名>' の列 '<位置>' に対する値が行ロケーション '<表名>' で一致しません。 索引の値は '<値>' ですが、基本表の値は '<値>' です。 行ロケーションを含む、完全索引キーは '<索引キー>' です。 訂正処置として、索引の再作成をお勧めします。
X0X62 | 表 '<表名>' と索引 '<索引名>' の間に不整合が見つかりました。 表から行ロケーション '<行位置>' を検索しようとしたときにエラーが発生しました。 行ロケーションを含む、完全索引キーは '<索引キー>' です。 訂正処置として、索引の再作成をお勧めします。
X0X63 | IOException '<値>' を受け取りました。
X0X67 | 型 '<型>' の列は、その型に対する比較がサポートされていないため、CREATE INDEX、ORDER BY、GROUP BY、UNION、INTERSECT、EXCEPT または DISTINCT ステートメントでは使用できません。
X0X81 | <値> '<値>' は存在しません。
X0X85 | '<索引型>' は有効な索引型ではないため、索引 '<索引名>' が作成されませんでした。
X0X86 | 0 は、ResultSet.absolute(int row) に対して無効なパラメーターです。
X0X87 | カーソルが行に位置付けられていない場合、ResultSet.relative(int row) を呼び出すことはできません。
X0X95 | オブジェクト '<オブジェクト名>' においてオペレーション '<オペレーション名>' を実行することはできません。そのオブジェクトに従属するオープンされている ResultSet があります。
X0X99 | 索引 '<索引名>' は存在しません。
X0Y16 | '<値>' はビューではありません。 表の場合は、代わりに DROP TABLE を使用してください。
X0Y23 | オブジェクト '<オブジェクト名>' においてオペレーション '<オペレーション名>' を実行できません。VIEW '<ビュー名>' がそのオブジェクトに従属しています。
X0Y24 | オブジェクト '<オブジェクト名>' においてオペレーション '<オペレーション名>' を実行できません。STATEMENT '<文>' がそのオブジェクトに従属しています。
X0Y25 | オブジェクト '<オブジェクト名>' においてオペレーション '<操作名>' を実行できません。<値> '<値>' がそのオブジェクトに従属しています。
X0Y26 | 索引 '<索引名>' は、表 '<表名>' と同じスキーマにある必要があります。
X0Y28 | 索引 '<索引名>' を、システム表 '<表名>' 上に作成することはできません。 ユーザーがシステム表上に索引を作成することはできません。
X0Y32 | <値> '<値>' は、既に <値> '<値>' に存在します。
X0Y38 | 表 '<表名>' が存在しないため、索引 '<索引名>' を作成できません。
X0Y41 | 参照表 <表名> に主キーがないため、制約 '<制約名>' は無効です。 主キーを <表名> に追加するか、この外部キーが参照するユニーク制約の列を明示的に指定してください。
X0Y42 | 制約 '<制約名>' は無効です: 外部キー列の型が参照列の型と一致しません。
X0Y43 | 制約 '<制約名>' は無効です: <制約名> (<値>) の列数が参照キー (<値>) の列数と一致しません。
X0Y44 | 制約 '<制約名>' は無効です: 表 '<表名>' に、外部キーの列の数および型と一致するユニーク制約または主キー制約がありません。
X0Y45 | 1 つ以上の外部キーが一致する参照キーを持っていないため、外部キー制約 '<制約名>' を表 <表名> に追加、またはそこで使用可能にすることはできません。
X0Y46 | 制約 '<制約名>' は無効です: 参照表 <表名> が存在しません。
X0Y54 | スキーマ '<スキーマ名>' は空でないため、ドロップできません。
X0Y55 | 基本表の行数が、表上の少なくとも 1 つの索引の行数と一致しません。 表 '<スキーマ名>.<表名>' 上の索引 '<索引>' は <数> 行ですが、基本表は <数> 行です。 訂正処置として、索引の再作成をお勧めします。
X0Y56 | '<値>' は、システム表 '<表名>' では許可されません。
X0Y57 | NULL 可能でない列を表 '<表名>' に追加することはできません。この表には少なくとも 1 つの行が含まれます。 NULL 可能でない列は、空の表にしか追加できません。
X0Y58 | 主キー制約を表 '<表名>' に追加しようとして失敗しました。この表はすでにこの型の制約を持っています。 表は、1 つの主キー制約しか持つことができません。
X0Y59 | 表 '<行名>' に制約を追加、またはそこで使用可能にしようとして失敗しました。表に含まれる <制約名> 行が次のチェック制約に違反しています: <表名>。
X0Y63 | 表 '<表名>' におけるコマンドは失敗しました。主キーまたはユニーク制約/索引列で NULL データが検出されました。 主キーおよびユニーク索引キー内の列は、いずれも NULL にすることはできません。
X0Y66 | 親接続に保留中のオペレーションがあるときは、ネストされた接続でコミットは発行できません。
X0Y67 | 親接続に保留中のオペレーションがあるときは、ネストされた接続でロールバックは発行できません。
X0Y68 | <値> '<値>' はすでに存在します。
X0Y69 | <トリガー名> はトリガー <値> ではサポートされていません。
X0Y70 | トリガー <表名> がアクティブのため、表 <トリガー名> での INSERT、UPDATE および DELETE は許可されません。
X0Y71 | SET ISOLATION のようなトランザクション操作は、トリガー <トリガ名> がアクティブのため、許可されません。
X0Y72 | '<値>' は使用可能なトリガー (<値>) を持っているため、これに対するバルク挿入置換は許可されません。
X0Y77 | グローバル・トランザクションが暗黙的にコミットされるため、実行中のグローバル・トランザクションに対して set transaction isolation ステートメントを発行できません。
X0Y78 | Statement.executeQuery() は、行カウントを戻すステートメントを使って呼び出せません。
X0Y78 | 複数の結果セットが戻されたため、<値>.executeQuery() を呼び出せません。 複数の結果を取得するには <値>.execute() を使用してください。
X0Y78 | <値>.executeQuery() が呼び出されましたが、結果セットが戻されませんでした。 照会が存在しない場合は、<値>.executeUpdate() を使用してください。
X0Y79 | Statement.executeUpdate() は、ResultSet を戻すステートメントを使って呼び出せません。
X0Y80 | ALTER 表 '<表名>' が失敗しました。 列 '<列名>' で NULL データが検出されました。
X0Y83 | 警告: 表から行を削除している間、データベースおよび関連プロジェクト ID <id> の索引で、基本表行 <行名> の索引行が見つかりませんでした。 この問題は、削除オペレーションの一部として自動的に訂正されました。

表 58. 分類 XBCA: キャッシュサービス

SQLSTATE | 文言
XBCA0 | キー <キー> を使って <キャッシュ> キャッシュ内に新規オブジェクトを作成できませんでした。 オブジェクトはすでにこのキャッシュに存在します。

表 59. 分類 XBCM: クラスマネージャ

SQLSTATE | 文言
XBCM1 | 生成されたクラス <クラス名> のロード中に Java リンケージ・エラーがスローされました。
XBCM2 | 生成されたクラス <クラス名> のインスタンスを作成できません。
XBCM3 | メソッド <メソッド名>() は、生成されたクラス <クラス名> に存在しません。
XBCM4 | Java クラス・ファイル・フォーマットの制限を超えました: 生成されたクラス <クラス名> の <値>。

表 60. 分類 XBCX: 暗号

SQLSTATE | 文言
XBCX0 | 暗号方式プロバイダーからの例外。 詳細については、次の例外を参照してください。
XBCX1 | 不正なモードで暗号を初期化しています。ENCRYPT か DECRYPT のいずれかを使用してください。
XBCX2 | 暗号の初期化に使っているブート・パスワードが短すぎます。 パスワードの長さは少なくとも <数> 文字にする必要があります。
XBCX5 | ブート・パスワードを NULL に変更することはできません。
XBCX6 | ブート・パスワードを、非ストリングのシリアライズ可能なタイプに変更することはできません。
XBCX7 | ブート・パスワードの変更フォーマットが誤りです。 正しいフォーマットは次の通りです: old_boot_password, new_boot_password。
XBCX8 | 暗号化されていないデータベースのブート・パスワードは変更できません。
XBCX9 | 読み取り専用データベースのブート・パスワードは変更できません。
XBCXA | ブート・パスワードが誤りです。
XBCXB | 誤った暗号化埋め込み '<値>' が指定されたか、埋め込みが指定されていません。 ''NoPadding'' を使用してください。
XBCXC | 暗号化アルゴリズム '<アルゴリズム名>' は存在しません。 選択したプロバイダー '<プロバイダ名>' がこのアルゴリズムをサポートしているかチェックしてください。
XBCXD | データベース作成後に暗号化アルゴリズムを変更することはできません。
XBCXE | データベース作成後に暗号化プロバイダーを変更することはできません。
XBCXF | 暗号化プロバイダーを示すクラス '<クラス名>' が見つかりません。
XBCXG | 暗号化プロバイダー '<プロバイダー名>' は存在しません。
XBCXH | encryptionAlgorithm '<アルゴリズム名>' のフォーマットが誤りです。 正しいフォーマットは、algorithm/feedbackMode/NoPadding です。
XBCXI | フィードバック・モード '<モード>' はサポートされていません。 サポートされているフィードバック・モードは CBC、CFB、OFB、および ECB です。
XBCXJ | アプリケーションは、1.2.1 より前の Java Cryptography Extension (JCE) のバージョンを使用しています。 JCE 1.2.1 にアップグレードした上で、オペレーションを再試行してください。
XBCXK | 与えられた暗号鍵は、データベースの作成時に使用された暗号鍵と一致しません。 正しい暗号鍵を使用していることを確認して、再試行してください。
XBCXL | 暗号鍵の検査プロセスは失敗しました。 原因としては、検査プロセスを行うための特定のファイルへのアクセス中のエラーが考えられます。 詳細については、次の例外を参照してください。
XBCXM | 外部暗号鍵の長さは、偶数である必要があります。
XBCXN | 外部暗号鍵に正しくない文字が 1 つ以上含まれています。 16 進数として使用可能な文字は 0 から 9、a から f、および A から F です。
XBCXO | 準備済み状態のグローバル・トランザクションが存在する場合は、データベースを暗号化できません。
XBCXP | 準備済み状態のグローバル・トランザクションが存在する場合は、新規ブート・パスワードまたは外部暗号鍵でデータベースを再暗号化できません。
XBCXQ | 読み取り専用データベースを暗号化用に構成することはできません。
XBCXR | 新規ブート・パスワードまたは外部暗号鍵で読み取り専用データベースを再暗号化することはできません。
XBCXS | データベースがログ・アーカイブ・モードである場合は、データベースを暗号化用に構成できません。
XBCXT | データベースがログ・アーカイブ・モードである場合は、新規ブート・パスワードまたは外部暗号鍵でデータベースを再暗号化できません。
XBCXU | 暗号化されていないデータベースの暗号化に失敗しました: <失敗の文言>
XBCXV | 暗号化されたデータベースの、新規鍵または新規パスワードでの暗号化に失敗しました: <失敗の文言>

表 61. 分類 XBM: モニター

SQLSTATE | 文言
XBM01 | 例外のため、始動に失敗しました。 詳細については、次の例外を参照してください。
XBM02 | <値> の機能がないため、始動に失敗しました。 クラスパスに正しい Derby ソフトウェアが含まれていることを確認してください。
XBM05 | <value> の製品バージョン情報がないため、始動に失敗しました。
XBM06 | 始動に失敗しました。 暗号化されたデータベースは、正しいブート・パスワードがないとアクセスできません。
XBM07 | 始動に失敗しました。 ブート・パスワードの長さは 8 バイト以上にする必要があります。
XBM08 | <値> StorageFactory クラス <値> をインスタンス化できませんでした。
XBM0G | 暗号化エンジンの始動に失敗しました。 Java 2 を実行しており、JCE などの暗号化プロバイダーをダウンロードしてクラスパスに指定していることを確認してください。
XBM0H | ディレクトリー <ディレクトリー名> を作成できません。
XBM0I | ディレクトリー <ディレクトリー名> を除去できません。
XBM0J | ディレクトリー <ディレクトリー名> はすでに存在します。
XBM0K | データベース名 <データベース名> のサブプロトコルが不明です。
XBM0L | 指定された認証スキーム・クラス <クラス名> は、認証インターフェース <インターフェイス名> をインプリメントしていません。
XBM0M | 認証スキーム・クラス <クラス名> のインスタンスの作成でエラーが発生しました。
XBM0N | java.sql.DriverManager への JDBC ドライバーの登録に失敗しました。 詳細については、次の例外を参照してください。
XBM0P | サービス・プロバイダーは読み取り専用です。 オペレーションが許可されていません。
XBM0Q | ファイル <ファイル名> が見つかりません。 バックアップ・コピーが正しいものであり、それが破壊されていないことを確認してください。
XBM0R | ファイル <ファイル名> を除去できません。
XBM0S | ファイル '<ファイル名>' を '<ファイル名>' に名前変更できません。
XBM0T | データベース名 <データベース名> のサブプロトコルが未確定です。
XBM0U | ID <識別子名> に対してクラスが登録されていません。
XBM0V | ID <識別子名> に対して登録されたクラス <クラス名> のロード中に例外がスローされました
XBM0W | ID <識別子名> に対して登録されたクラス <クラス名> のインスタンスの作成中に例外がスローされました
XBM0X | 提供されたテリトリー記述 '<値>' は無効です。予期されているテリトリー記述: ln[_CO[_variant]]\nln=小文字 2 文字から成る ISO-639 言語コード、CO= 大文字 2 文字から成る ISO-3166 国別コード。java.util.Locale を参照。
XBM03 | Supplied value '<値>' for collation attribute is invalid, expecting UCS_BASIC or TERRITORY_BASED.
XBM0Y | バックアップ・データベース・ディレクトリー <ディレクトリー名> が見つかりません。 指定したバックアップ・パスが正しいことを確認してください。
XBM0Z | ファイル '<ファイル名>' を '<ファイル名>' にコピーできません。 十分なスペースがあり、許可が正しいことを確認してください。

表 62. 分類 XCL: 実行時例外

SQLSTATE | 文言
XCL01 | 結果セットが行を戻しません。 オペレーション <操作名> は許可されません。
XCL05 | Activation がクローズされました。オペレーション <操作名> は許可されません。
XCL07 | カーソル '<カーソル名>' はクローズされています。 自動コミットがオフになっていることを確認してください。
XCL08 | カーソル '<カーソル名>' が行にありません。
XCL09 | PreparedStatement に一致しない '<メソッド名>' メソッドに Activation が渡されました。
XCL10 | PreparedStatement が再コンパイルされ、パラメーターが変更されました。 JDBC を使用している場合は、ステートメントを再準備する必要があります。
XCL12 | 型 '<データ型名>' のデータ値を型 '<データ型名>' のデータ値に書き込もうとしました。
XCL13 | パラメーター位置 '<パラメータ位置>' は範囲外です。 この準備済みステートメントのパラメーターの数は '<数>' です。
XCL14 | 列位置 '<列位置>' は範囲外です。 この ResultSet に対する列数は '<数>' です。
XCL15 | オブジェクト '<オブジェクト>' において compareTo() メソッドを呼び出しているときに ClassCastException が発生しました。 compareTo() のパラメーターはクラス '<クラス名>' です。
XCL16 | ResultSet がオープンされていません。 オペレーション '<操作>' は許可されません。 自動コミットがオフになっていることを確認してください。
XCL16 | ResultSet がオープンされていません。 自動コミットがオフになっていることを確認してください。
XCL17 | ステートメントはこのデータベースでは許可されません。
XCL18 | 結果内の列値のストリームを 2 回取得することはできません。
XCL19 | 表 '<表名>' にキー '<キー>' に対する行がありません。
XCL20 | バージョン・レベル '<バージョン番号>' のカタログを、バージョン・レベル '<バージョン番号>' にアップグレードすることはできません。
XCL21 | 別のステートメントを準備しながら、データ定義ステートメント (CREATE、DROP、または ALTER) を実行しようとしています。 これは許可されません。 これは、SQL ステートメント内から使用されている Java クラスの静的イニシャライザー内からデータ定義ステートメントを実行した場合に起こることがあります。
XCL22 | パラメーター <パラメーター名> は IN パラメーターであるため、OUT パラメーターとして登録できません。
XCL23 | SQL 型番号 '<型>' は、registerOutParameter() によってサポートされた型ではありません。
XCL24 | パラメーター <パラメータ名> は出力パラメーターのようですが、registerOutParameter() によってそのように指定されていません。 これが出力パラメーターでない場合は、型 <型> に設定する必要があります。
XCL25 | パラメーター <パラメータ名> は型 <型> として登録できません。このパラメーターは型 <型> をマップしており、この 2 つは非互換です。
XCL26 | パラメーター <パラメータ名> は出力パラメーターではありません。
XCL27 | 戻り出力パラメーターを設定できません。
XCL30 | InputStream から '<値>' を読み取っているときに、IOException がスローされました。
XCL31 | ステートメントはクローズされました。
XCL33 | 削除規則の制約事項のため、表 <表名> に従属する表としてその表を定義することはできません。 (その関係は、自己参照になっており、自己参照関係は SET NULL の削除規則にすでに存在しています。)
XCL34 | 削除規則の制約事項のため、表 <表名> に従属する表としてその表を定義することはできません。 (その関係により、複数表の循環が構成され、結果としてその表は循環と連結削除されるものになります (循環の他のすべての削除規則は、CASCADE になります。))
XCL35 | 削除規則の制約事項のため、表 <表名> に従属する表としてその表を定義することはできません。 (その関係により、その表は複数の関係を介して指定の表と連結削除される表になり、既存の関係の削除規則は SET NULL です。)
XCL36 | 外部キーの削除規則は <値> である必要があります。 (参照制約は、自己参照になっており、既存の自己参照制約に指定の削除規則があります (NO ACTION、RESTRICT または CASCADE)。)
XCL37 | 外部キーの削除規則は <値> である必要があります。 (参照制約は、自己参照になっており、その表は CASCADE の削除規則との関係に依存しています。)
XCL38 | 外部キーの削除規則は <規則名> である必要があります。 (その関係により、その表は、複数の関係を介して同じ表と連結削除される表になり、そのような関係は同じ削除規則を持つ必要があります (NO ACTION、RESTRICT または CASCADE)。)
XCL39 | 外部キーの削除規則は CASCADE にはできません。 (自己参照制約が、SET NULL、NO ACTION または RESTRICT の削除規則に存在します。)
XCL40 | 外部キーの削除規則は CASCADE にはできません。 (その関係により、循環が構成され、その結果としてその表は循環と連結削除されるものになります。 その循環にある既存の削除規則の 1 つは CASCADE ではないので、削除規則が CASCADE でない場合はこの関係が定義可能になる場合があります。)
XCL41 | 外部キーの削除規則は CASCADE にはできません。 (その関係により、別の表が、異なる削除規則を持つ複数のパスあるいは、SET NULL と等しい削除規則を持つ複数のパスを介して同じ表と連結削除されるものになります。)
XCL42 | CASCADE
XCL43 | SET NULL
XCL44 | RESTRICT
XCL45 | NO ACTION
XCL46 | SET DEFAULT
XCL47 | '<値>' を使用するには、データベースをバージョン <バージョン番号> からバージョン <バージョン番号> 以降にアップグレードする必要があります。
XCL48 | TRUNCATE TABLE は '<値>' では許可されません。この表のユニーク/主キー制約が他の表からの使用可能な外部キー制約によって参照されています。
XCL49 | '<値>' は使用可能な DELETE トリガー (<値>) を持っているため、これに対する TRUNCATE TABLE は許可されません。
XCL50 | 前のバージョンからのデータベースのアップグレードはサポートされません。 アクセスしているデータベースのバージョン・レベルは '<バージョン番号>' で、このソフトウェアのバージョン・レベルは '<バージョン番号>' です。
XCL51 | 要求された機能は、SESSION スキーマの表を参照できません。
XCL52 | ステートメントは取り消されたか、タイムアウトになりました。
XCL53 | Stream is closed

表 63. 分類 XCW: サポートされないアップグレード

SQLSTATE | 文言
XCW00 | '<値>' から '<値>' へのアップグレードはサポートされていません。

表 64. 分類 XCX: 内部的なユーティリティのエラー

SQLSTATE | 文言
XCXA0 | 無効な ID。
XCXB0 | 無効データベース・クラスパス: '<クラスパス>'。
XCXC0 | 無効な ID リスト。
XCXE0 | データベースのテリトリーを使用するオペレーションを実行しようとしていますが、そのデータベースはテリトリーを持っていません。

表 65. 分類 XCY: Derby のプロパティに関する例外

SQLSTATE | 文言
XCY00 | 無効なプロパティー値 '<値>'='<値>'。
XCY02 | 要求されたプロパティーの変更はサポートされていません。'<値>'='<値>'。
XCY03 | 必要なプロパティー '<プロパティ名>' が設定されていません。
XCY04 | オプティマイザー・オーバーライドの構文が無効です。 次のような構文である必要があります。 -- DERBY-PROPERTIES propertyName = value [, propertyName = value]*

表 66. 分類 XCZ: org.apache.derby.database.UserUtility

SQLSTATE | 文言
XCZ00 | 不明な許可 '<許可名>'。
XCZ01 | 不明なユーザー '権限ID'。
XCZ02 | 無効なパラメーター '<値>'='<値>'。

表 67. 分類 XD00: 依存性マネージャ

SQLSTATE | 文言
XD003 | ディスクから従属関係をリストアできません。 DependableFinder = '<値>'。 詳細情報: ''<値>''。
XD004 | 従属関係を保管できません。

表 68. 分類 XIE: インポート/エクスポートの例外

SQLSTATE | 文言
XIE01 | 接続が NULL でした。
XIE03 | 行 <行番号> の列 <列名> に対するデータが停止区切り文字の後に検出されました。
XIE04 | データ・ファイルが見つかりません: <ファイル名>
XIE05 | データ・ファイルを NULL にすることはできません。
XIE06 | エンティティー名が NULL でした。
XIE07 | フィールド分離文字とレコード分離文字をお互いのサブストリングにすることはできません。
XIE08 | この名前の列はありません: <列名>。
XIE09 | この行の合計列数: <数>。
XIE0B | 表の列 '<列名>' の型は <型> です。インポート/エクスポートのフィーチャーではサポートされていません。
XIE0D | 行 <行番号> のレコード分離文字を検出できません。
XIE0E | 行 <行番号> の予期しない場所で endOfFile を読み取りました
XIE0I | ファイルへのデータ書き込み中に IOException が発生しました。
XIE0J | 区切り文字が無効か、1 回以上使用されています。
XIE0K | ピリオドが文字ストリング区切り文字として指定されました。
XIE0M | 表 '<表名>' は存在しません。
XIE0N | An invalid hexadecimal string '<16進文字列>' detected in the import file.
XIE0P | Lob data file <ファイル名> referenced in the import file not found.
XIE0Q | Lob data file name cannot be null.
XIE0R | Import error on line <行番号> of file <ファイル名>: <詳細>

表 69. 分類 XJ: 接続エラー

SQLSTATE | 文言
XJ004 | データベース '<データベース名>' が見つかりません。
XJ008 | 自動コミット・モードでは、セーブポイントのロールバックまたはリリースを行うことができません。
XJ009 | CallableStatement を使用するには、ストアード・プロシージャー呼び出しか、出力パラメーターの使用が必要です。<value>
XJ010 | autoCommit がオンになっているときには、savepoint を実行できません。
XJ011 | セーブポイント名に NULL を渡すことはできません。
XJ012 | '<値>' はすでにクローズされています。
XJ013 | 名前付きのセーブポイントに ID がありません。
XJ014 | 不特定のセーブポイントに名前がありません。
XJ015 | Derby システムがシャットダウンされました。
XJ016 | メソッド '<メソッド名>' は、準備済みステートメントでは許可されません。
XJ017 | savepoint コマンドは、トリガー・コード内では許可されません。
XJ018 | 列名を NULL にすることはできません。
XJ020 | オブジェクト型が TYPE '<型名>' に変換可能でないか、java.sql.Types 値が無効であるか、あるいはオブジェクトが NULL でした。
XJ021 | 型がサポートされていません。
XJ022 | ストリームを設定できません: '<名前>'。
XJ023 | 入力ストリームのデータ量は、要求された長さと完全には一致しませんでした。
XJ025 | 入力ストリームは負の長さを持つことはできません。
XJ028 | URL '<url値>' の形式が正しくありません。
XJ030 | ネストされた接続では、自動コミットをオンに設定できません。
XJ040 | データベース '<データベース名>' を始動できません。詳しくは、次の例外を参照してください。
XJ041 | データベース '<データベース名gt;' の作成に失敗しました。詳しくは、次の例外を参照してください。
XJ042 | '<値>' は、プロパティー '<プロパティー名>' に有効な値ではありません。
XJ044 | '<値>' は無効な目盛りです。
XJ045 | 無効または (現在) サポートされていない分離レベル '<レベル名>' が Connection.setTransactionIsolationLevel() に渡されました。 現在サポートされている値は、java.sql.Connection.TRANSACTION_SERIALIZABLE、java.sql.Connection.TRANSACTION_REPEATABLE_READ、java.sql.Connection.TRANSACTION_READ_COMMITTED、および java.sql.Connection.TRANSACTION_READ_UNCOMMITTED です。
XJ049 | 指定された属性の作成で競合があります。
XJ04B | バッチには、結果セットを戻そうとするコマンドを入れることはできません。
XJ04C | CallableStatement バッチには、出力パラメーターを入れることはできません。
XJ056 | 接続の場合、AUTOCOMMIT ON を設定できません。
XJ057 | Cannot commit a global transaction using the Connection, commit processing must go thru XAResource interface.
XJ058 | Cannot rollback a global transaction using the Connection, commit processing must go thru XAResource interface.
XJ059 | グローバル・トランザクションがまだアクティブなときに接続をクローズすることはできません。
XJ05B | JDBC 属性 '<属性名>' の値 '<値>' は無効です。有効な値は '<値>' です。
XJ05C | グローバル・トランザクションの保持機能 ResultSet.HOLD_CURSORS_OVER_COMMIT を設定できません。
XJ061 | '<メソッド名>' メソッドは、スクロール・カーソルでのみ許可されます。
XJ062 | ResultSet.setFetchSize(int rows) に対する無効なパラメーター値 '<値>'。
XJ063 | Statement.setMaxRows(int maxRows) に対する無効なパラメーター値 '<値>'。 パラメーターは >= 0 にする必要があります。
XJ064 | setFetchDirection(int direction) に対する無効なパラメーター値 '<値>'。
XJ065 | Statement.setFetchSize(int rows) に対する無効なパラメーター値 '<値>'。
XJ066 | Statement.setMaxFieldSize(int max) に対する無効なパラメーター値 '<値>'。
XJ067 | SQL テキスト・ポインターが NULL です。
XJ068 | バッチ処理中には、executeBatch と clearBatch しか許可されません。
XJ069 | SetXXX メソッドは、USING 実行ステートメントの場合には許可されません。
XJ070 | 負またはゼロの位置引数 '<引数>' が BLOB または CLOB メソッドに渡されました。
XJ071 | 負の長さ引数 '<引数>' が BLOB または CLOB メソッドに渡されました。
XJ072 | NULL パターンまたは searchStr が BLOB または CLOB 位置メソッドに渡されました。
XJ073 | この BLOB または CLOB のデータはもう使用できません。 BLOB/CLOB トランザクションがコミットされているか、接続がクローズされている可能性があります。
XJ074 | Statement.setQueryTimeout(int seconds) に対する無効なパラメーター値 '<値>'。
XJ076 | 位置引数 '<位置引数>' が BLOB/CLOB のサイズを超えています。
XJ077 | getBytes/getSubString を使用して BLOB/CLOB パターンの最初のバイト/文字を読み取ろうとして、例外が発生しました。
XJ078 | オフセット '<値>' がゼロより小さいか、現行の BLOB/CLOB に対して大きすぎます。
XJ079 | 指定された長さ '<数>' が BLOB/CLOB のサイズを超えています。
XJ080 | USING 実行ステートメントが <数> ではなく <数> パラメーターを渡しました。
XJ081 | 指定された create/restore/recovery 属性に矛盾があります。
XJ081 | パラメーター '<パラメーター名>' として無効な値 '<値>' がメソッド '<メソッド名>' に渡されました。
XJ085 | ストリームは既に読み取られ、ファイルの終わりに達しており、再使用できません。
XJ086 | このメソッドは、カーソルが挿入行に存在しないか、この ResultSet オブジェクトの並行性が CONCUR_READ_ONLY である場合は呼び出せません。
XJ087 | Sum of position('<位置>') and length('<長さ>') is greater than the size of the LOB.
XJ088 | 無効なオペレーション: データを取得せずに wasNull() が呼び出されました。
XJ090 | 無効なパラメーター: カレンダーが NULL です。
XJ091 | 無効な引数: パラメーター索引 <引数番号> は OUT パラメーターでも INOUT パラメーターでもありません。
XJ093 | BLOB/CLOB の長さ <数> が長すぎます。 長さが <数> を超えてはなりません。
XJ094 | このオブジェクトは既にクローズされています。
XJ095 | 特権アクションを実行しようとして失敗しました。
XJ096 | リソース・バンドルを <値> の <パッケージ名> パッケージから検出できませんでした。
XJ097 | この接続で作成されていないセーブポイントのロールバックまたはリリースを行うことはできません。
XJ098 | 自動生成されたキー値 <値> は無効です。
XJ099 | Reader/Stream オブジェクトに長さを示す文字が含まれていません。
XJ100 | registerOutParameter メソッドにより指定された位取りが setter メソッドと一致しません。 精度が失われる可能性があります。
XJ102 | 現在位置で挿入を実行できません。
XJ103 | 表名を NULL にすることはできません。
XJ104 | 共有鍵の長さが無効です: <値>。
XJ105 | DES 鍵の長さが誤っています。予期した長さは <数>、得られた長さは <数> です。
XJ106 | そのような埋め込みはありません。
XJ107 | 正しくない埋め込みです。
XJ108 | ブロック・サイズが正しくありません。
XJ110 | 主表名を NULL にすることはできません。
XJ111 | 外部表名を NULL にすることはできません。
XJ112 | セキュリティー例外が発生しました。詳しくは、次の例外を参照してください。
XJ113 | ファイル <ファイル名> を開くことができません: <エラー>
XJ114 | 無効なカーソル名 '<カーソル名>' です
XJ115 | 要求された保持機能 <値> で結果セットを開くことができません。
XJ116 | 単一のバッチに追加できるコマンドは <数> 個以下です。
XJ117 | 照会のバッチ処理は J2EE 仕様への準拠のために、許可されません。
XJ118 | 非照会ステートメントに対して照会バッチが要求されました。
XJ121 | 現行カーソル位置での無効なオペレーションです。
XJ122 | この行に対して updateXXX メソッドが呼び出されませんでした。
XJ123 | 現在行または挿入行の値を更新するには、このメソッドを呼び出す必要があります。
XJ124 | 列は更新できません。
XJ125 | このメソッドはスクロール可能な ResultSet オブジェクト (TYPE_SCROLL_SENSITIVE 型または TYPE_SCROLL_INSENSITIVE 型) に対してのみ呼び出すことができます。
XJ126 | このメソッドをセンシティブ動的カーソルに対して呼び出さないでください。
XJ128 | '<値>' についてアンラップできません。
XJ200 | セクションの最大数 <値> を超えました。
XJ202 | 無効なカーソル名 '<カーソル名>' です。
XJ203 | カーソル名 '<カーソル名>' は既に使用されています。
XJ204 | 要求された保持機能 <保持された値> で結果セットを開くことができません。
XJ206 | SQL テキスト '<値>' にトークンがありません。
XJ207 | executeQuery メソッドを更新用に使用することはできません。
XJ208 | 非アトミック・バッチが失敗しました。 バッチは実行依頼されましたが、バッチの個別メンバーのいずれかで 1 つ以上の例外が発生しました。 特定のバッチ処理済みエレメントにおける例外を取得するには getNextException() を使用してください。
XJ209 | 必要なストアード・プロシージャーがサーバーにインストールされていません。
XJ210 | サーバー上のストアード・プロシージャーのロード・モジュール名を検出できません。
XJ211 | バッチ処理中にリカバリー不能な連鎖分断例外が発生しました。 バッチは非アトミックに終了します。
XJ212 | 無効な属性構文: <属性構文>
XJ213 | traceLevel 接続プロパティーが数値に対して有効な形式ではありません。
XJ214 | CLOB または BLOB に対する free() の呼び出し中に IO エラーが発生しました。
XJ215 | free() メソッドの呼び出し後、その他の java.sql.Clob/java.sql.Blob メソッドを呼び出すことはできません。
XJ216 | The length of this BLOB/CLOB is not available yet. When a BLOB or CLOB is accessed as a stream, the length is not available until the entire stream has been processed.
XJ217 | The locator that was supplied for this LOB/BLOB is invalid

表 70. 分類 XK: セキュリティ例外

SQLSTATE | 文言
XK000 | The security policy could not be reloaded: <理由>

表 71. 分類 XN: ネットワーククライアントの例外

SQLSTATE | 文言
XN001 | 作業単位の途中では、接続のリセットは許可されません。
XN008 | サーバー上でのエラーにより照会の処理が終了しました。
XN009 | BLOB/CLOB オブジェクトの長さの取得中にエラーが発生しました。例外が後に続きます。
XN010 | プロシージャー名を NULL にすることはできません。
XN011 | プロシージャー名の長さ <数> が有効な範囲である 1 から <数> の中にありません。
XN012 | <基本システム名> プラットフォームでは、XA はバージョン <バージョン番号> 以降に対応しています。これはバージョン <バージョン番号> です。
XN013 | 無効なスクロール方向です。
XN014 | ネットワーク・プロトコル・エラー: IOException が発生しました。パラメーターは #<値> です。 残りのデータには 0x0 が埋め込まれました。 メッセージ: <文言>。
XN015 | ネットワーク・プロトコル・エラー: 指定された InputStream のサイズ (パラメーター #<値>) が実際の InputStream の長さより短くなっています。
XN016 | ネットワーク・プロトコル・エラー: ストリーム長の検査でエラーが発生しました。パラメーターは #<値> です。 メッセージ: <文言>。
XN017 | ネットワーク・プロトコル・エラー: 予期せずストリームの終端に達しました。パラメーターは #<値> です。 残りのデータには 0x0 が埋め込まれました。
XN018 | ネットワーク・プロトコル・エラー: 指定された Reader のサイズ (パラメーター #<値>) が実際の Reader の長さより短くなっています。
XN019 | <値> の実行中にエラーが発生し、サーバーは <値> を戻しました。

表 72. 分類 XSAI: ストア - access.protocol.interface

SQLSTATE | 文言
XSAI2 | 要求されたデータベースおよび関連プロジェクト (<値>) は存在しません。
XSAI3 | フィーチャーはインプリメントされていません。

表 73. 分類 XSAM: ストア - AccessManager

SQLSTATE | 文言
XSAM0 | '<値>' のモジュールをブートしようとして例外を検出しました。
XSAM2 | ドロップする、conglom id '<conglomID>' を持つ索引またはデータベースおよび関連プロジェクトはありません。
XSAM3 | conglom id '<conglomID>' を持つ索引またはデータベースおよび関連プロジェクトはありません。
XSAM4 | '<ソート名>' という名前のソートはありません。
XSAM5 | スキャンをオープンし、next() を呼び出して位置を移動してから他の呼び出しを行う必要があります。
XSAM6 | コンテナー <コンテナ名> 内のページ <ページ番号> 上のレコード <レコード番号> が見つかりませんでした。

表 74. 分類 XSAS: Store - 並び替え

SQLSTATE | 文言
XSAS0 | ソートのスキャンに不適切なスキャン・コントローラー・インターフェース・メソッドが呼び出されました。
XSAS1 | ソートの開始前またはソートの終了後に行をフェッチしようとしました。
XSAS3 | ソートに挿入された行のタイプが、ソートのテンプレートと一致しません。
XSAS6 | ソートするためのリソースを獲得できませんでした。

表 75. 分類 XSAX: ストア - access.protocol.XA statement

SQLSTATE | 文言
XSAX0 | XA プロトコル違反。
XSAX1 | 既存するグローバル・トランザクションの Xid を使ってグローバル・トランザクションを開始しようとしました。

表 76. 分類 XSCB: ストア - BTree

SQLSTATE | 文言
XSCB0 | コンテナーを作成できませんでした。
XSCB1 | コンテナー <コンテナ名> が見つかりません。
XSCB2 | 必要なプロパティー <プロパティー名> が、btree の 2 次索引の createConglomerate() に与えられたプロパティー・リストで見つかりませんでした。
XSCB3 | インプリメントされていないフィーチャー。
XSCB4 | スキャンを最初の行に位置付ける前 (つまり、next() 呼び出しが行われる前) に、btree オープン・スキャン上のメソッドが呼び出されました。 スキャンの現在の状態は (<値>) です。
XSCB5 | btree 挿入または削除の論理 UNDO 中、ツリーでこの行が見つかりませんでした。
XSCB6 | 制限: ページ上のスペース不足のため、btree の 2 次索引を更新または挿入できません。 この制限を回避するには、パラメーター derby.storage.pageSize および/または derby.storage.pageReservedSpace を使用してください。
XSCB7 | btree のスキャン中に内部エラーを検出しました。current_rh は NULL = <値>。位置キーは NULL = <値>。
XSCB8 | btree のデータベースおよび関連プロジェクト <値> はクローズされています。
XSCB9 | テスト用に予約されています。

表 77. 分類 XSCG0: コングロマリット

SQLSTATE | 文言
XSCG0 | テンプレートを作成できませんでした。

表 78. 分類 XSCH: ヒープ

SQLSTATE | 文言
XSCH0 | コンテナーを作成できませんでした。
XSCH1 | コンテナー <コンテナ名> が見つかりません。
XSCH4 | データベースおよび関連プロジェクトを作成できませんでした。
XSCH5 | 基本表において、要求された列数 <数> と最大列数 <数> との間にミスマッチがありました。
XSCH6 | ヒープ・コンテナー (コンテナー ID <コンテナーID>) がクローズされました。
XSCH7 | スキャンが位置付けられていません。
XSCH8 | フィーチャーはインプリメントされていません。

表 79. 分類 XSDA: RawStore - Data.Generic statement

SQLSTATE | 文言
XSDA1 | ページ上の範囲外のスロットにアクセスしようとしました
XSDA2 | 削除済みレコードを更新しようとしました
XSDA3 | 制限: ページ上のスペース不足のため、レコードを更新または挿入できません。 この制限を回避するには、パラメーター derby.storage.pageSize および/または derby.storage.pageReservedSpace を使用してください。
XSDA4 | 予期しない例外がスローされました
XSDA5 | 削除されていないレコードの削除を取り消そうとしました
XSDA6 | 行の列 <列名> が NULL です。オブジェクトを指すように設定する必要があります。
XSDA7 | クラス <クラス名> のシリアライズ可能または SQLData オブジェクトのリストアで、最初に保管されたデータよりも多くのデータの読み取りが試行されました
XSDA8 | クラス <クラス名> のシリアライズ可能または SQLData オブジェクトのリストア中に例外が発生しました
XSDA9 | クラス <クラス名> のシリアライズ可能または SQLData オブジェクトのリストア中、クラスが検出されませんでした
XSDAA | 不正なタイム・スタンプ <値>。タイム・スタンプは別のページのものか、または非互換のインプリメンテーションのものです
XSDAB | NULL のタイム・スタンプは設定できません
XSDAC | 行またはページのいずれかをコンテナーから別のコンテナーに移動しようとしています。
XSDAD | 1 つのページから別のページにゼロ行を移動しようとしています。
XSDAE | 特殊レコード・ハンドル ID のレコード・ハンドルしか作成できません。
XSDAF | 通常のレコード・ハンドルのように、特殊レコード・ハンドルを使用します。
XSDAG | ネストされた割り振りの最上位トランザクションは、コンテナーをオープンできませんでした。
XSDAI | 除去しようとしているページ <ページ> は、すでに割り振り解除のためにロックされています。
XSDAJ | シリアライズ可能または SQLData オブジェクトの書き込み中に例外が発生しました。
XSDAK | レコード・ハンドル <値> に対して誤ったページが取得されています。
XSDAL | レコード・ハンドル <値> は、予期せず、オーバーフロー・ページを指しています。
XSDAM | クラス <クラス名> の SQLData オブジェクトのリストア中に例外が発生しました。 指定されたクラスをインスタンス化できません。
XSDAN | クラス <クラス名> の SQLData オブジェクトのリストア中に例外が発生しました。 指定されたクラスで無許可のアクセス例外が発生しました。

表 80. 分類 XSDB: RawStore - Data.Generic transaction

SQLSTATE | 文言
XSDB0 | メモリー内のページ <ページ> で予期しない例外が発生しました
XSDB1 | ページ <ページ> に不明のページ・フォーマットがあります
XSDB2 | コンテナー <コンテナ名> に不明のコンテナー・フォーマットがあります: <値>
XSDB3 | コンテナー情報は、書き込み後には変更できません。<値> でしたが、現在は <値> です。
XSDB4 | ページ <ページ> はバージョン <バージョン番号> で、ログ・ファイルには変更バージョン <バージョン番号> が含まれています。このページのログ・レコードが欠落しているか、このページが正しくディスクに書き込まれませんでした。
XSDB5 | ログはページ <ページ> に変更レコードを持っていますが、これはコンテナーの終わりを超えています。
XSDB6 | Derby の別のインスタンスがすでにデータベース <データベース名> をブートしている可能性があります。
XSDB7 | 警告: Derby (インスタンス <値>) がまだアクティブである可能性があるのにもかかわらず、Derby ( インスタンス <値>) がデータベース <データベース名> をブートしようとしています。 データベースをブートできる Derby のインスタンスは、1 度に 1 つだけです。 これにより重大な、リカバリー不能の破壊が発生するか、またはすでに破壊されている可能性があります。
XSDB8 | 警告: Derby (インスタンス <値>) がまだアクティブである可能性があるのにもかかわらず、Derby ( インスタンス <値>) がデータベース <データベース名> をブートしようとしています。 データベースをブートできる Derby のインスタンスは、1 度に 1 つだけです。 Derby の 2 つのインスタンスが同時に同じデータベースをブートした場合、重大な、リカバリー不能な破壊が発生する可能性があります。 db2j.database.forceDatabaseLock=true プロパティーが設定されているため、db.lck が存在しなくなるまでデータベースはブートしません。 通常、このファイルはデータベースをブートする Derby の最初のインスタンスが終了した時点で除去されますが、シャットダウン方法によっては後に残ってしまうことがあります。 その場合は、手操作でこのファイルを除去することが必要になります。 db.lck ファイルを手操作で削除する前に、このデータベースにアクセスしている VM がほかにないことを確認する必要があります。
XSDB9 | ストリーム・コンテナー <コンテナ名> は破壊されています。
XSDBA | オブジェクト <オブジェクト> の割り振りに失敗しました。

表 81. 分類 XSDF: RawStore - Data.Filesystem statement

SQLSTATE | 文言
XSDF0 | ファイル <ファイル名> はすでに存在するため、作成できませんでした。
XSDF1 | コンテナーのファイル <ファイル名> の作成中に例外
XSDF2 | コンテナーのファイル <ファイル名> の作成中に例外が発生しました。ファイルを除去できませんでした。 例外: <値>。
XSDF3 | セグメント <セグメント名> を作成できません。
XSDF4 | ドロップ済みコンテナーのファイル <ファイル名> の除去中に例外が発生しました。ファイルを除去できませんでした: <値>。
XSDF6 | 割り振りページ <ページ> が見つかりません。
XSDF7 | 新しく作成されたページをラッチできませんでした: <値>
XSDF8 | 再使用するページ <ページ> が見つかりません。
XSDFB | オペレーションは、読み取り専用データベースではサポートされていません
XSDFD | ページ <ページ> の 2 つの入出力で異なるページ・イメージが読み取られました。1 つ目のイメージは誤ったチェックサムを持っており、2 つ目のイメージは正しいチェックサムを持っています。 ページ・イメージは次の通りです: <値><値>
XSDFF | 予期しない例外のため、要求されたオペレーションは失敗しました。
XSDFH | データベースをバックアップできません。バックアップ・コンテナー・ファイル <ファイル名> への書き込み中に入出力例外が発生しました。
XSDFI | データベース・リカバリー中にディスクへデータを書き込もうとしてエラーが発生しました。 データベース・ディスクが満杯でないことを確認してください。 満杯の場合は、不要なファイルを削除してからデータベースへの接続を再試行してください。 ファイル・システムが読み取り専用である、ディスクに障害がある、またはメディアに何らかの問題がある可能性もあります。 システムにてページ <ページ> の処理中にエラーが発生しました。

表 82. 分類 XSDG: RawStore - Data.Filesystem database

SQLSTATE | 文言
XSDG0 | ページ <ページ> をディスクから読み取れませんでした。
XSDG1 | ページ <ページ> をディスクに書き込めませんでした。ディスクが満杯でないかチェックしてください。
XSDG2 | ページ <ページ> に無効なチェックサム。予期されていたチェックサム=<値>、ディスク上のバージョン=<値>、ページ・ダンプ: <値>
XSDG3 | コンテナー <コンテナー名> のメタデータにアクセスできませんでした
XSDG5 | createFinished の呼び出し時、データベースが作成モードではありません。
XSDG6 | リストアの間、バックアップの中にデータ・セグメント・ディレクトリー <値> が見つかりません。 バックアップ・コピーが正しいものであり、それが破壊されていないことを確認してください。
XSDG7 | リストアの間、ディレクトリー <ディレクトリ名> を除去できませんでした。 許可が正しいことを確認してください。
XSDG8 | リストアの間、ディレクトリー '<ディレクトリ名>' を '<ディレクトリ名>' にコピーできません。 十分なスペースがあり、許可が正しいことを確認してください。

表 83. 分類 XSLA: RawStore - Log.Generic database exceptions

SQLSTATE | 文言
XSLA0 | ログ・ファイルをディスク <値> にフラッシュできません。
XSLA1 | ログ・レコードがストリームに送信されましたが、ストア (オブジェクト <オブジェクト>) に適用できません。 このことが原因でリカバリー問題も発生する可能性があります。
XSLA2 | システムはシャットダウンします。ログ・ファイルへのアクセス中に入出力例外が発生しました。
XSLA3 | ログが破壊されており、ログ・ストリームに無効なデータがあります。
XSLA4 | ログに書き込めません。ログが満杯の可能性があります。 不必要なファイルを削除してください。 ファイル・システムが読み取り専用である、ディスクに障害がある、またはメディアに何らかの問題がある可能性もあります。
XSLA5 | 何らかの理由によりログ・ストリームを読み取ってトランザクション <トランザクション識別子> をロールバックすることができません。
XSLA6 | データベースをリカバリーできません。
XSLA7 | ログにあるオペレーション <オペレーション> を再実行できません。
XSLA8 | トランザクション <値> をロールバックできません。<値> で <値> オペレーションの補正を試行します。
XSLAA | このストアは、以前に発生した例外によりシャットダウンとマークされています。
XSLAB | ログ・ファイル <ログファイル名> が見つかりません。logDevice プロパティーが、使用するプラットフォームに適切なパス区切り記号で正しく設定されていることを確認してください。
XSLAC | <値> のデータベースのフォーマットはこのソフトウェアの現行バージョンと非互換です。このデータベースは、それより新しいバージョンで作成またはアップグレードされた可能性があります。
XSLAD | ログ・ファイル <ログファイル名> のインスタンス <値> にあるログ・レコードが破壊されています。 予期されていたログ・レコード長は <値> でしたが、実際の長さは <値> でした。
XSLAE | <値> の制御ファイルは、書き込みまたは更新できません。
XSLAF | 読み取り専用データベースがダーティー・データ・バッファーを使って作成されました。
XSLAH | 読み取り専用データベースが更新されています。
XSLAI | チェックポイント・ログ・レコードをログに記録できません
XSLAJ | ロギング・システムは、以前に発生した問題のためにシャットダウンするとマークされており、システムがシャットダウンして再始動されるまで、これ以上何も操作はできません。
XSLAK | データベースは、最大ログ・ファイル数 <値> を超えました。
XSLAL | ログ・レコード・サイズ <値> が、最大許容ログ・ファイル・サイズ <値> を超えました。 ログ・ファイル <ログファイル名> (位置 <数>) でエラーを検出しました。
XSLAM | IOException のため、{1} のデータベース・フォーマットを検証できません。
XSLAN | <値> のデータベースのフォーマットは、このソフトウェアの現行バージョンと非互換です。 このデータベースは、バージョン <バージョン番号versionNumber> によって作成またはアップグレードされました。
XSLAO | 予期しない問題 <値> が原因で、リカバリーが失敗しました。
XSLAP | データベース (<値>) はバージョン <バージョン番号> です。 ベータ・データベースはアップグレードできません。
XSLAQ | ディレクトリー <ディレクトリ名> にログ・ファイルを作成できません。
XSLAR | リストアの間、ログ・ファイル '<ログファイル名>' を '<値>' にコピーできません。 十分なスペースがあり、許可が正しいことを確認してください。
XSLAS | リストアの間、バックアップの中にログ・ディレクトリー <ディレクトリ名> が見つかりません。 バックアップ・コピーが正しいものであり、それが破壊されていないことを確認してください。
XSLAT | ログ・ディレクトリー '<ディレクトリ名>' が存在します。 このディレクトリーは、別のデータベースに属している可能性があります。 logDevice 属性に指定した場所が正しいことを確認してください。

表 84. 分類 XSLB: RawStore - Log.Generic statement exceptions

SQLSTATE | 文言
XSLB1 | ログ・オペレーション <ログオペレーション> は、ログ・ストリームへの書き出し中にエラーを検出しました。誤ったログ・オペレーションが実行されたか、極端に大きなログ・オペレーションにより内部バッファーが満杯になったことが原因と考えられます。
XSLB2 | ログ・オペレーション <ログオペレーション> が超過データをロギングしています。内部ログ・バッファーが満杯です。
XSLB4 | truncationLWM <値> が見つかりません。
XSLB5 | 切り捨てポイント <値> に不正な truncationLWM インスタンス <値>。 正しい範囲は <値> から <値> です。
XSLB6 | 0 または -ve の長さのログ・レコードをログに記録しようとしています。
XSLB8 | <値> の限度を超えて、スキャンを <値> にリセットしようとしています。
XSLB9 | これ以上変更を発行できません。ログ・ファクトリーが停止されました。

表 85. 分類 XSRS: RawStore - protocol.Interface statement

SQLSTATE | 文言
XSRS0 | すでにフリーズした後にデータベースをフリーズすることはできません。
XSRS1 | データベースを <値> にバックアップできません。これはディレクトリーです。
XSRS4 | ファイルを (バックアップ中に) <値> から <値> に名前変更しようとしてエラーが発生しました。
XSRS5 | ファイルを (バックアップ中に) <パス> から <パス> にコピーしようとしてエラーが発生しました。
XSRS6 | バックアップ・ディレクトリー <ディレクトリー名> を作成できません。
XSRS7 | バックアップで予期しない例外がキャッチされました。
XSRS8 | ロギング用装置はデータベース作成時にしか設定できません。ここですぐに変更することはできません。
XSRS9 | レコード <レコード名recordName> は、もはや存在しません
XSRSA | ログ記録されておらずコミットされていないオペレーションが存在する場合は、データベースをバックアップできません。 バックアップをブロックしているオペレーションのトランザクションをコミットしてください。
XSRSB | ログ記録されておらずコミットされていないオペレーションを含むトランザクションではバックアップを実行できません。
XSRSC | データベースを <ディレクトリ位置directoryLocation> にバックアップできません。これはデータベース・ディレクトリーです。

表 86. 分類 XSTA2: XACT_TRANSACTION_ACTIVE

SQLSTATE | 文言
XSTA2 | トランザクションをアクティブにしようとしたとき、別のトランザクションがすでにアクティブでした。

表 87. 分類 XSTB: RawStore - Transactions.Basic system

SQLSTATE | 文言
XSTB0 | トランザクションのアボート中に例外がスローされました。
XSTB2 | トランザクションの変更をログに記録できません。おそらく読み取り専用データベースに書き込もうとしていると考えられます。
XSTB3 | (おそらく以前のエラーが原因で) ログ・マネージャーが NULL のため、トランザクションをアボートできません。
XSTB5 | ログを使用しないでデータベースを作成中に、予期しない問題が発生しました。
XSTB6 | 1 つのトランザクション表がすでに使用中の場合、それを別のトランザクション表に置換することはできません。

表 88. 分類 XXXXX: No SQLSTATE

SQLSTATE | 文言
XXXXX | 通常のデータベース・セッション・クローズ。

JDBC リファレンス
Derbyは組み込みのJDBCドライバと共に提供されます。
それによってJDBC APIが提供されます。これはDerbyのデータベースを利用するための唯一つのAPIです。 このドライバはJavaで実装された独自プロトコルのドライバです。(Sunによる定義に従えば、タイプ4です。)
この節ではDerbyにおけるJDBC APIの実装に関する情報を提供して、JDBC 2.0、3.0、4.0のAPIにどのように準拠しているかが書かれています。
やりたい事に対するドライバの利用方法を知るには、Derby ディベロッパーズ ガイドを参照してください。
このJDBCドライバはSunが定義する標準のJDBCインターフェイスを実装します。 Derbyと同じJVMにて実行されているアプリケーションから呼び出す場合、JDBCドライバは組み込みモードのデータベースへの接続をサポートします。 データベースへのネットワークを介する通信は必要ありません。 クライアント/サーバモードでは、クライアントはJDBCの要求をネットワーク越しにJDBCのサーバに送ります。一方でサーバはDerbyと同じJVMにて動作しており、要求を組込みのJDBCドライバを介してDerbyに送ります。
Derbyが提供するJDBCの実装は、Derbyのデータベースへアクセスする機能を提供して、必要な全てのJDBCのインターフェイスを提供します。 JDBCドライバにて実装されていない局面では、"Feature not implemented"で始まる文言およびXJZZZというSQLStateのSQLExceptionが返されます。 これらの実装されていない局面は、Derbyにて実装されていない機能に対応するものです。
java.sqlにある、JDBCの主なクラス、 インターフェイス、メソッド
この節では以下に挙げるjava.sqlのクラス、インターフェイス、メソッドの、Derbyにおける実装を説明します。

• |  | java.sql.Driverインターフェイス
• |  | java.sql.DriverManager.getConnection メソッド
• |  | java.sql.Driver.getPropertyInfo メソッド
• |  | java.sql.Connection インターフェイス
• |  | java.sql.DatabaseMetaData インターフェイス
• |  | java.sql.Statementインターフェイス
• |  | java.sql.PreparedStatementインターフェイス
• |  | java.sql.CallableStatement インターフェイス
• |  | java.sql.ResultSet インターフェイス
• |  | java.sql.ResultSetMetaData インターフェイス
• |  | java.sql.SQLException クラス
• |  | java.sql.SQLWarning クラス
• |  | SQL型とjava.sql.Typesの対応

java.sql.Driverインターフェイス
Derbyの単独環境向けのドライバは、org.apache.derby.jdbc.EmbeddedDriverによりロードします。 以下にクラスのインスタンスを作成する方法を幾つか挙げます。 java.sql.Driverのインターフェイスは直接使わないでください。接続を作るにはDriverManagerクラスを使います。

• |  | もしアプリケーションがJDK1.6以上のバージョンで動作しているなら、以下のいずれも行う必要はありません。アプリケーションが最初に接続を要求したときに、自動的にEmbeddedDriverがロードされます。
• |  | Class.forName("org.apache.derby.jdbc.EmbeddedDriver") インスタンスを作成することでどのJVMでも同じ時にクラスをロードできるので、この方法をお勧めします。
• |  | new org.apache.derby.jdbc.EmbeddedDriver() Class.forName("org.apache.derby.jdbc.EmbeddedDriver")と同様ですが、プログラムをコンパイルするときにクラスを必要とします。
• |  | Class c = org.apache.derby.jdbc.EmbeddedDriver.class これもClass.forName("org.apache.derby.jdbc.EmbeddedDriver")と同様ですが、プログラムをコンパイルするときにクラスを必要とします。擬似的な静的なフィールドのclassは、指定された名前のクラスと評価されます。
• |  | システムプロパティのjdbc.drivers システムプロパティの設定は、起動のコマンドラインあるいはアプリケーション内にて行います。アプレットではこれは不可能です。

    java -Djdbc.drivers=org.apache.derby.jdbc.EmbeddedDriver
        applicationClass

jdbc:derby:プロトコルを処理するためにDriverManagerへ実際に登録されるドライバは、org.apache.derby.jdbc.EmbeddedDriverではありません。このクラスのすることは、必要とされるDerbyドライバを検知して、Derbyドライバを読み込むだけです。
jdbc:derby:プロトコルを介して、Derbyのシステムに接続する方法は、DriverManagerを使ってドライバ(java.sql.Driver)を得るか、 あるいはgetDriverとgetConnectionメソッドを使って、接続(java.sql.Connection)を得る方法の二つです。
java.sql.Driver.getPropertyInfo メソッド
ドライバマネージャから取得したJDBCドライバより、DriverPropertyInfoオブジェクトを得ることができます。

    java.sql.DriverManager.getDriver("jdbc:derby:").
        getPropertyInfo(URL, Prop)

org.apache.derby.jdbc.EmbeddedDriverは実際のドライバを読み込む一時的なクラスであり、このクラスからDriverPropertyInfoオブジェクトを得てはなりません。
このメソッドはDriverPropertyInfoオブジェクトを返します。 Derbyでは、このオブジェクトはデータベース接続URLの属性の配列からなります。 最も便利な属性は、databaseName=nameofDatabase,で、これは現在のシステムにて起動されたデータベースのリストです。
例えばDerbyのシステムにて、システムディレクトリにtoursDBとflightsDBの二つのデータベースがあって、システムの全データベースが自動的に起動して、ユーザはA:/dbs/tours94に接続しているとします。 getPropertyInfoが返す配列には、databaseName属性に対応するオブジェクトが一つあります。 このDriverPropertyInfoオブジェクトにあるchoicesフィールドは、toursDB、flightsDB、A:/dbs/tours94の三つの文字列からなる配列を値にとります。 このようなオブジェクトが返されるのは、接続オブジェクトに(どのような形であれ)データベース名がまだ無いか、shutdown属性がtrueである場合の何れかです。
java.sql.Driver.getPropertyInfoについてのより詳細な情報については、Derby ディベロッパーズ ガイドの8章にある、「接続の選択項目をユーザに提供する」を参照してください。
java.sql.DriverManager.getConnection メソッド
JDBC APIを利用するアプリケーションは、データベースへ接続を確立するために、Connectionオブジェクトを取得します。Connectionオブジェクトの取得は、データベースへの接続URLを引数にとって、DriverManager.getConnectionメソッドを呼ぶ方法が一般的です。 JDBCのデータベース接続URL(uniform resource locator)により、データベースが特定されます。
DriverManager.getConnectionはデータベース接続URLに加えてPropertiesオブジェクトを引数にとる事ができます。このPropertiesオブジェクトによりデータベース接続URLに属性を与えることができます。
また、ユーザ名・パスワードの文字列を与えることもできます。これらの引数が与えられた場合、Derbyにてユーザ認証が有効であるなら、現在のシステムにて各値が有効であるかが確認されます。 ユーザ名はDerbyに、認証識別子として与えられます。この値により、ユーザがデータベースへのアクセスの許可・不許可、また既定のスキーマが決まります。 接続を確立するとき、ユーザが指定されていなければ、Derbyは既定でユーザをAPPとします。これはDerbyにて既定スキーマの名前でもあります。 もしユーザが指定されれば、既定のスキーマはユーザ名と同じになります。
Derbyのデータベース接続URL構文
Derbyのデータベース接続URLは、基本的なデータベース接続URLと、必要に応じて記述されるサブサブプロトコルおよび属性から構成されます。
この節は参照先を記すだけです。例を含む詳細な記述は、Derby ディベロッパーズ ガイドの第1章にある「データベースへの接続」を参照してください。
組み込みデータベースのアプリケーションのデータベース接続URL構文
組み込みデータベースのアプリケーションでは、データベース接続URLは次のとおりです。

    jdbc:derby: [サブサブプロトコル:][データベース名][;属性]*

• |  | jdbc:derby: JDBCにてderbyは、Derbyのデータベースに接続するためのサブプロトコルです。 このサブプロトコルは常にderbyで、それ以外となることはありません。
• |  | サブサブプロトコル: サブサブプロトコルは必要に応じて記述され、Derbyがデータベースを探すディレクトリやクラスパス、jarファイルを指定します。サブサブプロトコルが使われることは稀ですが、多くの場合は読み取り専用のデータベースに対して使われます。 サブサブプロトコル は以下のいずれかです。
• |  | directory
• |  | classpath: データベースは読み取り専用と扱われ、クラスパスのディレクトリやアーカイブでの相対的な位置を指定するため、全てのデータベース名は、最低一つのスラッシュから始まらなければなりません。(暗黙値なので、サブサブプロトコルにclasspathを指定する必要はありません)
• |  | jar データベースは読み取り専用と扱われます。
jar: はデータベース名:の直前に、追加の要素を必要とします。
    (アーカイブへのパス)
アーカイブへのパスはデータベースのあるjarやzipファイルへの、ファイル名を含むパスです。 読み取り専用のデータベースへのデータベース接続URLの例は、Derby ディベロッパーズ ガイドを参照してください。
• |  | データベース名 接続先である、既存あるいは新規のデータベース名を指定します。 データベース名は単独で指定することも、相対/絶対パスと共に指定することもできます。Derby ディベロッパーズ ガイドの第1章にある、 "標準的な接続-ファイルシステムにあるデータベースへの接続"を参照してください。
• |  | 属性 0個以上のデータベース接続URL属性を指定します。属性の詳細はDerbyのデータベース接続URLの属性にて記述されます。

その他のSQL構文
Derbyではデータベース側のJDBC手続きやメソッドにて、次のSQL標準の構文により、現在の接続への参照を得ることができます。

    jdbc:default:connection

Derbyのデータベース接続URLの属性
データベース接続URLには必要に応じて属性を記述することができます。 Derbyはこれらの属性を、内部的にプロパティオブジェクトとして取り扱います。従って、DriverManager.getConnectionにPropertiesオブジェクトを渡すことで属性を指定することもできます。(これらの属性はシステムプロパティとして指定できません。DriverManager.getConnectionに渡すオブジェクトでのみ指定できます。)
これらの属性はDerby固有で、データベース接続URLに属性を指定する。にその一覧があります。
属性の名前と値の組は、接続の呼び出しにて提供されるプロパティオブジェクトに渡されます。接続の呼び出しにてプロパティオブジェクトが提供されない場合、データベース接続URLの情報だけを持つプロパティオブジェクトが作成されます。

    import java.util.Properties;

    Connection conn = DriverManager.getConnection(
        "jdbc:derby:sampleDB;create=true");
    /* 属性をPropertiesオブジェクトに渡す。*/
    Properties myProps = new Properties();
    myProps.put("create", "true");
    Connection conn = DriverManager.getConnection(
        "jdbc:derby:sampleDB", myProps);

    /* ユーザ名およびパスワードを渡す。*/
    Connection conn = DriverManager.getConnection(
        "jdbc:derby:sampleDB", "dba", "password");

Note: 属性は構文解析のとき正しいか否かを判定されません。もし間違えた属性と値を渡した場合、その情報は単純に無視されます。(Derbyには属性が正しいかを判定するためのツールがあります。より詳しい情報はDerby ツールとユーティリティーガイドを参照してください。)
java.sql.Connection インターフェイス
Derbyでは、Connectionオブジェクトから作成された他の全てのJDBCオブジェクトが明示的にクローズされるかガベージコレクトされるまでは、Connectionオブジェクトはガベージコレクトされません。また、文を実行するために不要になるまでは、Connectionを閉じてはなりません。
接続レベルのあるいはそれ以上に深刻な例外が発生した場合、Connectionおよび、それから作成された他の全てのJDBCオブジェクトがクローズされます。システムレベルの深刻度の例外が発生すると、Derbyのシステム全体が終了します。その場合、Connectionがクローズされるだけではなく、そのJVMにて新規のConnectionを作成できなくなります。
java.sql.Connection.setTransactionIsolation メソッド
Derbyのデータベースで可能なトランザクション分離レベルは、java.sql.Connection.TRANSACTION_SERIALIZABLE、 java.sql.Connection.TRANSACTION_REPEATABLE_READ、 java.sql.Connection.TRANSACTION_READ_COMMITTED それとjava.sql.Connection.TRANSACTION_READ_UNCOMMITTED です。
既定の分離レベルは、TRANSACTION_READ_COMMITTED です。
接続の分離レベルをsetTransactionIsolationで変更すると、現在のトランザクションはコミットされ、新しいトランザクションが開始されます。 トランザクション分離のより詳細な情報については、Derby ディベロッパーズ ガイドの、「ロック、同時並行性および分離」を参照してください。
java.sql.Connection.setReadOnly メソッド
java.sql.Connection.setReadOnlyが利用可能です。
詳細な情報については、Derby サーバと管理ガイドの、「Connection.setReadOnly メソッドの利用による違い」を参照してください。
java.sql.Connection.isReadOnly メソッド
もし接続先が読み込み専用のデータベースであれば、適切なisReadOnlyデータベースメタ情報の値が返ります。例えば、ConnectionsがsetReadOnlyメソッドで読み込み専用に設定されたり、(Derby の属性にに基づき、)ConnectionsにてユーザがreadOnlyAccessなユーザとされていたり、 読み込み専用な媒体に置かれたデータベースへの接続では、真が返ります。
利用不可能な接続の機能
Derby ではカタログ名は利用されていません。さらに、以下のメソッドでは、"機能がサポートされてない"例外が挙がります。

• |  | createArrayOf( java.lang.String, java.lang.Object[] )
• |  | createNClob( )
• |  | createSQLXML( )
• |  | createStruct( java.lang.String, java.lang.Object[] )
• |  | getTypeMap( )
• |  | prepareStatement( java.lang.String, int[] )
• |  | prepareStatement( java.lang.String, java.lang.String[] )
• |  | setTypeMap( java.util.Map )

java.sql.DatabaseMetaData インターフェイス
この節では、Derbyでの、java.sql.DatabaseMetaDataの機能について説明します。
DatabaseMetaData 結果セット
自動コミットが有効であったとしても、DatabaseMetaData結果セットが、他の文の結果セットを閉じることはありません。
ユーザがJDBCのオブジェクトに行った操作により、自動的なコミットが行われるとき、DatabaseMetaData結果セットは閉じられます。もし自動的なコミットを起こすような他の操作を実行している間、DatabaseMetaData結果セットにアクセスできるようにする必要があるなら、setAutoCommit(false)により 自動コミットを切ってください。
java.sql.DatabaseMetaData.getProcedureColumnsメソッド
DerbyはJavaの手続きをサポートします。Derbyでは、SQLの文からJavaの手続きを呼ぶことができます。 getProcedureColumnsを呼び出すと、Derbyは、引数の情報を返します。 もし対応するJavaのメソッドがオーバーロードされていた場合、メソッドはそれぞれのシグネチャを別個に返します。 Derbyは、CREATE PROCEDUREで定義された全てのJava手続きの情報を返します。
getProcedureColumnsはResultSetを返します。それぞれの行には単一の引数あるいは返り値が記述されます。
getProcedureColumnsの引数
JDBC APIで定められたこのメソッドの引数は、以下のとおりです。

• |  | catalog Derbyでは、この引数にはnullを渡してください。
• |  | schemaPattern Javaの手続きはスキーマを持ちます。
• |  | procedureNamePattern 手続き名のパターンを表す文字列オブジェクトです。
• |  | column-Name-Pattern 引数名もしくは返り値の名前パターンを表す文字列オブジェクトです。この値に一致する名前が、CREATE PROCEDURE文にてJavaの手続きに定義されています。全ての引数名を見つけるためには「%」を使ってください。

getProcedureColumnsから返る結果セットにある列について
getProcedureColumnsから返るResultSetの列はAPIにて既定されています。ここでは、APIにて定められていない詳細を幾つかの列について記述します。

• |  | PROCEDURE_CAT Derbyでは常に「null」です。
• |  | PROCEDURE_SCHEM Javaの手続きのスキーマです。
• |  | PROCEDURE_NAME 手続きの名前です。
• |  | COLUMN_NAME 引数の名前です。(column-Name-Patternを参照してください。)
• |  | COLUMN_TYPE shortで行を記述します。配列ではないメソッドの引数ならば、常にDatabaseMetaData.procedureColumnInです。もし配列であるメソッドの引数なら、DatabaseMetaData.procedureColumnInOutです。返り値であれば、常にDatabaseMetaData.procedureColumnReturnです。
• |  | TYPE_NAME Derby固有の型名です。
• |  | NULLABLE プリミティブな引数なら常にDatabaseMetaData.procedureNoNullsで、オブジェクトの引数ならDatabaseMetaData.procedureNullableです。
• |  | REMARKS a String describing the java type of the method parameter
• |  | COLUMN_DEF 列の既定値を表す文字列です。(nullである場合もあります。)
• |  | SQL_DATA_TYPE 将来利用するため、JDBCにて予約されています。
• |  | SQL_DATETIME_SUB 将来利用するため、JDBCにて予約されています。
• |  | CHAR_OCTET_LENGTH 文字やバイナリ列の最大長です。(他の型であれば値はNULLです。)
• |  | ORDINAL_POSITION 手続きの入力/出力する引数への、1から始まる順番です。
• |  | IS_NULLABLE 引数を空とすることができるかを表す文字列です。(YESなら引数にNULLを含めることができ、NOならできません。)
• |  | SPECIFIC_NAME スキーマにて手続きを一意に特定する名前です。
• |  | METHOD_ID Derby固有の列です。
• |  | PARAMETER_ID Derby固有の列です。

java.sql.DatabaseMetaData.getBestRowIdentifierメソッド
java.sql.DatabaseMetaData.getBestRowIdentifierメソッドは決められた優先順位で識別子を探します。必ずしも行を特定できる情報が見つかるわけではありません。
java.sql.DatabaseMetaData.getBestRowIdentifierメソッドは以下の順序で識別子となる情報を探します。

• |  | 表の主キー
• |  | 表の一意性制約あるいは一意性索引
• |  | 表にある全列

Note: java.sql.DatabaseMetaData.getBestRowIdentifierメソッドは、主キー、一意性制約・一意性索引を見つけられない場合に、表にある全列から識別子を探し出します。このようにして識別子をメソッドが探し出す時、メソッドは行を特定する列の集合を必ず見つけ出します。しかしこうして得られた列の集合の値が重複した行が、表に存在する場合があり、その場合は一意に行を見つけることはできません。
java.sql.Statementインターフェイス
JDBC 1.2に規定される、java.sql.StatementのsetEscapeProcessingメソッドは、Derbyにて実装されていません。 また、以下のメソッドは「機能未実装」の例外を挙げます。

• |  | cancel( )
• |  | execute( java.lang.String, int[] )
• |  | execute( java.lang.String, String[] )
• |  | executeUpdate( java.lang.String, int[] )
• |  | executeUpdate( java.lang.String, String[] )

ResultSet オブジェクト
先立ってSELECT文が実行された時に例外が発生すると、ResultSetを開くことができません。ResultSetが開いた後であれば、同様のエラーが発生しても、ResultSetが閉じられることはありません。
例えば、java.sql.Statementやjava.sql.PreparedStatementのexecuteQueryメソッドにて、零除算エラーが発生した場合、例外が挙がって結果セットは返りません。一方で同様のエラーがResultSetオブジェクトのnextメソッドで発生しても結果セットが閉じてしまうことはありません。
最初の行が取り出される前にシステムが部分的に問合せを実行した場合、ResultSetが作成されるときにエラーが発生することがあります。 このエラーは一つ以上の表を使う問合せや、集約、GROUP BY、ORDER BY、DISTINCT、INTERSECT、EXCEPT、UNIONを使う問合せにて発生することがあります。
Statementを閉じると、その文で開いた全てのResultSetオブジェクトも閉じます。
ResultSetのカーソルには、文が実行される前にカーソル名を与えることができます。ただし一旦実行された後では、カーソルの名前を変更することはできません。
java.sql.CallableStatement インターフェイス
Derbyでは、JDBC 1.2の定めるCallableStatementの全メソッドが使えます。

• |  | getBoolean()
• |  | getByte()
• |  | getBytes()
• |  | getDate()
• |  | getDouble()
• |  | getFloat()
• |  | getInt()
• |  | getLong()
• |  | getObject()
• |  | getShort()
• |  | getString()
• |  | getTime()
• |  | getTimestamp()
• |  | registerOutParamter()
• |  | wasNull()

CallableStatementsとOUT引数
Derbyでは、OUT引数と値を返すCALL文が用意されています。その例を以下に挙げます。

    CallableStatement cs = conn.prepareCall(
       "? = CALL getDriverType(cast (? as INT))"
    cs.registerOutParameter(1, Types.INTEGER);
    cs.setInt(2, 35);
    cs.executeUpdate();

Note: 手続きのCALL文で値を返す事は、? =の構文でのみ可能です。
呼び出しを実行する前に、出力の引数の型を登録してください。
CallableStatementsとINOUT引数
Javaのプログラムでは、INOUT引数に対して引数の型を要素とする配列が対応します。(メソッドは配列を引数としてとらなければなりません。) この対応関係はSQL標準の推奨に沿ったものです。
次の例を考えます。:

    CallableStatement call = conn.prepareCall(
        "{CALL doubleMyInt(?)}");
    // 値を代入する前に引数を登録する事が、
    // inout引数では良いやり方です。
    call.registerOutParameter(1, Types.INTEGER);
    call.setInt(1,10);
    call.execute();
    int retval = call.getInt(1);

メソッドのdoubleItは一次元のint配列を取るべきです。メソッドのソースコードを次に例示します。

    public static void doubleMyInt(int[] i) {
        i[0] *=2;
        /* Derbyは配列の最初の要素を返します。*/
    }

Note: メソッドの引数と違って、返り値は配列ではありません。
表 89. INOUTの引数型の対応

JDBCの型 | メソッドの引数の配列型 | 値と返り値の型
BIGINT | long[] | long
BINARY | byte[][] | byte[]
BIT | boolean[] | boolean
DATE | java.sql.Date[] | java.sql.Date
DOUBLE | double[] | double
FLOAT | double[] | double
INTEGER | int[] | int
LONGVARBINARY | byte[][] | byte[]
REAL | float[] | float
SMALLINT | short[] | short
TIME | java.sql.Time[] | java.sql.Time
TIMESTAMP | java.sql.Timestamp[] | java.sql.Timestamp
VARBINARY | byte[][] | byte[]
OTHER | yourType[] | yourType
JAVA_OBJECT (Java2/JDBC 2.0の環境でのみ有効) | yourType[] | yourType

呼び出し前に出力の引数を登録してください。INOUTの引数では、値を代入する前に出力の引数を登録するのが良いやり方です。
java.sql.SQLException クラス
Derbyでは、SQLExceptionsのgetMessage()、getSQLState()、getErrorCode()を呼び出した時の値が用意されています。 さらに、DerbyではnextExceptionにより連鎖的な複数のSQLExceptionsが返ることがあります。 Derby固有な例外に先立って、SQL-92標準の最も深刻な内容の例外が最初に置かれます。 SQLExceptionsの処理の詳細については、Derby ディベロッパーズ ガイド第5章の、"アプリケーションにてDerbyのSQLExceptionsを扱う"を参照してください。
java.sql.PreparedStatementインターフェイス
Derbyでは、JDBC 1.2にて必須とされる全ての型変換および、それぞれの型に対応したsetXXXの呼び出しが可能で、setObject(Value,JDBCTypeCode)が呼び出された場合と同様に処理されます。
従って全ての対象となる型について、setStringを使うことができます。
実行に先立ちPreparedStatementのsetCursorNameメソッドを呼び出すことができ、カーソルが作成される時に適用されるカーソル名を指定できます。
準備済み文と列のストリーミング
setXXXStreamにより、アプリケーションとデータベース間で情報を通信させることができます。
JDBCではINの引数に、Javaの入力ストリームをとって、大規模な情報を小分けにして渡すことができます。文が実行されると、JDBCドライバはこの入力ストリームへの呼び出しを繰り返します。 DerbyではJDBC 1.2が提供する三種類のストリームを利用することができます。 この三種類のストリームとは、

• |  | setBinaryStream 解釈されないバイトストリームに使われます。
• |  | setAsciiStream ASCII文字のストリームに使われます。
• |  | setUnicodeStream Unicode文字のストリームに使われます。

JDBC 2.0やJDBC 3.0ではストリームの長さを指定する必要があります。DerbyではアプリケーションがJDK 1.5以前の環境で動作している時、この事は要件です。JDK1.6以降の環境では、DerbyはJDBC4.0の実装を提供します。これによりストリーム長を指定する必要のないストリームのインターフェイスを使うことができます。 これらの三つのメソッドに渡すストリームオブジェクトは、標準のJavaストリームオブジェクトあるいは標準のjava.io.InputStreamインターフェイスを実装する、ユーザが定義したサブクラスの何れであっても構いません。
JDBCの標準に従い、ストリームは以下の表に記すデータ型の列に対してのみ記録できます。
表 90. ストリーム可能なJDBCのデータ型

列のデータ型 | 対応するJavaの型 | AsciiStream | UnicodeStream | BinaryStream
CLOB | java.sql.Clob | x | x | '
CHAR | ' | x | x | '
VARCHAR | ' | x | x | '
LONGVARCHAR | ' | X | X | '
BINARY | ' | x | x | x
BLOB | java.sql.Blob | x | x | x
VARBINARY | ' | x | x | x
LONGVARBINARY | ' | x | x | X

Note:

• |  | この表にて大文字のXは、ストリームの型として推奨される対照型である事を表します。SQL型とjava.sql.Typesの対応を参照してください。
• |  | もしストリームの記録される列の型がLONG VARCHARないしLONG VARCHAR FOR BIT DATAの何れでも無い場合、ストリーム全体が一括してメモリに収まらなければなりません。 LONG VARCHARおよびLONG VARCHAR FOR BIT DATAの列に記録されるストリームについては、この制限はありません。
• |  | ストリームを他の組み込みデータ型やユーザが定義したデータ型に記録することはできません。

以下の例はjava.io.Fileをストリーム経由でLONG VARCHAR型の列に格納する方法を示します。

    Statement s = conn.createStatement();
    s.executeUpdate("CREATE TABLE atable (a INT, b LONG VARCHAR)");
    conn.commit();
    java.io.File file = new java.io.File("derby.txt");
    int fileLength = (int) file.length();
    // まず入力ストリームを作ります。
    java.io.InputStream fin = new java.io.FileInputStream(file);
    PreparedStatement ps = conn.prepareStatement(
        "INSERT INTO atable VALUES (?, ?)");
    ps.setInt(1, 1);
    // 入力パラメータに入力ストリームを代入します。
    ps.setAsciiStream(2, fin, fileLength);
    ps.execute();
    conn.commit();

java.sql.ResultSet インターフェイス
ResultSetオブジェクトを介して利用されるカーソルに対して、位置に基づく更新や削除を行い、ResultSetオブジェクトの現在行を変更したり削除できます。
ある種の副作用的な処理にて、行が予め取り出されることがあります。そのため位置に基づく更新や削除にて、ResultSetの現在行ではなく、元となるカーソルの行にたいして処理が行われることがあります。
Derbyでは、getXXXメソッドにてJDBC 1.2にて必須とされる全ての型変換が提供されています。
JDBCではResultSet.getBigDecimalにて利用される丸め処理の種類を定義しません。Derbyでは、java.math.BigDecimal.ROUND_HALF_DOWNを採用しています。
結果セットと列のストリーミング
もし元となるオブジェクトがOutputStreamクラスであれば、getBinaryStreamはそのオブジェクトを直接返します。
可能な型であればgetXXXStreamメソッドにより、列をストリーミングしてResultSetからフィールドを取得することができます。 何らかのストリームを利用可能な型の一覧については、ストリーム可能なJDBCのデータ型を参照してください。(また、SQL型とjava.sql.Typesの対応も参照してください。)
実際にストリームとして記録されているか否かにかかわらず、型に従いストリームとして取得することが可能か決まります。
次の例ではLONG VARCHARの列がストリームとして取得されます。

    // データをストリームとして取得する。
    ResultSet rs = s.executeQuery("SELECT b FROM atable");
    while (rs.next()) {
        // java.io.InputStreamを使ってデータを取得する。
        java.io.InputStream ip = rs.getAsciiStream(1);
        // ストリームを処理する。--これはデータを出力する// 一般的なやり方である。
        int c;
        int columnSize = 0;
        byte[] buff = new byte[128];
        for (;;) {
            int size = ip.read(buff);
            if (size == -1)
                break;
            columnSize += size;
            String chunk = new String(buff, 0, size);
            System.out.print(chunk);
        }
    }
    rs.close();
    s.close();
    conn.commit();

java.sql.ResultSetMetaData インターフェイス
DerbyではResultSetsの更新可能性や元の情報は追跡されません。従って以下のように各メソッドから定数的な値が返ります。

メソッド名 | 値
isDefinitelyWritable | false
isReadOnly | false
isWritable | false

java.sql.SQLWarning クラス
Derbyでは状況に応じた警告が発生する事があります。例えば、既に存在しているデータベースに対してcreate属性を真にして接続した場合、警告が発生します。またsum()のような集約においてNULL値が見つかった場合も警告が挙がります。
その他に位置づけられる全ての通知メッセージはDerbyシステムのderby.logファイルに書き出されます。 All other informational messages are written to the Derby system's derby.log file.
java.sql.SQLXMLインターフェイス
JDBC 4.0では、SQLのXML型の情報はjava.sql.SQLXMLに対応付けられます。しかしながら、Derbyでは、XML型はSQLの層でのみ実現されています。JDBCの側ではXML型や演算子は実現されていません。
Derbyでは、java.sql.SQLXMLオブジェクトのインスタンスを生成できません。またXMLの値を直接バインドしたり、結果セットから直接XMLの値を取得することもできません。XMLの値をバインドしたり取得する為には、SQLの問合せ文にてXMLPARSEやXMLSERIALIZE等のXML演算子を明示的に記述して、XMLの情報をJavaの文字列として扱う必要があります。
加えてDerbyでは、XML型についてJDBCメタデータの機能は実現されていません。
SQL型とjava.sql.Typesの対応
Derbyにてjava.sql.TypesはSQLデータ型に対応付けされます。
以下の表はjava.sql.TypesがSQL型にどのように対応付けられるかを示します。
表 91. SQL型とjava.sql.Typesの対応

java.sql.Types | SQL型
BIGINT | BIGINT
BINARY | CHAR FOR BIT DATA
BIT1 | CHAR FOR BIT DATA
BLOB | BLOB (JDBC 2.0以降)
CHAR | CHAR
CLOB | CLOB (JDBC 2.0以降)
DATE | DATE
DECIMAL | DECIMAL
DOUBLE | DOUBLE PRECISION
FLOAT | DOUBLE PRECISION2
INTEGER | INTEGER
LONGVARBINARY | LONG VARCHAR FOR BIT DATA
LONGVARCHAR | LONG VARCHAR
NULL | データ型ではなく、何れか特定の型の値
NUMERIC | DECIMAL
REAL | REAL
SMALLINT | SMALLINT
SQLXML3 | XML
TIME | TIME
TIMESTAMP | TIMESTAMP
VARBINARY | VARCHAR FOR BIT DATA
VARCHAR | VARCHAR

Notes:

1. |  | BITはJDBC 2.0以前の環境でのみ有効です。
2. |  | FLOAT型でのみ値を渡すことが可能ですが、DOUBLE PRECISIONの値として記録されます。また取得した場合の型はDOUBLEと判定されます。
3. |  | SQLXMLはJDBC 4.0以降の環境でのみ有効です。Derbyにて、SQLXMLはSQLのXML型に対応します。 しかし、Derbyはjava.sql.Types.SQLXMLのデータ型を認識せず、JDBCのレベルはXMLデータ型の機能を提供しません。XMLやそれに関連する演算子の機能はSQLの層でのみ実現されています。 詳細はXMLデータ型を参照してください。

java.sql.Blobインターフェイスとjava.sql.Clobインターフェイスの対応
JDBC 2.0ではjava.sql.BlobはSQLのBLOB(binary large object)型に対応して、java.sql.ClobはSQLのCLOB(character large object)型に対応します。
java.sql.Blobとjava.sql.Clobは情報(large object)全体ではなく、それへの論理的なポインタを表します。Derbyでは一時に唯一つのデータページだけがメモリ上で処理されます。BLOBの情報の最初の数バイトを読み書きするのに、LOB全体が処理される必要はありません。
現在のDerbyに組み込まれた型には、BLOBとCLOBが用意されています。 またDerbyはこれらのデータ型に対して以下の機能を提供します。

• |  | BLOBの機能 Derbyではjava.sql.Blobインターフェイスとjava.sql.PreparedStatementインターフェイス: JDBC2.0で提供されるメソッドおよびjava.sql.ResultSetのBLOBに関連したメソッドが用意されています。 CallableStatementのgetBlobメソッドは実装されていません。
• |  | CLOBの機能 Derbyではjava.sql.Clobインターフェイスとjava.sql.PreparedStatementインターフェイス: JDBC2.0で提供されるメソッドとjava.sql.ResultSetのCLOBに関連したメソッドが用意されています。 CallableStatementのgetClobメソッドは実装されていません。

java.sql.Blobとjava.sql.Clobの機能を使うには以下のようにします。

• |  | 情報をSQLのBLOB型で記録します。LONG VARCHAR FOR BIT DATA、BINARYおよびVARCHAR FOR BIT DATA型でも可能です。
• |  | 情報をSQLのCLOB型で記録します。LONG VARCHAR、CHARおよびVARCHAR型でも可能です。
• |  | java.sql.ResultSetインターフェイスのgetBlobあるいはgetClobメソッドを使って、参照される情報を扱うBLOBやCLOBを取得します。
• |  | LOBの列に対して静的なメソッドを呼ぶことはできません。

加えて文字列とBLOBの間で型変換を行うことは推奨されません。なぜなら型変換はプラットフォーム・データベースに依存するからです。
Derbyはユニコード文字列(1文字2バイト)を使いますが、他のデータベース製品はASCII文字(1文字あたり1バイト)を使うかもしれません。使われる文字コードの種類によっては一文字が数バイトを必要とすることも考えられます。文字列を記録する為に、Derbyでは他より大きなBLOBの型を必要とする場合があります。 文字列を記録する場合はCLOB型を利用するべきです。
BLOB、CLOB、(LOB型)の制約

• |  | LOB型は等号(=)や不等号(!=、 <>. で比較できません。
• |  | LOB型で順序付けることはできません。また<、 <=、 >、 >=による比較も不可能です。
• |  | LOB型への索引やLOB型の主キー列は不可能です。
• |  | LOB型について、DISTINCT、GROUP BY、ORDER BY節は利用できません。
• |  | 他の基本型と違い、LOB型では暗黙の型変換を行えません。

Derbyでは、CallableStatementのsetおよびgetメソッドを除いた、以下のJDBC 2.0のインターフェイスのメソッドが実装されています。
推奨事項:java.sql.Blobとjava.sql.Clobの生存期間はトランザクションがコミットされるとき終了するので、java.sql.Blobおよびjava.sql.Clobを利用するときは自動コミットを切って下さい。
表 92. 提供されるJDBC 2.0 java.sql.Blobのメソッド

返り値 | シグネチャ | 実装の覚書
InputStream | getBinaryStream() | '
byte[] | getBytes(long pos, int length) | pos < 1だったり、posがlengthより大きかったり、length <= 0であった場合、例外が発生します。
long | length() | '
long | position(byte[] pattern, long start) | pattern == nullであったり、start < 1であったり、patternの配列長が0であった場合、例外が発生します。
long | position(Blob pattern, long start) | pattern == nullだったり、start < 1だったり、patternの長さが0であったり、patternの最初の数バイトを読むとき例外が起きると、例外が発生します。

表 93. 提供されるJDBC 2.0 java.sql.Clob のメソッド

返り値 | シグネチャ | 実装上の覚書
InputStream | getAsciiStream() | '
Reader | getCharacterStream() | '
String | getSubString(long pos, int length) | pos < 1だったり、posが Clobの長さより大きかったり、length <= 0であった場合、例外が発生します。
long | length() | '
long | position(Clob searchstr, long start) | searchStr == nullだったりstart < 1だったり、searchStr の長さが0だったり、searchStrの最初の数バイトを読むとき例外が起きると、例外が発生します。
long | position(String searchstr, long start) | searchStr == nullだったり、start < 1だったり、patternが空文字列であった場合、例外が発生します。

java.sql.Blobとjava.sql.Clobの対応に関する但し書き:
Derbyのロック機構(共有ロック)にて、java.sql.Blobやjava.sql.Clobが指し示すデータベース上の情報の更新や削除は防がれています。 しかしながら、Derbyの即時ロックの機構は、java.sql.Blobやjava.sql.Clobに対応する列が守られていない瞬間の存在を許すことがあります。 引き続くgetBlob/getClobおよびjava.sql.Blob/java.sql.Clobの呼び出しは未定義な振る舞いを起こす可能性があります。
さらにjava.sql.Blob/java.sql.Clobを持つトランザクションが、(他のトランザクションに対して)、対応行を更新することを防ぐ機構はありません。(この問題はgetXXXStreamメソッドにも存在しています。) java.sql.Blob/java.sql.Clobが開いていており、アプリケーションプログラムにて対応する情報の更新が妨げられた場合、失敗したことにより予期せぬ振る舞いが起きる可能性があります。
ResultSet getXXXメソッドのうち以下の何れかに該当するメソッドは、それらを同一のカラムに対して複数回呼び出してははなりません。

• |  | getBlob
• |  | getClob
• |  | getAsciiStream
• |  | getBinaryStream
• |  | getUnicodeStream

これ等のメソッドは同一の対応するストリームを共有します。これらのメソッドを複数回呼び出すことにより、予期せぬ振る舞いを起こす可能性があります。 例を挙げます。

    ResultSet rs = s.executeQuery("SELECT text FROM CLOBS WHERE i = 1");
    while (rs.next()) {
        aclob=rs.getClob(1);
        ip = rs.getAsciiStream(1);
    }

サイズの大きな列の情報を扱うストリームはスレッドセーフではありません。従って、もしユーザが複数のスレッドを作成して、それらスレッドからストリームにアクセスした場合、未定義の動作を起こします。
Clobにはロケールによる振る舞いの違いがありません。
JDBC 2.0 の機能
この節の文書では、Derbyにて提供されている、JDBC2.0以降で利用できるメソッドを説明します。
java.sql.Connection インターフェイス: JDBC 2.0で利用可能なメソッド
表 94. Connecctionにて利用可能なJDBC 2.0のメソッド

返り値 | シグネチャ
Statement | createStatement( int resultSetType, int resultSetConcurrency)
PreparedStatement | prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
CallableStatement | prepareCall(String sql, int resultSetType, int resultSetConcurrency

実装のための但し書き
実装されている結果セットは、ResultSet.TYPE_FORWARD_ONLYとResultSet.TYPE_SCROLL_INSENSITIVEの二種類です。 TYPE_SCROLL_SENSITIVEを要求した場合、DerbyはSQLWarningを発行して、TYPE_SCROLL_INSENSITIVEなResultSetを返します。
これ等のメソッドでは、ResultSet.CONCUR_READ_ONLYとResultSet.CONCUR_UPDATABLEの二種類の平行処理が実現されています。
java.sql.DatabaseMetaData インターフェイス: 利用可能なJDBC 2.0のメソッド
Derbyでは、このインターフェイスにあるJDBC 2.0の全メソッドが実装されています。
java.sql.PreparedStatementインターフェイス: JDBC2.0で提供されるメソッド
表 95. java.sql.PreparedStatementで利用可能なJDBC 2.0のメソッド

返り値 | シグネチャ | 実装の但し書き
void | addBatch() | '
ResultSetMetaData | getMetaData() | '
void | setBlob(int i, Blob x) | '
void | setClob(int i, Clob x) | '

java.sql.ResultSet
表 96. ResultSetにて利用可能なJDBC 2.0のメソッド

返り値 | シグネチャ | 実装の但し書き
boolean | absolute(int row) | '
void | afterLast() | '
void | beforeFirst() | '
void | beforeFirst() | '
void | deleteRow() | 行を削除するとResultSetの位置は次行の直前となります。ResultSetのcloseメソッド以外を呼び出す場合、プログラムはResultSetの位置を決めなおす必要があります。
boolean | first() | '
Blob | getBlob(int columnIndex) | java.sql.Blobインターフェイスとjava.sql.Clobインターフェイスの対応を参照してください。
Blob | getBlob(String column-Name)
Clob | getClob(int columnIndex)
Clob | getClob(String column-Name)
int | getConcurrency() | Statementの平行処理がCONCUR_READ_ONLYである場合、このメソッドはResultSet.CONCUR_READ_ONLYを返します。 それに対してStatementの平行処理がCONCUR_UPDATABLEであった場合、返り値の値は元となるSQLの結果セットが更新可能か否かにより決まります。もしSQLの結果セットが更新可能であれば、getConcurrency()はResultSet.CONCUR_UPDATABLEを返します。もしSQLの結果セットが更新不可能であれば、ResultSet.CONCUR_READ_ONLYが返ります。
int | getFetchDirection() | '
int | getFetchSize() | Always returns 1.
int | getRow() | '
void | insertRow() | '
boolean | isAfterLast() | '
boolean | isBeforeFirst | '
boolean | isFirst() | '
boolean | isLast() | '
boolean | last() | '
void | moveToCurrentRow() | '
void | moveToInsertRow() | '
boolean | previous() | '
boolean | rowDeleted() | 前方にのみ進むことができる結果セットではこのメソッドは常にfalseを返し、スクロール可能な結果セットにて行が削除された時には、このメソッドは結果セットあるいは位置指定した削除を介してtrueを返します。
boolean | rowInserted() | 常にfalseが返ります。
boolean | rowUpdated() | 前方にのみ進むことができる結果セットではこのメソッドは常にfalseを返し、スクロール可能な結果セットにて行が更新された時には、このメソッドは結果セットあるいは位置指定した更新を介してtrueを返します。
boolean | relative(int rows) | '
void | setFetchDirection(int direction) | '
void | setFetchSize(int rows) | A fetch size of 1 is the only size supported.
void | updateRow() | 行を更新した直後、ResultSetの位置は次行の直前となります。 ResultSetのcloseメソッド以外を呼び出す場合、プログラムはResultSetの位置を決めなおす必要があります。

java.sql.ResultSetMetaData インターフェイス: JDBC 2.0で利用可能なメソッド
Derbyでは、このインターフェイスにあるJDBC 2.0の全メソッドが実装されています。
java.sql.Statement インターフェイス: 利用可能なJDBC 2.0のメソッド
表 97. java.sql.Statementで利用可能なJDBC2.0のメソッド

返り値 | シグネチャ | 実装の但し書き
void | addBatch(String sql) | '
void | clearBatch() | '
int[] | executeBatch() | '
int | getFetchDirection() | 例外は挙がらないが、メソッド呼出は無視される。
int | getFetchSize() | 例外は挙がらないが、メソッド呼出は無視される。
int | getMaxFieldSize() | '
void | getMaxRows() | '
void | setEscapeProcessing(boolean enable) | '
void | setFetchDirection(int direction) | 例外は挙がらないが、メソッド呼出は無視される。
void | setFetchSize(int rows) | 例外は挙がらないが、メソッド呼出は無視される。
void | setMaxFieldSize(int max) | BlobsとClobsには働かない。
void | setMaxRows() | '

java.sql.BatchUpdateException クラス
バッチ更新にて問題が発生したとき挙がります。
Connected Device ConfigurationおよびFoundation Profile向けのJDBCパッケージ(JSR169)
DerbyではJSR169すなわち、Connected Device ConfigurationおよびFoundation Profile向けに定義されたJDBC APIが利用可能です。この機能ではJDBC 3.0の機能が部分的に利用できます。JSR169は組込みのドライバでのみ利用可能です。DerbyではネットワークサーバをJSR169の元で利用することはできません。
JSR169の仕様に基づき接続を確立するために、org.apache.derby.jdbc.EmbeddedSimpleDataSourceクラスを利用します。このクラスはorg.apache.derby.jdbc.EmbeddedDataSourceと実装的に同じものです。 org.apache.derby.jdbc.EmbeddedDataSourceクラスの属性の使い方については、Derby ディベロッパーズ ガイドの情報を参照してください。
この他、DerbyにてJSR169の実装を使うときに意識するべき事柄を挙げます。:

• |  | アプリケーションはDECIMALの値を取得したり設定したりするとき、getString()やsetString()のような、getXXXおよびsetXXXのうち、代替となるJDBCのメソッドを利用しなければなりません。JDBC 2.0やJDBC 3.0にてDECIMAL型に対して利用可能な代替のメソッドはJSR169にて何れも利用できます。
• |  | CONTAINS SQLやREADS SQL DATA、MODIFIES SQL DATA等のサーバ側のJDBC引数をとるJavaによる関数やプロシージャは、JSR169では利用できません。
• |  | 接続を確立するための標準API(jdbc:default:connection)はJSR169では利用できません。 ルーチンがjdbc:default:connectionを使って接続を確立しようとすると実行時エラーが発生することがあります。
• |  | 診断表は利用できません。
• |  | トリガは利用できません。
• |  | 暗号化されたデータベースは利用できません。
• |  | DriverManagerは利用できません。DriverManager.getConnection()で接続を確立できません。

JDBC 3.0の機能
JDBC 3.0では基本APIに加え、幾つかの機能が拡張されます。この節ではDerbyにて実現された機能について説明します。
Note: ここで説明する機能はJava2の1.4以降の環境で利用可能です。
機能を以下にあげます。

• |  | DatabaseMetaDataに新規に追加されたメソッド。java.sql.DatabaseMetaData インターフェイス: JDBC 3.0で利用可能なメソッドを参照してください。
• |  | 引数のメタ情報の取得。java.sql.ParameterMetaDataインターフェイス:JDBC3.0で利用可能なメソッドとjava.sql.PreparedStatementインターフェイスを参照してください。
• |  | 自動生成されたキーの取得。java.sql.Statementインターフェイスとjava.sql.DatabaseMetaData インターフェイス: JDBC 3.0で利用可能なメソッドを参照してください。
• |  | セーブポイント。java.sql.Connectionインターフェイス: JDBC3.0にて利用可能なメソッドを参照してください。
• |  | HOLDカーソル。java.sql.DatabaseMetaData インターフェイス: JDBC 3.0で利用可能なメソッドを参照してください。

java.sql.Connectionインターフェイス: JDBC3.0にて利用可能なメソッド
表 98. Connectionにて利用可能なJDBC 3.0のメソッド

返り値 | シグネチャ | 実装の但し書き
Savepoint | setSavepoint (String name) | 現在のトランザクションにて指定した名前のセーブポイントを作成して、それを表す新規セーブポイントオブジェクトを返す。
Savepoint | setSavepoint () | 現在のトランザクションにてセーブポイントを作成して、それを表す新規セーブポイントオブジェクトを返す。
void | releaseSavepoint (Savepoint savepoint) | 指定したセーブポイントオブジェクトを現在のトランザクションから除去する。
void | rollback(Savepoint savepoint) | 指定されたセーブポイント以降に行われた変更を取り消す。
PreparedStatement | prepareStatement(String sql, int autoGeneratedKeys) | sqlがINSERT文でなければ、autoGeneratedKeysの引数は無視される。
PreparedStatement | prepareStatement(String sql, int [] columnIndexes) | sqlがINSERT文でなければ、columnIndexesは無視される。配列のそれぞれの列の番号は、INSERTの対象表にある自動増分列に対応する。組み込みモードでのみ利用可能。
PreparedStatement | prepareStatement(String sql, String [] columnNames) | sqlがINSERT文でなければ、columnNamesは無視される。配列のそれぞれの列名は、INSERTの対象表の自動増分列を指定する。組み込みモードでのみ利用可能。

• |  | Autogenerated keys

java.sql.DatabaseMetaData インターフェイス: JDBC 3.0で利用可能なメソッド
表 99. DatabaseMetaDataで利用可能なJDBC 3.0のメソッド

返り値 | シグネチャ | 実装の但し書き
boolean | supportsSavepoints() | '
int | getDatabaseMajorVersion() | '
int | getDatabaseMinorVersion() | '
int | getJDBCMajorVersion() | '
int | getJDBCMinorVersion() | '
int | getSQLStateType() | '
boolean | supportsNamedParameters() | '
boolean | supportsMultipleOpenResults() | '
boolean | supportsGetGeneratedKeys() | '
boolean | supportsResultSetHoldability(int holdability) | '
int | getResultSetHoldability() | ResultSet.HOLD_CURSORS_OVER_COMMITを返す。

java.sql.ParameterMetaDataインターフェイス:JDBC3.0で利用可能なメソッド
ParameterMetaDataはJDBC 3.0にて新規に追加されました。これは準備済み文にある引数の数、型、属性を記述します。PreparedStatement.getParameterMetaData メソッドはPreparedStatementオブジェクト中のパラメータマーカを記述するParameterMetaDataオブジェクトを返します。詳細はjava.sql.PreparedStatementインターフェイス: JDBC3.0で利用可能なメソッドを参照してください。
ParameterMetaDataインターフェイスのメソッドを以下に挙げます。
表 100. ParameterMetaDataのJDBC 3.0にて利用可能なメソッド

返り値 | シグネチャ | 実装の但し書き
int | getParameterCount() | '
int | isNullable(int param) | '
boolean | isSigned(int param) | '
int | getPrecision(int param) | '
int | getScale(int param) | '
int | getParameterType(int param) | '
String | getParamterTypeName (int param) | '
String | getParamterClassName (int param) | '
int | getParameterMode (int param) | '

java.sql.PreparedStatementインターフェイス: JDBC3.0で利用可能なメソッド
PreparedStatement.getParameterMetaDataメソッドはPreparedStatementのパラメータマーカを記述するParameterMetaDataオブジェクトを返します。詳細はjava.sql.ParameterMetaDataインターフェイス:JDBC3.0で利用可能なメソッドを参照してください。
表 101. PreparedStatementで利用可能なJDBC 3.0のメソッド

返り値 | シグネチャ | 実装の但し書き
ParameterMetaData | getParameterMetaData() | '

java.sql.Savepoint インターフェイス
SavepointインターフェイスはJDBC 3.0にて新たに追加されました。このインターフェイスにはセーブポイントの設定、解除、トランザクションの指定されたセーブポイントへのロールバックのためのメソッドが用意されています。 セーブポイントが設定してあれば、それまでの処理に影響を与えることなく、トランザクションをそのセーブポイントへロールバックすることができます。セーブポイントによりトランザクションのある時点を指定することで、粒度の細かいトランザクション制御が行えます。
設定したセーブポイントへのロールバック
JDBC 3.0のAPIには、Connection.setSavepointメソッドが新たに用意されています。このメソッドは現在のトランザクションにセーブポイントを設定します。 Connection.rollbackメソッドはセーブポイントを引数に取れるよう、オーバーロードされています。より詳細な情報はjava.sql.Connectionインターフェイス: JDBC3.0にて利用可能なメソッドを参照してください。
以下に例示するコードでは、表に行を挿入してsvpt1というセーブポイントを設定し、さらに二つ目の行を挿入します。トランザクションがsvpt1へロールバックされると、二つ目の挿入は取り消されますが最初の挿入は損なわれません。別の表現をすれば、トランザクションをコミットすると、'1'のを持つ行だけがTABLE1に追加されます。

    conn.setAutoCommit(false); // セーブポイントを使うためには自動コミットを切らなければなりません。
    Statement stmt = conn.createStatement();
    int rows = stmt.executeUpdate("INSERT INTO TABLE1 (COL1) VALUES(1)");
    // セーブポイントの設定
    set savepoint
    Savepoint svpt1 = conn.setSavepoint("S1");
    rows = stmt.executeUpdate("INSERT INTO TABLE1 (COL1) VALUES (2)");
    ...
    conn.rollback(svpt1);
    ...
    conn.commit();

セーブポイントの開放
Connection.releaseSavepointメソッドは引数にセーブポイントのオブジェクトをとり、それを現在のトランザクションから取り除きます。いったん開放されたセーブポイントをそれ以降のロールバック処理で参照すると、SQLExceptionが挙がります。
トランザクションで作成された全セーブポイントは、トランザクションがコミットされたり全体がロールバックされたときに、自動的に開放され無効となります。
トランザクションをセーブポイントへロールバックすると、そのセーブポイント以降の全セーブポイントは開放され無効となります。
セーブポイントの決まり
バッチ処理の文の途中で部分的な復元処理を行うためのセーブポイントを設定することはできません。もしexecuteBatchメソッドが呼ばれる前にセーブポイントが設定された場合、そのセーブポイントはバッチに追加された文のいずれよりも前に設定されます。
解放されたセーブポイントの名前は再利用可能です。これは(セーブポイントの開放を発行することによる)明示的な開放であるか、(接続のコミットやロールバックによる)暗黙的な開放であるかを問いません。
セーブポイントの制限事項
Derbyでは、セーブポイントをトリガにて利用することができません。
Derbyでは、セーブポイントへのロールバックを行ってもロックは開放されません。
表 102. JDBC 3.0で利用可能なセーブポイントのメソッド

返り値 | シグネチャ | 実装の但し書き
int | getSavepointId() | このセーブポイントに対して生成された識別子を取得します。 名前のあるセーブポイントでは、SQLExceptionが挙がります。
String | getSavepointName() | このセーブポイントの名前を取得します。 名前の無いセーブポイントでは、SQLExceptionが挙がります。

java.sql.Statementインターフェイス: JDBC 3.0で利用可能なメソッド
表 103. JDBC 3.0で利用可能なStatementのメソッド

返り値 | シグネチャ | 実装の但し書き
ResultSet | getGeneratedKeys() | ユーザが自動生成キーを有効にしていた場合、このメソッドはIDENTITY_VAL_LOCAL関数が呼ばれた時と同じ値を返します。もし有効ではないなら、この関数はnullを返します。
boolean | execute(String sql, int autoGeneratedKeys) | sqlがINSERT文ではない場合、autoGeneratedKeys引数は無視されます。
boolean | execute(String sql, int [] columnIndexes) | sqlがINSERT文ではない場合、columnIndexesは無視されます。配列のそれぞれの列番号は、INSERTの対象表にある自動増分の列に対応します。組み込みモードでのみ利用することができます。
boolean | execute(String sql, String [] columnNames) | sqlがINSERT文ではない場合、columnNamesは無視されます。配列のそれぞれの列名は、自動増分の列に対応します。組み込みモードでのみ利用することができます。
int | executeUpdate(String sql, int autoGeneratedKeys) | sqlがINSERT文ではない場合、autoGeneratedKeys引数は無視されます。
int | executeUpdate(String sql, int [] columnIndexes) | sqlがINSERT文ではない場合、columnIndexesは無視されます。 配列のそれぞれの列番号は、INSERTの対象表の自動増分列に対応します。組み込みモードでのみ利用することができます。
int | executeUpdate(String sql, String [] columnNames) | sqlがINSERT文ではない場合、columnNamesは無視されます。配列のそれぞれの列名は、INSERTの対象表にある自動増分列を表します。組み込みモードでのみ利用が可能です。

Autogenerated keys
JDBC 3.0のキー自動生成に関する機能により、索引の一部あるいは既定値の割り当てられた列から値を取得する方法があります。 Derbyには自動増分の機能があって、この機能により、データベースにより自動的に増分された値をとる列を、ユーザは表に定義することができます。 JDBC 3.0ではStatement.getGeneratedKeysメソッドを呼んでこの種類の列の値を取得することができます。このメソッドは値に自動生成キーをとる列を持つResultSetを返します。 またgetGeneratedKeysから返されたResultSetオブジェクトにてResultSet.getMetaDataメソッドを呼んで、IDENTITY_VAL_LOCALから返るのと同様なResultSetMetaDataオブジェクトを得ることもできます。
ユーザはConnection.prepareStatementメソッドや、Statement.executeメソッド、Statement.executeUpdateメソッドの二つ目の引数に、以下に示すいずれかの値を渡すことで、自動生成された列を取得できます。

• |  | 自動生成されたキーを取得できるようにする定数。具体的にはStatement.RETURN_GENERATED_KEYSです。
• |  | 挿入する行の列の内、取得できるようにする列名の配列。配列にある列名のいずれも自動生成される列で無ければ、Derby は例外を挙げます。(なおこの引数は、Derbyでは組み込みドライバでのみ利用可能です。)
• |  | 挿入する行の列の内、取得できるようにする列位置の配列。配列のいずれも自動生成される列でなければ、Derbyは例外を挙げます。(この引数はDerbyでは組み込みドライバでのみ利用可能です。)

例
以下のように定義されたTABLE1という表があるとします。

    CREATE TABLE TABLE1 (C11 int, C12 int GENERATED ALWAYS AS IDENTITY)

以下の三つのコードは同じことを行います。すなわち、TABLE1に挿入されたC12 の値を持つ、ResultSetを生成します。
コード 1:

    Statement stmt = conn.createStatement();
    stmt.execute(
        "INSERT INTO TABLE1 (C11) VALUES (1)",
        Statement.RETURN_GENERATED_KEYS);
    ResultSet rs = stmt.getGeneratedKeys();

コード 2:

    Statement stmt = conn.createStatement();
    String [] colNames = new String [] { "C12" };
    stmt.execute(
        "INSERT INTO TABLE1 (C11) VALUES (1)",
        colNames);
    ResultSet rs = stmt.getGeneratedKeys();

コード 3:

    Statement stmt = conn.createStatement();
    int [] colIndexes = new int [] { 2 };
    stmt.execute(
        "INSERT INTO TABLE1 (C11) VALUES (1)",
        colIndexes);
    ResultSet rs = stmt.getGeneratedKeys();

もし自動生成された列を取得できるようにする指定がなければ、 Statement.getGeneratedKeysへの呼び出しはnullのResultSetを返します。
JDBC 4.0の機能
JDBC 4.0 では基本APIに幾つかの機能が追加されています。 この節ではDerbyにて実現されている機能を説明します。
Note: ここで記す機能はJDK 1.6以上の環境にあります。
該当の機能は以下のとおりです。

• |  | DataSources JDBC 4.0で提供される開発省力化を実現するため、Derbyには、新しいjavax.sql.DataSourceの実装が導入されました。javax.sql.DataSource インターフェイス: JDBC 4.0の機能を参照してください。
• |  | JDBCドライバの自動読み込み 前のバージョンのJDBCではアプリケーションは接続の要求に先立ち、ドライバの登録を自力で行わなければなりませんでした。 JDBC 4.0からは、アプリケーションがドライバ名を引数にとってClass.forName()を呼ぶ必要はありません。代わりにアプリケーションが接続を要求したときに、DriverManagerが適切なJDBCドライバを探します。
• |  | SQLExceptions. JDBC 4.0 ではより洗練されたSQLExceptionのサブクラスが導入されました。洗練されたSQLExceptionのサブクラスを参照してください。
• |  | ラッパー JDBC 4.0ではラップされたJDBCオブジェクトという概念が導入されました。この仕組みはアプリケーションサーバがベンダー特有の機能拡張が施された、ConnectionやStatementsおよびResultSets等の標準JDBCオブジェクトを扱うための仕組みです。 Derbyには該当する機能拡張は無いので、Derbyでこの機能はそれほどの意味を持ちません。
• |  | 文のイベント JDBC 4.0のコネクションプールは、文が閉じたり、文でエラーが発生したりといったイベントを聞くことができます。javax.sql.PooledConnectionには新しいメソッドが追加されています。addStatementEventListenerとremoveStatementEventListenerです。
• |  | Streaming API JDBC 4.0ではCallableStatementやPreparedStatement、ResultSetにメソッドの新しいオーバーロードが追加されました。該当するオーバーロードとは、java.io.InputStreamおよびjava.io.Readerを引数にとるsetXXXメソッドやupdateXXXメソッドです。この新しいオーバーロードでは、長さの引数を省いたり、long型の長さを指定したりすることができます。
• |  | 新しいメソッド 次のインターフェイスに新しいメソッドが追加されました。 javax.sql.Connection、 javax.sql.DatabaseMetaData およびjavax.sql.Statement java.sql.Connectionインターフェイス:JDBC4.0で提供される機能、java.sql.DatabaseMetaDataインターフェイス: JDBC4.0の機能およびjava.sql.Statementインターフェイス: JDBC 4.0で利用可能な機能を参照してください。

洗練されたSQLExceptionのサブクラス
アプリケーションをJDK 1.6以降で動作させている場合、 Derby から挙がるほとんどの例外はJDBC4.0にて導入されたSQLExceptionのサブクラスとなり、かつてより洗練されています。 これ等の洗練された例外が挙がる状況は、対応するjavadocに記述されています。

• |  | java.sql.SQLClientInfoException
• |  | java.sql.SQLDataException
• |  | java.sql.SQLFeatureNotSupportedException
• |  | java.sql.SQLIntegrityConstraintViolationException
• |  | java.sql.SQLInvalidAuthorizationSpecException
• |  | java.sql.SQLSyntaxErrorException
• |  | java.sql.SQLTransactionRollbackException
• |  | java.sql.SQLTransientConnectionException

java.sql.Connectionインターフェイス:JDBC4.0で提供される機能
JDBC 4.0 では接続に新機能が追加されました。

• |  | LOBの生成 - 新規に追加されたcreateBlob()とcreateClob()の二つのメソッドにより、空のBlobやClobを作成できます。これらに情報を流し込んだ後、列に代入する事ができます。
• |  | 有効性検証 - isValidメソッドによりConnectionがまだ活きているか、知ることができます。

java.sql.DatabaseMetaDataインターフェイス: JDBC4.0の機能
Derbyでは、JDBC 4.0にて追加されたメタ情報のメソッドは、全て実装されています。

• |  | 利用可能な機能の公開機能 - JDBC4.0からデータベースにて利用可能な機能を問い合わせるためのメソッドが幾つか追加されました。このメソッドには以下のものがあります。 autoCommitFailureClosesAllResultSetsと providesQueryObjectGenerator、 getClientInfoPropertiesおよび supportsStoredFunctionsUsingCallSyntaxです。
• |  | 列のメタ情報 - 値の自動生成される列であれば、getColumnsメソッドから得られる情報では、IS_AUTOINCREMENTはYESです。
• |  | 関数のメタ情報 - JDBC 4.0から関数の引数や返り値を調べるためのメソッドが幾つか追加されました。これらを使って、ユーザが作成した関数を調べることもできます。 追加されたメソッドは、getFunctionsおよびgetFunctionColumnsです。 これらのメソッドの振る舞いは、getProceduresおよびgetProcedureColumnsと同様です。
• |  | 手続きのメタ情報 - getProcedureColumnsメソッドで、手続きの引数についてより多くの情報が得られるようになりました。より詳細な情報については、このメソッドのjavadocを参照してください。getProcedureColumnsが返すResultSetに新規に追加された列は以下のとおりです。 COLUMN_DEF、 SQL_DATA_TYPE、 SQL_DATETIME_SUB、 CHAR_OCTET_LENGTH、 ORDINAL_POSITION、 IS_NULLABLEそれとSPECIFIC_NAMEです。
• |  | スキーマのメタ情報 - JDBC 4.0ではgetSchemasに新しいオーバーロードが追加されています。このオーバーロードにより、名前を元にしてスキーマの情報を調べることができます。

java.sql.Statementインターフェイス: JDBC 4.0で利用可能な機能
DerbyのStatementには、JDBC 4.0で新規に追加されたメタ情報のメソッドが以下のとおり実装されています。

• |  | プーリングの実現 - JDBC 4.0ではアプリケーションサーバが行う文のプーリング管理を支援するため新しいメソッドが追加されます。 それはisPoolableとsetPoolableです。
• |  | 有効性の追跡 - JDBC 4.0ではisClosedメソッドを通して、文が有効であるかを追跡することができます。

javax.sql.DataSource インターフェイス: JDBC 4.0の機能
Derbyでは、JDBC 4.0向けのDataSourceが追加されました。プログラムがJDK 1.6以降の環境で実行されているときはこのDataSourceを利用して下さい。

• |  | org.apache.derby.jdbc.EmbeddedConnectionPoolDataSource40
• |  | org.apache.derby.jdbc.EmbeddedDataSource40
• |  | org.apache.derby.jdbc.EmbeddedXADataSource40
• |  | org.apache.derby.jdbc.ClientConnectionPoolDataSource40
• |  | org.apache.derby.jdbc.ClientDataSource40
• |  | org.apache.derby.jdbc.ClientXADataSource40

JDBCエスケープの構文
JDBCにはDBMSベンダーによるSQL実装毎の違いを吸収するための仕組みが用意されています。その仕組みとはエスケープ構文といいます。 個々のベンダが提供するJDBCドライバは、エスケープ構文を読んで、それを個々のデータベースが理解できる形式に変換することが求められます。この仕組みによりエスケープ構文はDBMS独立に働きます。
JDBCエスケープ節は中括弧で開始および終了します。キーワードは常に開いた中括弧に続きます。

    {キーワード }

Derbyでは以下のJDBCエスケープ構文が利用できます。なお何れも大文字小文字の区別はありません。

• |  | 呼び出し文のJDBCエスケープキーワード このエスケープキーワードはCallableStatementsにて用いられます。
• |  | JDBCエスケープ構文 このエスケープキーワードは日付書式で用いられます。
• |  | LIKE節のJDBCエスケープ構文 このエスケープキーワードはLIKE節にてエスケープ文字を指定するために用いられます。
• |  | fnキーワードを使ったJDBCエスケープ構文 このエスケープキーワードはスカラー関数に用いられます。
• |  | 外部結合のJDBCエスケープ構文 このエスケープキーワードは外部結合に用いられます。
• |  | 時刻書式のJDBCエスケープ構文 このエスケープキーワードは時刻書式に用いられます。
• |  | タイムスタンプ書式のJDBCエスケープ構文 このエスケープキーワードはタイムスタンプ書式に用いられます。

これ以外のJDBCエスケープキーワードは利用できません。
Note: DerbyではConnection.nativeSQLが呼ばれた場合、エスケープ構文をSQLのネイティブな構造とみなし、与えられたSQLをそのまま返します。さらに、同様の理由により、Statement.setEscapeProcessingを呼ぶ必要はありません。
呼び出し文のJDBCエスケープキーワード
この構文はCallableStatementに加え、java.sql.Statementやjava.sql.PreparedStatement にて利用可能です。
構文

    {call statement }

    -- Javaの手続きを呼び出す。
    { call TOURS.BOOK_TOUR(?, ?) }

JDBCエスケープ構文
Derbyは日付のJDBCエスケープ構文を、等価なSQLの日付構文へ解釈します。
構文

    {d 'yyyy-mm-dd'}

等価な記述

    DATE('yyyy-mm-dd')

    VALUES {d '1999-01-09'}

LIKE節のJDBCエスケープ構文
SQLのLIKE節では%(パーセント記号)と_(アンダースコア)はメタ文字と扱われます。JDBCはこれ等の文字をリテラル的に解釈させるための構文を用意しています。LIKE式の直後に続くJDBCの節では、エスケープ文字を指定することができます。
構文

    WHERE 文字式 [ NOT ] LIKE
        ワイルドカード付文字式
        { ESCAPE 'エスケープ文字' }

    -- "%"という文字で始まる全ての行を見つける。
    SELECT a FROM tabA WHERE a LIKE '$%%' {escape '$'}
    -- "_"という文字で終わる全ての行を見つける。
    SELECT a FROM tabA WHERE a LIKE '%=_' {escape '='}

Note: LIKEパターンが動的なパラメータの?であった場合、?をエスケープ文字とすることはできません。
言語によっては、複数の照合単位が一文字を表すことがあります。(ここで言う照合単位とは16ビット文字のことです。)エスケープ節が正しく働くためには、エスケープ文字は単一の照合単位でなければなりません。
JDBCの中括弧を使わずに、エスケープ文字の並びをLIKEに使うこともできます。詳細は真偽式を参照してください。
fnキーワードを使ったJDBCエスケープ構文
JDBCエスケープ構文にてfnというキーワードを使うことで関数を指定できます。
構文

    {fn 関数呼び出し}

ここで関数呼び出しは、以下に挙げるスカラー関数の何れかの名前です。
abs
数の絶対値を返す。

    abs(数式)

JDBCエスケープ構文の{fn abs(数式)}は、組込み構文のABSOLUTE(数式)と同等です。 より詳細な情報は、ABSとABSVAL関数を参照してください。
acos
指定した数の逆余弦を返します。

    acos(数)

JDBCエスケープ構文の{fn acos(数)}は、組込み構文のACOS(数)と同等です。より詳細な情報は、ACOSを参照してください。
asin
指定した数の逆正弦を返します。

    asin(数)

JDBCエスケープ構文の{fn asin(数)}は、組込み構文のASIN(数)と同等です。より詳細な情報は、ASINを参照してください。
atan
指定した数の逆正接を返します。

    atan(数)

The JDBCエスケープ構文の{fn atan(数)}は、組込み構文のATAN(数)と同等です。より詳細な情報は、ATANを参照してください。
ceiling
指定した数を切り上げて、指定した数以上の最小の数を返します。

    ceiling(数)

JDBCエスケープ構文の{fn ceiling(数)}は、組込み構文のCEILING(数)と同等です。より詳細な情報はCEILおよびCEILING関数を参照してください。
concat
連結した文字列を返します。

    concat(文字式, 文字式)

最初の文字列に二つ目の文字列を連結した文字列が構成されます。もしどちらかの文字列が空なら、返り値はNULLとなります。JDBCエスケープ構文の{fn concat (文字式, 文字式)は、組込み構文の{ 文字式 || 文字式 }と同等です。詳細は、Concatenationを参照してください。
cos
指定した引数の余弦を返します。

    cos(数)

JDBCエスケープ構文の{fn cos(数)}は、組込み構文のCOS(数)と同等です。詳細は、COS 関数を参照してください。
degrees
指定した数をラジアンから度に変換します。

    degrees(数)

JDBCエスケープ構文の{fn degrees(数)}は、組込み構文のDEGREES(数)と同等です。詳細はDEGREES 関数を参照してください。
exp
eを指定した数で累乗した数を返します。

    exp(数)

JDBCエスケープ構文の{fn exp(数)}は、組み込み構文のEXP(数)と同等です。詳細はEXP関数を参照してください。
floor
指定した数を切り捨てて、指定した数以下の最大の数を返します。

    floor(数)

JDBCエスケープ構文の{fn floor(数)}は、組込み構文のFLOOR(数)と同等です。 詳細はFLOOR関数を参照してください。
locate
二つ目の文字式のうちで、一つ目の文字式が見つかる位置を返します。 開始位置が指定されない場合、二つ目の文字式の頭から、一致する位置を見つけようとします。

    locate(文字式,文字式 [, 開始位置] )

JDBCエスケープ構文の{fn locate(文字式,文字式 [, 開始位置] )}は、組込み構文のLOCATE(CharacterExpression, CharacterExpression [, StartPosition] )と等価です。詳細はLOCATE関数を参照してください。
log
指定した数の自然対数(底をeとします。)を返します。

    log(数)

JDBCエスケープ構文の{fn log(数)}は、組込み構文のLOG(数)と等価です。詳細はLNあるいはLOG関数を参照してください。
log10
指定した数の10を底とする対数を返します。

    log10(数)

JDBCエスケープ構文の{fn log10(数)}は、組込み構文の、LOG10(数)と等価です。詳細はLOG10 関数を参照してください。
mod
一つ目の引数を二つ目の引数で割った余り(剰余)を返します。 一つ目の引数が負であった場合のみ、結果は負となります。

    mod(整数, 整数)

詳細はMOD関数を参照してください。
pi
piの最近似値を返します。

    pi()

JDBCエスケープ構文の{fn pi()}は、組込み構文のPI()と等価です。詳細はPI 関数を参照してください。
radians
指定した数を度からラジアンに変換します。

    radians(数)

JDBCエスケープ構文の{fn radians(数)}は、組込み構文のRADIANS(数)と等価です。詳細はRADIANS 関数を参照してください。
sin
指定した数の正弦を返します。

    sin(数)

JDBCエスケープ構文の{fn sin(数)}は、組込み構文のSIN(数)と等価です。詳細はSINを参照してください。
sqrt
浮動小数点数の平方根を返します。

    sqrt(浮動小数点数式)

JDBCエスケープ構文の{fn sqrt (浮動小数点数式)}は、組込み構文のSQRT(浮動小数点数式)と等価です。詳細はSQRT関数を参照してください。
substring
文字式の開始位置から始まる部分文字列を構成して返します。 文字式の最初の文字は1と数えます。

    substring(文字式, 開始位置, 長さ)

tan
引数の正接を返します。

    tan(数)

JDBCエスケープ構文の{fn tan(数)}は、組込み構文のTAN(数)と等価です。詳細はTANを参照してください。
TIMESTAMPADD
TIMESTAMPADD関数を使って、タイムスタンプに時間を足すことができます。関数はタイムスタンプに整数を時間の種類に沿って処理して、加算した値を新しいタイムスタンプとして返します。負の整数を与えることで減算もできます。
TIMESTAMPADDはJDBCエスケープの関数で、JDBCエスケープ関数の構文でのみ利用可能です。

    TIMESTAMPADD( 時間の種類, 整数式, タイムスタンプ式 )

日付や時刻にTIMESTAMPADDを実行するには、日付や時刻をタイムスタンプに変換する必要があります。日付は時刻のフィールドに00:00:00.0を与えることでタイムスタンプに変換できます。時刻は現在日付を日付のフィールドに与えることで、タイムスタンプに変換できます。
WHERE節にて、タイムスタンプを計算する関数に日時の列を置くべきではありません。なぜならオプティマイザが、その列への索引を利用しなくなるからです。
TIMESTAMPDIFF
TIMESTAMPDIFF関数により指定した時間の種類によるタイムスタンプの間の差を計算できます。例えば、関数により二つのタイムスタンプ間の分数を返すことができます。
TIMESTAMPDIFFはJDBCエスケープの関数で、JDBCエスケープ関数の構文でのみ利用できます。

    TIMESTAMPDIFF( 時間の種類, タイムスタンプ式1, タイムスタンプ式2 )

日付や時刻にTIMESTAMPDIFFを実行するには、日付や時刻をタイムスタンプに変換する必要があります。日付は時刻のフィールドに00:00:00.0を与えることでタイムスタンプに変換できます。時刻は現在日付を日付のフィールドに与えることで、タイムスタンプに変換できます。
WHERE節にて、タイムスタンプを計算する関数に日時の列を置くべきではありません。なぜならオプティマイザが、その列への索引を利用しなくなるからです。
TIMESTAMPADD および TIMESTAMPDIFFに指定できる時間の種類
TIMESTAMPADDおよびTIMESTAMPDIFFは、タイムスタンプへの算術演算を行うために使われます。これ等の関数は以下にあげる時間の種類を演算処理で利用できます。

• |  | SQL_TSI_DAY
• |  | SQL_TSI_FRAC_SECOND
• |  | SQL_TSI_HOUR
• |  | SQL_TSI_MINUTE
• |  | SQL_TSI_MONTH
• |  | SQL_TSI_QUARTER
• |  | SQL_TSI_SECOND
• |  | SQL_TSI_WEEK
• |  | SQL_TSI_YEAR

エスケープ関数のTIMESTAMPADDとTIMESTAMPDIFFを利用する例
次の書き方で、現在より一ヵ月後の値を返します。

    {fn TIMESTAMPADD( SQL_TSI_MONTH, 1, CURRENT_TIMESTAMP)}

次の書き方で、現在と2008年1月1日の間が何週間かを返します。

    {fn TIMESTAMPDIFF(SQL_TSI_WEEK, CURRENT_TIMESTAMP,
      timestamp('2008-01-01-12.00.00.000000'))}

外部結合のJDBCエスケープ構文
Derbyは外部結合(および全結合)のJDBCエスケープ構文を、等価な外部結合もしくは適切な種類の結合のSQL構文へと解釈します。
各種の結合については、JOIN 演算を参照してください。
構文

    {oj 結合処理 [結合処理 ]* }

次と等価

    結合処理 [結合処理 ]*

    -- 外部結合
    SELECT *
    FROM
    {oj Countries LEFT OUTER JOIN Cities ON
       (Countries.country_ISO_code=Cities.country_ISO_code)}
    -- 他の結合処理
    SELECT *
    FROM
    {oj Countries JOIN Cities ON (Countries.country_ISO_code=Cities.country_ISO_code)}
    -- 表式は結合式でもかまわないので、
    -- FROM句に複数の結合処理を記述できます。
    SELECT E.EMPNO, E.LASTNAME, M.EMPNO, M.LASTNAME
    FROM {oj EMPLOYEE E INNER JOIN DEPARTMENT
    INNER JOIN EMPLOYEE M ON MGRNO = M.EMPNO ON E.WORKDEPT = DEPTNO};

時刻書式のJDBCエスケープ構文
Derbyは時刻のJDBCエスケープ構文を、等価な時刻のSQL構文に解釈します。Derbyでは8文字(6桁と小数点以下2桁)のISO書式も利用できます。
構文

    {t 'hh:mm:ss'}

次と等価です。

    TIME 'hh:mm:ss'

例

    VALUES {t '20:00:03'}

日付書式のJDBCエスケープ構文
Derbyは日付のJDBCエスケープ構文を、等価な日付のSQL構文に解釈します。
構文

    {d 'yyyy-mm-dd'}

以下と等価

    DATE 'yyyy-mm-dd'

例

    VALUES {d '1995-12-19'}

タイムスタンプ書式のJDBCエスケープ構文
DerbyはタイムスタンプのJDBCエスケープ書式を、等価なタイムスタンプのSQL書式に解釈します。 また、Derbyでは23文字(17桁、ダッシュ、3桁、小数点、3桁)のISO書式を利用することもできます。
構文

    {ts 'yyyy-mm-dd hh:mm:ss.f...'}

以下と等価

    TIMESTAMP 'yyyy-mm-dd hh:mm:ss.f...'

タイムスタンプのうち、小数点以下の部分(.f...)は省略できます。

    VALUES {ts '1999-01-09 20:11:11.123455'}

データベース接続URLに属性を指定する。
Derbyでは、データベース接続URLに属性を指定する、 JDBCの機能を利用できます。
属性はDerbyに固有です。
プロトコルとサブプロトコルに続いて、セミコロンで区切って属性を指定するのが典型的な方法です。属性の指定方法については、Derbyのデータベース接続URLの属性を参照してください。この章ではリファレンス的な情報のみ提供します。
Note: 属性は構文解析の時に、間違いのあるなしを検証されません。正しくない属性や値を指定した場合、それらは単純に無視されます。
bootPassword=key属性
機能
このキーは以下の目的で指定されます。

• |  | 暗号化されたデータベースの新規作成
• |  | 既存の暗号化されていないデータベースの暗号化を設定
• |  | 既存の暗号化されたデータベースの起動

8文字以上の英数字からなる文字列を指定します。
ほかの属性との組み合わせ
新規データベースを作成する場合は、bootPassword=key属性は、create=true 属性およびdataEncryption=true属性と組み合わせなければなりません。
既存の平文のデータベースを暗号化するには、bootPassword=key属性とdataEncryption=true属性を設定する必要があります。 既存の平文のデータベースにて、認証とSQL認証の両方が有効な場合は、データベース所有者だけが暗号化を行えます。 Derby ディベロッパーズ ガイドの「ユーザ認証を有効にする」と、「SQL標準認証モードを設定する」も参照してください。
既存の暗号化されたデータベースを起動する場合は、ほかの属性は必要ありません。
例

    -- 新規の暗号化されたデータベースを作成する。
    jdbc:derby:newDB;create=true;dataEncryption=true;
        bootPassword=cseveryPlace
    -- 既存の暗号化されていないデータベースに暗号化を設定する。
    jdbc:derby:salesdb;dataEncryption=true;bootPassword=cseveryPlace
    -- 既存の暗号化されたデータベースを起動する、
    jdbc:derby:encryptedDB;bootPassword=cseveryPlace

collation=collation 属性
機能
collation属性は照合がデータベースに設定された地域に沿って行われるのか、ユニコードのコードポイントに沿って行われるのかを指定します。 collation属性の有効な値は、TERRITORY_BASEDとUCS_BASICです。
制約事項: collation属性を指定できるのはデータベースを作成した時です。既存のデータベースや、アップグレードするデータベースに、この属性を指定することはできません。
Derbyのデータベースを作成するときに、collation属性にTERRITORY_BASEDを与えた場合、照合はterritory属性に指定した言語や国のコードに基づき行われます。
データベースを作成するときにterritory属性を指定しなかった場合、Derbyはjava.util.Locale.getDefaultメソッドにより、Java仮想マシン(JVM)の地域情報の既定値が現在何であるかを取得します。
Note: collation属性はユーザが定義した表についてのみ有効です。システム表ではユニコードのコードポイントに沿って照合が行われます。
例
次の例ではMexicanDBデータベースを作成するURLを示します。territory属性では言語コードにスペイン語を指定して、国コードにメキシコを指定します。collation属性はデータベースが地域情報に基づいて、照合を行うことを指定します。

    jdbc:derby:MexicanDB;create=true;territory=es_MX;collation=TERRITORY_BASED

Derbyで照合がどのように扱われるかは、Derby ディベロッパーズ ガイドの「Derbyでの文字による照合」を参照してください。
create=true 属性
機能
Derbyのデータベース接続URLに記述して、標準的な構成のデータベースを作成して、それに接続することができます。データベースの作成に失敗した場合、エラーログにエラーが出力されて、データベースが見つからなかったことを表すSQLExceptionとともに、接続の試みは失敗します。
もしデータベースが既に存在した場合は、既存のデータベースに接続されて、SQLWarningが発行されます。
JDBCでは、作成時に接続に失敗したデータベースは、失敗がデータベースへの呼び出しの後であれば、除去されません。 もしデータベース接続URLにcreate=trueを指定して、接続の作成に失敗したなら、データベースのディレクトリを確認してください。 もしディレクトリが存在するなら、データベース作成を次回試みるまでに、内容とともにそれを削除してください。
データベース所有者
データベースを作成した時の認証識別子が、データベースの所有者となります。(user=userName 属性を参照してください。 認証とSQL認証の両方が有効である場合(Derby ディベロッパーズ ガイドの「ユーザ認証を有効にする」と「SQL標準認証モードを設定する」を参照してください。)、データベースの所有者だけが、データベースの終了や、暗号化、新しい起動パスワードおよび暗号化鍵による再暗号化、フルアップグレードを行うことができます。 認証が有効ではなく、ユーザが指定されていない場合、データベース所有者は既定で「APP」です。これは既定のスキーマ名でもあります。(SET SCHEMA 文を参照してください。)
ほかの属性との組み合わせ
(データベース接続URLのサブプロトコルの後に)databaseNameを、もしくは、databaseName=nameofDatabase属性を指定しなければなりません。
この属性は、この他の属性とも組み合わせることができます。データベースの作成時に地域の指定をするなら、territory=ll_CC属性を利用してください。
Note: create=trueを指定したとき、データベースが既に存在しているなら、SQLWarningが挙がります。

    jdbc:derby:sampleDB;create=true

    jdbc:derby:;databaseName=newDB;create=true;

createFrom=Path属性
機能
起動時の接続URLにcreateFrom=path属性を指定して、指定した場所にあるフルバックアップからデータベースを作成することができます。 もしderby.system.homeに同じ名前のデータベースがあれば、エラーが挙がって既存のデータベースにはなにも行いません。 もしderby.system.homeに同じ名前のデータベースがなければ、バックアップの場所からデータベース全体がderby.system.homeへとコピーされて、データベースが開始されます。
ログファイルは規定の場所へとコピーされます。logDevice属性をcreateFrom=pathに併せて利用することで、ログファイルを別の場所に記録することができます。createFrom=pathを利用するとき、個々のログファイルをログディレクトリにコピーする必要はありません。
この属性の利用に関するより詳細な情報は、Derby サーバと管理ガイドの「バックアップした写しからデータベースを作成する」を参照してください。
他の属性との組み合わせ
この属性をrollforwardrecoveryFromやrestoreFrom、createと組み合わせて利用しないでください。

    URL: jdbc:derby:wombat;createFrom=d:/backup/wombat

databaseName=nameofDatabase属性
機能
接続するデータベースの名称を指定します。サブプロトコルの後のデータベース名の代わりに、この値を指定することができます。
例えば以下のURL(およびPropertiesオブジェクト)は同じ意味となります。

• |  | jdbc:derby:toursDB
• |  | jdbc:derby:;databaseName=toursDB
• |  | jdbc:derby:(接続要求時に渡すPropertiesオブジェクトにて、databaseName属性の値にtoursDBを指定する。)

もしURLのサブネームおよび属性の両方でデータベース名が指定された場合、サブネームを優先してデータベース名が設定されます。たとえば以下のデータベース接続URLはtoursDBに接続します。

    jdbc:derby:toursDB;databaseName=flightsDB

データベース名を属性として指定することができるので、Derbyが把握しているデータベース群を元にしたデータベース名に指定できる値の一覧を、getPropertyInfoメソッドから得ることができます。 より詳細な情報についてはjava.sql.Driver.getPropertyInfo メソッドを参照してください。
ほかの属性との組み合わせ
この属性は他の全ての属性と組み合わせて利用できます。

    jdbc:derby:;databaseName=newDB;create=true

dataEncryption=true属性
機能
新規作成するデータベースおよび、暗号化されていない既存のデータベースの、暗号化の指定を行います。暗号化の詳細については、Derby ディベロッパーズ ガイドの「ディスク上のデータベースを暗号化する」を参照してください。
ほかの属性との組み合わせ
dataEncryption属性は、bootPassword=keyあるいはnewEncryptionKey=key属性と組み合わせて利用しなくてはなりません。 それから、encryptionProvider=providerNameとencryptionAlgorithm=algorithmも指定可能です。
既存の認証とSQL認証が両方有効になっているデータベースに暗号化を施すことができるのは、データベース所有者だけです。より詳細な情報はDerby ディベロッパーズ ガイドの、「ユーザ認証を有効にする」と「SQL標準認証モードを設定する」を参照してください。
例

     -- 新規のデータベースを暗号化する。
    jdbc:derby:encryptedDB;create=true;dataEncryption=true;
        bootPassword=cLo4u922sc23aPe
     -- 既存の暗号化されていないデータベースを暗号化する。
       jdbc:derby:salesdb;dataEncryption=true;bootPassword=cLo4u922sc23aPe

encryptionKey=key属性
機能
以下の目的で利用する外部の鍵を指定します。

• |  | 新規データベースの暗号化
• |  | 既存の暗号化されていないデータベースの暗号化設定
• |  | 既存の暗号化されたデータベースの起動

アプリケーションは暗号化キーを指定する必要があります。
他の属性との組み合わせ
新規データベース作成の場合、encryptionKeyはcreate=trueとdataEncryption=trueと組み合わせなければなりません。
既存の暗号化されていないデータベースの暗号化設定の場合、encryptionKey属性はdataEncryption=trueと組み合わせなければなりません。 認証とSQL認証の両方が有効な暗号化されていないデータベースの場合、データベース所有者だけが暗号化を行えます。詳細な情報はDerby ディベロッパーズ ガイドの、「ユーザ認証を有効にする」と「SQL標準認証モードを設定する」を参照してください。
既存の暗号化されたデータベースを起動する場合、もしデータベースの作成時に指定したアルゴリズムが既定のものと違うのであれば、encryptionAlgorithmを指定しなければなりません。
Derbyの既定の暗号化アルゴリズムは、DES/CBC/NoPaddingです。
例
新規の暗号化されたデータベースを作成するJDBC URLの例:

    jdbc:derby:newDB;create=true;dataEncryption=true;
       encryptionAlgorithm=DES/CBC/NoPadding;encryptionKey=6162636465666768

既存の暗号化されていないデータベースに暗号化設定を行うJDBC URLの例:

    jdbc:derby:salesdb;dataEncryption=true;encryptionKey=6162636465666768

暗号化されたデータベースを起動するJDBC URLの例:

    jdbc:derby:encryptedDB;encryptionKey=6162636465666768

encryptionProvider=providerName属性
機能
暗号化で利用するプロバイダを指定します。暗号化の詳細については、Derby ディベロッパーズ ガイドの「ディスク上のデータベースの暗号化」を参照してください。
この属性が指定されない場合、利用中のJVMに組み込まれているプロバイダが、既定の暗号化プロバイダとして利用されます。
他の属性との組み合わせ
encryptionProvider属性はbootPassword=keyとdataEncryption=trueの属性と組み合わせて使わなければなりません。 あとencryptionAlgorithm=algorithm 属性属性を利用することもできます。
認証やSQL認証の両方が有効な、既存の暗号化されていないデータベースの場合、 データベースの所有者だけが暗号化と復号化を行えます。詳細は、Derby ディベロッパーズ ガイドの「ユーザ認証を有効にする」と「SQL標準認証モードを有効にする」を参照してください。
例

    -- 新規の暗号化されたデータベースを作成します。
    jdbc:derby:encryptedDB;create=true;dataEncryption=true;
        encryptionProvider=com.sun.crypto.provider.SunJCE;
        encryptionAlgorithm=DESede/CBC/NoPadding;
        bootPassword=cLo4u922sc23aPe
    -- 既存のデータベースに暗号化を設定します。
        jdbc:derby:salesdb;dataEncryption=true;
        encryptionProvider=com.sun.crypto.provider.SunJCE;
        encryptionAlgorithm=DESede/CBC/NoPadding;
        bootPassword=cLo4u922sc23aPe

encryptionAlgorithm=algorithm 属性
機能
暗号化のアルゴリズムを指定する。
Javaの規約にのっとりアルゴリズムを指定します。例を記します。

    algorithmName/feedbackMode/padding

Derbyではpaddingの種類にNoPaddingのみ指定できます。
もし暗号化アルゴリズムが指定されなかった場合、既定はDES/CBC/NoPaddingとなります。
暗号化についての詳細は、Derby ディベロッパーズ ガイドの「ディスク上のデータベースの暗号化」を参照してください。
他の属性との組み合わせ
encryptionAlgorithm属性は、bootPassword=key属性とdataEncryption=true 属性と組み合わせて利用する必要があります。 さらに、encryptionProvider=providerName属性を指定してアルゴリズムを実装する暗号化プロバイダを指定することもできます。
認証およびSQL認証が有効な既存のデータベースには、データベース所有者だけが暗号化や再暗号化を行えます。 より詳細な情報は、Derby ディベロッパーズ ガイドの「ユーザ認証を有効にする」および「SQL標準認証モードを設定する」を参照してください。
例

     -- 暗号化された新規データベースを作成する。
        jdbc:derby:encryptedDB;create=true;dataEncryption=true;
        encryptionProvider=com.sun.crypto.provider.SunJCE;
        encryptionAlgorithm=DESede/CBC/NoPadding;
        bootPassword=cLo4u922sc23aPe
    -- 既存のデータベースの暗号化を設定する。
        jdbc:derby:salesdb;dataEncryption=true;
        encryptionProvider=com.sun.crypto.provider.SunJCE;
        encryptionAlgorithm=DESede/CBC/NoPadding;
        bootPassword=cLo4u922sc23aPe

Note: 指定されたプロバイダにて、指定されたアルゴリズムが利用できない場合、Derbyは例外を返します。
logDevice=logDirectoryPath 属性
機能
logDirectoryPathはデータベースの作成や復元で用いるデータベースのログを記録するディレクトリへのパスを指定します。logDirectoryPathは内部的には絶対パスとして記録されます。
この属性の利用に関する、より詳細な情報は、Derby サーバと管理ガイドの「logDevice=logDirectoryPath属性を利用する」を参照してください。
他の属性との組み合わせ
createや createFrom、restoreFromあるいはrollForwardRecoveryFromと共に使います。

    jdbc:derby:newDB;create=true;logDevice=d:/newDBlog

newEncryptionKey=key 属性
機能
暗号化されたデータベースに新しい外部の暗号化鍵を指定します。データベースにある既存の全情報は新しい暗号化鍵で暗号化され、それ以降データベースに記録される全ての情報はこの鍵で暗号化されるようになります。この属性についてのより詳細案情報は、Derby ディベロッパーズ ガイドの「データベースを新しい外部の鍵で暗号化する」を参照してください。
他の属性との組み合わせ
newEncryptionKey属性はencryptionKey=key属性と組み合わせて利用する必要があります。
newEncryptionKey属性を使う場合、暗号のプロバイダやアルゴリズムは変更できません。
既存の暗号化されているデータベースにて認証とSQL認証の両方が有効になっている場合、データベース所有者だけが、再暗号化を行えます。 より詳細な情報については、Derby ディベロッパーズ ガイドの、「ユーザ認証」と「SQL標準認証モードの設定」を参照してください。
例

    -- データベースの新しい暗号化鍵を指定する。
    jdbc:derby:salesdb;encryptionKey=6162636465666768;newEncryptionKey=6862636465666768

newBootPassword=newPassword 属性
機能
暗号化されたデータベースに、起動パスワードを新たに指定します。新しい暗号化鍵がエンジンにより内部的に作成され、鍵は新しい起動パスワードにより保護されます。 データベースは既存の情報を含めて、新しい暗号化鍵により暗号化されるようになります。 この属性のより詳細な情報は、Derby ディベロッパーズ ガイドの「新しい起動パスワードでデータベースを暗号化する」を参照してください。
他の属性との組み合わせ
newBootPassword属性はbootPassword=key属性と組み合わせて使わなければなりません。
newBootPassword属性を使うときは、暗号化のプロバイダやアルゴリズムを変更できません。
認証およびSQL認証の両方が有効になっている既存の暗号化されたデータベースではデータベース所有者だけが、再暗号化を行うことができます。 より詳細な情報は、Derby ディベロッパーズ ガイドの「ユーザ認証を有効にする」と「SQL標準認証を設定する」を参照してください。
例

    -- データベースに新しい起動パスワードを設定する。
    jdbc:derby:salesdb;bootPassword=abc1234xyz;newBootPassword=new1234xyz

password=userPassword
機能
指定されたユーザ名へのパスワードを与える。
他の属性との組み合わせ
user=userNameと組み合わせて使います。

    jdbc:derby:toursDB;user=jack;password=upTheHill

restoreFrom=path属性
機能
起動時の接続URLの属性にてrestoreFrom=pathを指定して、指定された場所からデータベース全体の復元を行えます。もしderby.system.homeで指定された場所に同名のデータベースがあった場合、そのデータベースは完全に削除され、バックアップからコピーして再作成された後に、改めて起動されます。
ログファイルがコピーされるのは、バックアップがとられた時に置かれていたのと同じ場所です。logDevice属性をrestoreFrom=pathと併せて用いることで、ログの記録場所を別の場所にすることができます。
この属性の利用に関するより詳細な情報は、Derby サーバと管理ガイドの「バックアップの写しからデータベースを復元する」を参照してください。
他の属性との組み合わせ
この属性は、createFromやrollforwardrecoveryFrom、あるいはcreateと同時に使わないでください。

    URL: jdbc:derby:wombat;restoreFrom=d:/backup/wombat

rollForwardRecoveryFrom=path 属性
機能
起動時のURLに rollForwardRecoveryFrom=pathを指定して、バックアップを使ってデータベースを復元した後に、アーカイブされたログとアクティブなログを使ってロールフォワードリカバリを行うことができます。
ロールフォワードリカバリを使ってデータベースを復元するには、データベースのバックアップと、その時点からのすべてのアーカイブされたログおよびアクティブなログをあらかじめ準備しておく必要があります。
フルバックアップからデータベースが復元された後、オンラインのアーカイブされたログとアクティブなログの内容が、データベースで再び実行されます。
この属性の利用に関する詳細な情報は、Derby サーバと管理ガイドの「ロールフォーワードリカバリ」を参照してください。
他の属性との組み合わせ
この属性はcreateFrom、restoreFromおよびcreateと組み合わせてはなりません。

    URL: jdbc:derby:wombat;rollForwardRecoveryFrom=d:/backup/wombat

shutdown=true属性
機能
databaseNameが指定されている場合、そのデータベースを終了します。(終了してから、そのデータベースに再接続すると、データベースが再起動されます。) 認証とSQL認証の両方が有効なデータベースでは、データベース所有者だけがデータベースの終了を行えます。より詳細な情報はDerby ディベロッパーズ ガイドの「ユーザ認証を有効にする」と「SQL標準認証モードを設定する」を参照してください。
databaseNameを指定しなかった場合に限り、Derbyのシステム全体が終了します。
単体のデータベースを終了させた場合、Derbyは該当データベースで終了時のチェックポイント処理を行ないます。
システム全体を終了させた場合、Derbyは全データベースで終了時のチェックポイント処理を行い、JDBCドライバの登録抹消を行い、JVMが終了する前にJVM内でシステムを終了します。終了が成功すると、必ずSQLExceptionが挙がります。これはDerbyが終了して、接続が既にないことを表すものです。 Derbyの終了後、ドライバを読み込みなおせば、もう一度起動することができます。Derbyの再起動に関する詳細な情報は、Derby ディベロッパーズ ガイドの第1章にある、「システムの終了」を参照してください。
チェックポイントの処理とは、次回の接続で復元処理を行う必要が無いように、全ての記録とトランザクションの情報をディスクに書き込むことです。
アプリケーションで全システムの終了が行われるのは、組み込みモードのときだけです。
Note: 属性にshutdown=trueを指定してDriverManagerへ要求を行うと、常に例外が挙がります。

    -- 全システムを終了する。
    jdbc:derby:;shutdown=true
    -- salesDBを終了する。(認証が無効である場合)
    jdbc:derby:salesDB;shutdown=true

territory=ll_CC 属性
機能
データベースの作成やアップグレードを行うとき、この属性を使ってデータベースに既定値ではない地域を指定できます。 territory属性を設定することで、システムが既定とする地域を上書きすることができます。システムが規定とする地域は、java.util.Locale.getDefault()でわかります。
地域を指定する書式はll_CCです。ここでllは2文字の言語コード、CC は2文字の国コードです。
言語コードは小文字の対からなり、ISO-639に従います。
表 104. 言語コードの例

言語コード | 説明
de | German
en | English
es | Spanish
ja | Japanese

ISO-639の全コードを示す一覧は、http://www.ics.uci.edu/pub/ietf/http/related/iso639.txtを参照してください。
国コードは2文字の大文字からなり、ISO-3166に従います。
表 105. 国コードの例

国コード | 説明
DE | Germany
US | United States
ES | Spain
MX | Mexico
JP | Japan

ISO-3166の仕様はhttp://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.htmlにあります。
他の属性との組み合わせ
territory属性はデータベースを作成するときしか使えません。
次の例にて新規作成したデータベースの地域情報は、国はメキシコで言語はスペイン語となります。

    jdbc:derby:MexicanDB;create=true;territory=es_MX

collation 属性をterritory属性と組み合わせて使うことで、Unicodeのコードポイントに従った文字照合に代わり、地域情報に沿った文字照合を行うことができます。
traceDirectory=path 属性
機能
DerbyネットワーククライアントがJDBCのトレース情報を送るディレクトリを指定します。プログラムやセッションが複数の接続を持つ場合、ネットワーククライアントはそれぞれの接続毎にファイルを作成します。既定でファイルには_driver_0、_driver_1といった名前が付けられます。 traceFile=path属性で、トレースファイルのファイル名を指定することができます。
ディレクトリが存在しない場合、Derbyからエラーメッセージが出力されます。絶対パス名による指定ではない場合、ディレクトリは現在のディレクトリから相対的なものとして扱われます。
トレースに関するより詳細な情報は、Derby サーバと管理ガイドの「ネットワーククライアントのトレース」を参照してください。 トレースに関するこの他の属性については、traceFile=path、traceFileAppend=trueおよびtraceLevel=valueを参照してください。
他の属性との組み合わせ
この属性はほかの属性と組み合わせることができます。
例

    -- 複数の接続を持つ既存のデータベースのトレースを有効にする。
    jdbc:derby://localhost:1527/mydb;traceDirectory=/home/mydir/mydbtracedir
    -- ディレクトリのトレースファイル名を指定する。
    jdbc:derby://localhost:1527/mydb;traceDirectory=/home/mydir/mydbtracedir;traceFile=trace.out
    -- 既定のトレースファイルに追加する。
    jdbc:derby://localhost:1527/mydb;traceDirectory=/home/mydir/mydbtracedir;traceFileAppend=true

traceFile=path 属性
機能
DerbyネットワーククライアントがJDBCトレース情報を書き出す先のファイルを指定します。絶対パス名を指定しなかった場合、ファイルはderby.system.homeディレクトリに置かれます。(詳細についてはDerby ディベロッパーズ ガイドの「システムディレクトリを定義する」を参照してください。)
traceFile=pathとtraceFileAppend=trueの両方を指定した場合、指定したファイルが既存であれば、出力はそのファイルに追加されます。もし、traceFile=pathを指定してtraceFileAppend=trueを指定しなかった場合、ファイルは上書きされ、前に書かれていた内容は失われます。
トレースに関するより詳細な情報は、Derby サーバと管理ガイドの「ネットワーククライアントのトレース」を参照してください。 トレースに関する他の属性は、 traceDirectory=pathと traceLevel=valueを参照してください。
他の属性との組み合わせ
この属性はほかの属性と組み合わせることができます。
例

    -- 新規データベースでトレースを有効にする。
    jdbc:derby://localhost:1527/mydb;create=true;traceFile=trace.out

traceFileAppend=true 属性
機能
Derbyのネットワーククライアントに、JDBCトレース情報をトレースファイルに追記するよう指定します。ファイルはtraceFile=path属性により指定できます。もしトレースファイルを指定せず、traceDirectory=path属性を指定した場合、トレースした情報は既定のファイルに追記されます。traceFileAppend=trueを指定しなかった場合、トレースファイルに書かれていた情報は上書きされます。
トレースに関するより詳細な情報は、Derby サーバと管理ガイドの「ネットワーククライアントのトレース」を参照してください。トレースに関するこの他の属性については、traceDirectory=pathとtraceLevel=valueを参照してください。
他の属性との組み合わせ
この属性は、traceFile=pathあるいはtraceDirectory=pathの何れかと組み合わせて利用する必要があります。また他に属性を指定することも可能です。
例

    -- 既定のデータベースにてトレースを有効にして、
    -- 指定したファイルに追記してゆく。
    jdbc:derby://localhost:1527/mydb;traceFile=trace.out;traceFileAppend=true
    -- 既定のデータベースでトレースを有効にして、
    -- Derbyのホームディレクトリから相対指定したディレクトリの既定ファイルに、
    -- 情報を追記してゆく。
    jdbc:derby://localhost:1527/mydb;traceDirectory=mytracedir;traceFileAppend=true

traceLevel=value 属性
機能
トレースが有効になっているとき、Derbyのネットワーククライアントに適用されるトレースのレベルを指定します。valueは数値です。トレースのレベルを指定しない場合、規定はTRACE_ALLです。
トレースのより詳細な情報は、Derby サーバと管理ガイドの「ネットワーククライアントのトレース」を参照してください。 また、トレースに関連した他の属性である、 traceFile=path、 traceFileAppend=trueおよび traceDirectory=pathを参照してください。
トレースのレベル
以下の表で設定できるトレースのレベルと、その値を示します。
表 106. Available tracing levels and values

トレースのレベル | 16進数 | 10進数
org.apache.derby.jdbc.ClientDataSource.TRACE_NONE | 0x0 | 0
org.apache.derby.jdbc.ClientDataSource.TRACE_CONNECTION_CALLS | 0x1 | 1
org.apache.derby.jdbc.ClientDataSource.TRACE_STATEMENT_CALLS | 0x2 | 2
org.apache.derby.jdbc.ClientDataSource.TRACE_RESULT_SET_CALLS | 0x4 | 4
org.apache.derby.jdbc.ClientDataSource.TRACE_DRIVER_CONFIGURATION | 0x10 | 16
org.apache.derby.jdbc.ClientDataSource.TRACE_CONNECTS | 0x20 | 32
org.apache.derby.jdbc.ClientDataSource.TRACE_PROTOCOL_FLOWS | 0x40 | 64
org.apache.derby.jdbc.ClientDataSource.TRACE_RESULT_SET_META_DATA | 0x80 | 128
org.apache.derby.jdbc.ClientDataSource.TRACE_PARAMETER_META_DATA | 0x100 | 256
org.apache.derby.jdbc.ClientDataSource.TRACE_DIAGNOSTICS | 0x200 | 512
org.apache.derby.jdbc.ClientDataSource.TRACE_XA_CALLS | 0x800 | 2048
org.apache.derby.jdbc.ClientDataSource.TRACE_ALL | 0xFFFFFFFF | -1

トレースのレベルを複数指定する場合、以下の方法を使ってください。

• |  | ijを使っている場合、10進数を加算した合計値を指定してください。たとえば、プロトコルのフローと接続の呼び出しをトレースする場合、TRACE_PROTOCOL_FLOWS (64)とTRACE_CONNECTION_CALLS (1)の値を加算して、合計値の65を指定します。
• |  | JDBCによるプログラムを実行する場合、以下の方法を使ってください。
• |  | ビット演算のOR演算子( | )を二つ以上のトレース値に使います。たとえばプロトコルのフローと接続の呼び出しをトレースする場合、次の値をトレースレベルに指定します。
    TRACE_PROTOCOL_FLOWS | TRACE_CONNECTION_CALLS
• |  | ビット演算の否定演算子( ~ )を特定のトレースを除外する場合に使います。たとえばプロトコルのフロー以外のすべてをトレースする場合、次の値をトレースレベルに指定します。
    ~TRACE_PROTOCOL_FLOWS

他の属性との組み合わせ
この属性を指定する場合、traceFile=path属性あるいはtraceDirectory=path属性を指定しなければなりません。
例

    -- 新規データベースでのトレースを有効にする。
    jdbc:derby://localhost:1527/mydb;create=true;traceFile=trace.out;traceLevel=65

upgrade=true attribute
機能
前バージョンのDerbyにて作成されたデータベースをアップグレードして、現在バージョンのDerbyのデータベースにします。併せて、データベースへの接続も行います。データベースがなければ、エラーログにエラーが出力されて、データベースが見つからなかったことを表すSQLExceptionが挙がって接続に失敗します。
この操作はDerby ディベロッパーズ ガイドにて記述されている「データベースのアップグレード」にて定義されている、フルアップグレードを行います。 アップグレードのより詳細な情報は、Derby ディベロッパーズ ガイドの「アップグレード」以下にある他のトピックを参照してください。
データベースに認証およびSQL認証の両方が設定されている場合、データベースの所有者だけが、データベースをフルアップグレードすることができます。 詳細については、Derby ディベロッパーズ ガイドの、「ユーザ認証を使う」および「SQL標準の認証モードを使う」を参照してください。
他の属性との組み合わせ
(データベース接続URLのサブプロトコルの後にある)データベース名あるいはdatabaseName=nameofDatabaseのいずれかを、この属性に併せて指定する必要があります。
collationあるいは territory=ll_CCと組み合わせて、この属性を使うことはできません。

    jdbc:derby:sampleDB;upgrade=true

    jdbc:derby:;databaseName=sampleDB;upgrade=true;

user=userName 属性
システムの有効なユーザ名をパスワードとともに指定します。ユーザ認証が有効である場合、ユーザ名とパスワードが必要です。
他の属性との組み合わせ
password=userPassword属性と共に利用する必要があります。
次のデータベース接続URLでは、jillというユーザがtoursDBに接続します。

    jdbc:derby:toursDB;user=jill;password=toFetchAPail

ssl=sslMode 属性
機能
クライアントのSSLモードを指定します。 sslModeはbasic、peerAuthenticationあるいはoff(既定)のいずれかの値をとることができます。 詳細はDerby サーバと管理ガイドの、「SSL/TLSを使ったネットワーク暗号化と認証」を参照してください。
他の属性との組み合わせ
他のすべての属性と組み合わせることができます。
例
mydbへbasic SSL暗号化を行う例です。

    jdbc:derby://localhost/mydb;ssl=basic

属性を指定せずにデータベースに接続する
属性を何も指定しない場合、databaseNameを指定する必要があります。
Derbyは現在のシステムディレクトリ下の指定された名前の既存データベースへの接続を開きます。 データベースが存在しなかった場合、接続はデータベースが見つからなかったことを表すSQLExceptionを返そうとします。

    jdbc:derby:mydb

J2EEへの準拠:Java Transaction APIとjavax.sql インターフェイス
J2EE、Java 2 Platform, Enterprise Editionは、多階層環境の再利用可能なソフトウェア部品に基づきエンタープライズアプリケーションを開発する標準です。 J2EEではJava 2 Platform, Standard Edition (J2SE)に加えて、Enterprise Java Beans (EJB)、Java Server Pages (JSP)、サーブレット、XMLなどの機能を提供しています。 J2EEアーキテクチャにより既存の技術やエンタープライズアプリケーションを統合して、単一の管理が可能な環境にまとめ上げることが可能です。
Derbyは分散化されたJ2EEシステムにおいては、J2EE準拠のソフトウェア部品です。JNDIサーバやコネクションプールのモジュール、トランザクションマネージャ、リソースマネージャ、ユーザアプリケーション等のほかのソフトウェアと並んで、Derbyは大きなシステムの一部となるソフトウェアとなります。Derbyは、これらのうち、リソースマネージャとしての機能を提供します。
J2EEについてのより詳細な情報は、http://java.sun.com/javaee/reference/にて入手可能なJ2EEの仕様を参照してください。
J2EEのシステムにてリソースマネージャとして働くためには、J2EEが要求する以下の基本機能・機構を実現しなければなりません。

• |  | JNDIのサポート この機能により、アプリケーションは、データベースの名前を登録して、データベース接続URLではなく、登録した名前によりデータベースに接続できます。JDBCインターフェイスの一つである、javax.sql.DataSourceにより、この機能は実現されています。
• |  | コネクションプーリング リソースマネージャ((Derby)への接続を保持する機構です。 接続を要求するユーザは、プールされた接続をこの機構から受け取ることができます。 接続の確率は比較的に高価な処理となるので、クライアント/サーバの環境にてコネクションプールは有用です。組み込み環境では接続は比較的安価に手に入れることができます。したがってコネクションプールによるパフォーマンス上の利得は余りありません。 この機能はJDBCインターフェイスの、javax.sql.ConnectionPoolDataSourceとjavax.sql.PooledConnectionにより提供されます。
• |  | XA のサポート XAは分散トランザクション管理の標準の一つです。 これは2フェーズコミットに基づくものです。javax.sql.XAxxxインターフェイスとjava.transaction.xaパッケージはXAの抽象的な実装です。 XAの詳細についてはX/Open CAE Specification-Distributed Transaction Processing: The XA Specification, X/Open Document No. XO/CAE/91/300か、ISBN 1 872630 24 3を参照してください。 JTAのAPIは、java.transaction.xaパッケージのインターフェイス(javax.sql.XAConnection,javax.sql.XADataSource,javax.transaction.xa.XAResource,javax.transaction.xa.Xid, and javax.transaction.xa.XAException)から構成されて、この機能を提供します。

基本となるJDBCのインターフェイスを除いて、これらのインターフェイスはエンドユーザーのアプリケーションからは意識されません。これらはシステムのバックエンドのソフトウェアコンポーネントにて利用されます。
Note: これらのインターフェイスを実装するクラスの情報や、どのようにしてDerbyをリソースマネージャーとして使うかは、Derby ディベロッパーズ ガイドの第6章にある「DerbyをJ2EEのリソースマネージャに使う」を参照してください。
JTA API
JTA APIは java.transaction.xaの二つのインターフェイスと一つの例外によりできています。このAPIはDerbyにて全て実装されています。

• |  | javax.transaction.xa.XAResource
• |  | javax.transaction.xa.Xid
• |  | javax.transaction.xa.XAException

製品に関する但し書き
グローバルなトランザクションの復元
XAResource.prepareの呼び出しにより、グローバルなトランザクションはコミット準備済みの状態になり、永続化できるようになります。 コミット準備済みの状態は、一般的にはトランザクションの結果が確定する前の一時的な状態です。しかしながらシステムがクラッシュした場合、復元処理でコミット準備済みのトランザクションはその状態に戻され、トランザクションマネージャからの指示を待ちます。
XAConnection、ユーザ名、パスワード
ユーザ名とパスワードを指定して開いたXAConnectionにて作成したトランザクションは、異なるユーザ名とパスワードで開いたXAConnectionに結び付けることはできません。 ユーザ名とパスワードを指定せずに開いたXAConnectionにて作成したトランザクションは、あらゆるXAConnectionに結び付けることができます。
しかしながら復元されたグローバルなトランザクションではユーザ名とパスワードは失われており、あらゆるXAConnectionが不定なトランザクションをコミットしたりロールバックすることができます。
Note: リモート(クライアント/サーバ)環境にてXAの機能が必要な場合、ネットワーククライアントドライバのXA DataSourceインターフェイスを使ってください。
javax.sql:JDBCインターフェイス
この節ではDerbyが実装するJDBCインターフェイスについて説明します。この仕様はJ2EE準拠の一部に含まれます。
これらの拡張のより詳細な情報は、利用するバージョンのJDKのAPI文書を参照してください。この文書はhttp://java.sun.com/javase/reference/api.jspにもあります。

• |  | javax.sql.DataSource 実在のデータソースを表し、接続のファクトリとして働きます。DataSourceインターフェイスを実装するクラスは一般的には、Java Naming and Directory (JNDI) APIに基づき登録されます。
• |  | javax.sql.ConnectionPoolDataSourceと javax.sql.PooledConnection データベースへの接続はクライアント/サーバの環境では比較的負荷が高い処理です。接続を一度確立した後、同じ接続を複数の要求に供することで、劇的にデータベースのパフォーマンスを向上することができます。 DerbyのConnectionPoolDataSourceおよびPooledConnectionインターフェイスの実装により、コネクションプールサーバはリソースマネージャ(Derby)への接続を維持・管理することができます。 組み込みの環境下では比較的低い負荷で接続を確立することができるので、コネクションプールは必要ではありません。
• |  | javax.sql.XAConnection 単一のXAConnectionから、単一のXAResourceおよび、その生存期間中に複数のConnectionを作ることができます。この種類の接続により、分散トランザクションが可能となります。
• |  | javax.sql.XADataSource XADataSourceを簡単に説明すると、XAConnectionsを作成できるConnectionPoolDataSourceです。

さらにDerbyではXADataSource、DataSourceとConnectionPoolDataSourceに三つのメソッドを用意しています。 Derbyではデータソースの属性をいくつか用意しています。

• |  | setCreateDatabase(String create) 次回の接続でデータベースを作成する属性を設定します。引数の文字列は"create"でなければなりません。
• |  | setShutdownDatabase(String shutdown) データベースを終了する属性を設定します。データベースは次回の接続で終了します。引数の文字列は"shutdown"でなければなりません。

Note: これらの属性はデータベースへの接続を取得する前に設定してください。
Derby API
Derbyのjavadocというサブディレクトリ以下に、APIのクラスとインターフェイスを記述したJavadocのHTMLファイルがあります。
この付録ではAPIの簡単な概要を説明します。Derbyでは、Derbyの主要なAPIである、java.sqlのJavadocは、JDBC APIに含まれるものなので提供しません。 DerbyにおけるJDBCの実装については、JDBC リファレンスを参照してください。
この文書ではAPIのクラスとインターフェイスをいくつかの種類に分類します。スタンドアローンのツールとユーティリティは、コマンドウィンドウにて起動するツールのjava classです。JDBC実装クラスはJDBC APIで、コマンドラインから起動されるものではありません。代わりに、これらのクラスは他のアプリケーションプログラムからプログラムの一部として呼び出すことができます。
スタンドアローンのツールとユーティリティ
以下のクラスはorg.apache.derby.toolsパッケージにあります。

• |  | org.apache.derby.tools.ij SQLスクリプトのためのツールです。組み込みあるいはクライアント/サーバのアプリケーションとして実行することができます。詳細はDerby ツールとユーティリティーガイドを参照してください。
• |  | org.apache.derby.tools.sysinfo サーバサイドで使うコマンドラインのユーティリティで、JVMとDerbyの情報を表示します。 Derby ツールとユーティリティーガイドを参照してください。
• |  | org.apache.derby.tools.dblook データベースの全てあるいは一部を定義するDDLを表示します。詳細はDerby ツールとユーティリティーガイドを参照してください。

JDBCの実装クラス
JDBC driver
このクラスはDerbyのJDBCドライバです。:

• |  | org.apache.derby.jdbc.EmbeddedDriver このクラスにより、Derbyシステムおよび組み込まれたJDBCドライバが起動します。
• |  | org.apache.derby.jdbc.ClientDriver このクラスにより、Derbyのネットワークサーバにクライアント/サーバモードで接続します。

Derby ディベロッパーズ ガイドも参照してください。
データソースのクラス
これら全てはjavax.sql.DataSourceおよび関連のAPIを実装するDerbyのクラスです。 より詳細な情報はDerby ディベロッパーズ ガイドを参照してください。
これらのクラスには、それぞれ対になるクラスがあります。もしアプリケーションがJDK1.5あるいはそれ以前の環境で動作するなら最初のクラスを使ってください。もしアプリケーションがJDK1.6あるいはそれ以降の環境で動作するなら、二つ目(名前が「40」で終わる)のクラスを使ってください。
組み込み環境:

• |  | org.apache.derby.jdbc.EmbeddedDataSource and org.apache.derby.jdbc.EmbeddedDataSource40
• |  | org.apache.derby.jdbc.EmbeddedConnectionPoolDataSource and org.apache.derby.jdbc.EmbeddedConnectionPoolDataSource40
• |  | org.apache.derby.jdbc.EmbeddedXADataSource and org.apache.derby.jdbc.EmbeddedXADataSource40

Client-server environment

• |  | org.apache.derby.jdbc.ClientDataSource and org.apache.derby.jdbc.ClientDataSource40
• |  | org.apache.derby.jdbc.ClientConnectionPoolDataSource and org.apache.derby.jdbc.ClientConnectionPoolDataSource40
• |  | org.apache.derby.jdbc.ClientXADataSource and org.apache.derby.jdbc.ClientXADataSource40

ユーティリティ的なインターフェイス

• |  | org.apache.derby.authentication.UserAuthenticator
• |  | このインターフェイスはDerbyにて提供されます。 ユーザ認証の方法を別途提供するクラスは、このインターフェイスを実装しなければなりません。ユーザについての情報は、Derby ディベロッパーズ ガイドの第7章にある「ユーザ認証を行う」を参照してください。

利用可能な地域情報
利用可能な地域情報を以下に挙げます。

地域 | Derbyの地域設定(derby.territory)
中国語(簡体字) | zh_CN
中国語(繁体字) | zh_TW
チェコ語 | cs
フランス語 | fr
ドイツ語 | de_DE
ハンガリー語 | hu
イタリア語 | it
日本語 | ja_JP
韓国語 | ko_KR
ポーランド語 | pl
ポルトガル語(ブラジル語) | pt_BR
ロシア語 | ru
スペイン語 | es

Derbyの制限事項
この説ではDerbyにある制限事項を挙げます。
データベース設定値の制限
表 107. データベース設定値の制限
以下の表ではDerbyにおける様々なデータベース設定値の制限を挙げます。

値 | 制限
表の最大列数 | 1,012
ビューの最大列数 | 5,000
手続き引数の最大数 | 90
表の最大索引数 | 32,767 あるいは記憶領域の上限
SQL文あるいはビューから参照できる表の最大数 | 記憶領域の上限
選択項目の最大数 | 1,012
WHERE節、HAVING節の述部の最大数 | 記憶領域の上限
GROUP BY節中の列の最大数 | 32,677
ORDER BY節中の列の最大数 | 1,012
準備済み文の最大数 | 記憶領域の上限
プログラムにて定義可能なカーソルの最大数 | 記憶領域の上限
同時に開くことができるカーソルの最大数 | 記憶領域の上限
表に定義できる制約の最大数 | 記憶領域の上限
入れ子にできる副問い合わせの深さの上限 | 記憶領域の上限
文中の副問い合わせ数の上限 | 記憶領域の上限
作業単位で変更できる行数の上限 | 記憶領域の上限
文中の制約数の上限 | 記憶領域の上限
トリガの連鎖数の上限 | 16

DATE、TIMEとTIMESTAMPの制限
以下の表にて、Derbyにおける、日付、時刻とタイムスタンプの制限を記します。
Table 108. DATE、TIMEとTIMESTAMPの制限

値 | 制限
DATEの最小値 | 0001-01-01
DATEの最大値 | 9999-12-31
TIMEの最小値 | 00:00:00
TIMEの最大値 | 24:00:00
TIMESTAMPの最小値 | 0001-01-01-00.00.00.000000
TIMESTAMPの最大値 | 9999-12-31-23.59.59.999999

識別子の長さ制限
表 109. 識別子の長さ制限
以下の表に、Derbyにおける、識別子の長さの制限を記します。

識別子 | 最大の文字数
制約名 | 128
相関名 | 128
カーソル名 | 128
データソースの列名 | 128
データソースの索引名 | 128
データソースの名前 | 128
セーブポイントの名前 | 128
スキーマ名 | 128
限定されていない列名 | 128
限定されていない関数名 | 128
限定されていない索引名 | 128
限定されていない手続き名 | 128
パラメータ名 | 128
限定されていないトリガ名 | 128
限定されていない表名、ビュー名と手続き名 | 128

数値の制限
Derbyでは数値に制限があります。
表 110. 数値の制限

値 | 制限
INTEGERの最小値 | -2,147,483,648
INTEGERの最大値 | 2,147,483,647
BIGINTの最小値 | -9,223,372,036,854,775,808
BIGINTの最大値 | 9,223,372,036,854,775,807
SMALLINTの最小値 | -32,768
SMALLINTの最大値 | 32,767
decimalの精度の最大値 | 31
DOUBLEの最小値 | -1.79769E+308
DOUBLEの最大値 | 1.79769E+308
正のDOUBLEの最小値 | 2.225E-307
負のDOUBLEの最大値 | -2.225E-307
REALの最小値 | -3.402E+38
REALの最大値 | 3.402E+38
正のREALの最小値 | 1.175E-37
負のREALの最大値 | -1.175E-37

並びの制限
表 111. 文字列の制限
以下の表に、Derbyにおける並びの値の制限を記します。

値 | 上限
CHARの長さ | 254文字
VARCHARの長さ | 32,672文字
LONG VARCHARの長さ | 32,700文字
CLOBの長さ | 2,147,483,647文字
BLOBの長さ | 2,147,483,647文字
文字定数の長さ | 32,672
結合された文字列の長さ | 2,147,483,647
バイナリ並びの長さ | 2,147,483,647
16進整数の定数 | 16,336
DOUBLEの定数の長さ | 30 characters

XMLの制限
以下の表に、DerbyでのXMLデータ型の制限を記します。
Table 112. XMLの制限

項目 | 制限
XMLの長さ | 2,147,483,647文字
XML演算子の利用 | Apache XercesのようなJAXP構文解析器とApache Xalanのクラスが、クラスパスに記述されている必要があります。クラスパスにこれらのクラスがない場合、XML演算子を利用するとエラーとなります。

Trademarks
The following terms are trademarks or registered trademarks of other companies and have been used in at least one of the documents in the Apache Derby documentation library:
Cloudscape, DB2, DB2 Universal Database, DRDA, and IBM are trademarks of International Business Machines Corporation in the United States, other countries, or both.
Microsoft, Windows, Windows NT, and the Windows logo are trademarks of Microsoft Corporation in the United States, other countries, or both.
Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.
UNIX is a registered trademark of The Open Group in the United States and other countries.
Other company, product, or service names may be trademarks or service marks of others.
•