<?xml version="1.0" encoding="UTF-8"?>
<document>
	<properties>
		<title>S2JDBC-Gen - ファイルの形式</title>
	</properties>
	<body>
		<section name="ファイルの形式">
			<ul>
				<li>
					<p>
						<a href="#概要">概要</a>
					</p>
				</li>
				<li>
					<p>
						<a href="#SQLファイル">SQLファイル</a>
					</p>
					<ul>
						<li>
							<p>
								<a href="#SQLファイルの名前">SQLファイルの名前</a>
							</p>
						</li>
						<li>
							<p>
								<a href="#SQLファイルのデータ">SQLファイルのデータ</a>
							</p>
						</li>
					</ul>
				</li>
				<li>
					<p>
						<a href="#ダンプファイル">ダンプファイル</a>
					</p>
					<ul>
						<li>
							<p>
								<a href="#ダンプファイルファイルの名前">ダンプファイルの名前</a>
							</p>
						</li>
						<li>
							<p>
								<a href="#ダンプファイルのデータ">ダンプファイルのデータ</a>
							</p>
						</li>
					</ul>
				</li>
			</ul>
		</section>
		<section name="概要">
			<p>
				S2JDBC-Genでは、いくつかの種類のファイルを扱いますが、それらのファイルは決められた形式でなければいけません。
			</p>
			<p>
				ここでは、ファイルごとの形式について説明します。
			</p>
		</section>
		<section name="SQLファイル">
			<p>
				SQLファイルは<a href="tasks/gen_ddl.html">Gen-Ddl</a>タスクで生成されます。
			</p>
			<p>
				生成されたSQLファイルや独自に作成したSQLファイルは、
				<a href="tasks/exec_sql.html">Exec-Sql</a>タスクや
				<a href="tasks/migrate.html">Migrate</a>タスクで実行できます。
			</p>
			<p>
				1つのSQLファイルには、複数のSQLステートメントやSQLブロックを記述できます。
			</p>
			<subsection name="SQLファイルの名前">
				<p>
					ファイル名に制限はありません。
				</p>
				<p>
					拡張子は.sqlもしくは.ddlでなければいけません。
				</p>
			</subsection>
			<subsection name="SQLファイルのデータ">
				<p>
					SQLファイルは次のように記述できます。
				</p>
<source><![CDATA[/*
 * テーブル定義（SQLステートメント）
 */
create table EMPLOYEE (
  ID numeric(5) primary key,  -- 識別子
  NAME varchar2(20)           -- 名前
);

/*
 * データの追加（SQLステートメント）
 */
insert into EMPLOYEE (ID, NAME) values (1, 'SMITH');

/*
 * プロシージャー定義（SQLブロック）
 */
create or replace procedure proc 
( cur out sys_refcursor, 
  employeeid in numeric
) as
begin
  open cur for select * from employee where id > employeeid order by id; 
end proc_resultset;
/
]]></source>
				<p>
					コメントは1行コメント（--）とブロックコメント（/* */）の2種類が使用できます。
					コメントは取り除かれてデータベースへ発行されます。
				</p>
				<p>
					1つのSQLステートメントは複数行に分けて記述できます。
					ステートメントは各タスクのstatementDelimiter属性に指定した値で区切る必要があります。
					この例では「;」が使用されています。
					改行はステートメントの区切りとはみなされません。
				</p>
				<p>
					ストアドプロシージャーなどのSQLブロックは、各タスクのblockDelimiter属性に指定した値で区切る必要があります。
					この例では「/」が使用されています。
					区切り文字は行頭に記述し、区切り文字の後ろには何も記述しないようにしてください。
					つまり、区切り文字だけの行としなければいけません。
					SQLブロックの中では、statementDelimiter属性に指定した値を使用してもSQLが区切られません。
				</p>
			</subsection>
		</section>
		<section name="ダンプファイル">
			<p>
				データベースのデータは<a href="tasks/gen_ddl.html">Gen-Ddl</a>タスクや
				<a href="tasks/dump_data.html">Dump-Data</a>タスクによりCSV形式でダンプされます。
			</p>
			<p>
				ダンプファイルは、
				<a href="tasks/migrate.html">Migrate</a>タスクや<a href="tasks/load_data.html">Load-Data</a>タスクでロードできます。
			</p>
			<p>
				1つのダンプファイルには、1つのテーブルに対応するデータが含まれます。
			</p>
			<subsection name="ダンプファイルの名前">
				<p>
					ダンプファイルの名前は、カタログ名、スキーマ名、テーブル名の情報を含んだものになります。
					したがって、カタログ名、スキーマ名、テーブル名を定義する際には、ファイルシステムで使用できない文字を含まないように注意してください。
				</p>
				<p>
					拡張子は.csvでなければいけません。
				</p>
			</subsection>
			<subsection name="ダンプファイルのデータ">
				<p>
					データは次のようになります。
				</p>
<source><![CDATA["ID","DEPT_NO","DEPT_NAME","LOC","VERSION_NO"
"1","10","ACCOUNTING","NEW YORK","1"
"2","20","RESEARCH","DALLAS","1"
"3","30","SALES","CHICAGO","1"
"4","40","OPERATIONS","BOSTON","1"]]></source>
				<p>
					これは、DEPARTMENTテーブルのデータをダンプ出力したものです。
				</p>
				<p>
					最初の1行目はテーブルのカラムを表すヘッダー行になります。
					ヘッダー行は必須です。
					2行目以降がデータ行になります。
					データ行の列数はヘッダー行と同じでなければいけません。
				</p>
				<p>
					null以外のすべてのデータはダブルクォテーションで囲むことができます。
					<a href="tasks/gen_ddl.html">Gen-Ddl</a>タスクや
					<a href="tasks/dump_data.html">Dump-Data</a>タスクは上記の例のように必ずすべてのデータをダブルクォテーションで囲んで出力します。
				</p>
				<p>
					nullと空文字の表現方法は異なります。nullは長さが0のデータです。
					例えば、次のデータは、DEPT_NAMEがnullであることを表します。
				</p>
<source><![CDATA["ID","DEPT_NO","DEPT_NAME","LOC","VERSION_NO"
"1","10",,"NEW YORK","1"]]></source>
				<p>
					空文字は長さ0のデータをダブルクォテーションで囲んだものです。
					例えば、次のデータは、DEPT_NAMEが空文字であることを表します。
				</p>
<source><![CDATA["ID","DEPT_NO","DEPT_NAME","LOC","VERSION_NO"
"1","10","","NEW YORK","1"]]></source>
				<p>
					カンマで区切られたデータごとの形式は、対応するエンティティのプロパティの型により決まります。
				</p>
				<table border="1" cellpadding="2" cellspacing="0">
					<tr><th>プロパティの型</th><th>データの形式</th></tr>
					<tr><td>String、char/Character</td><td>文字列表現です。ただし、ダブルクォテーション、カンマ、改行コードのいずれかを含む場合は、文字列全体をダブルクォテーションで囲む必要があります。そのとき、データとしてのダブルクォテーションはダブルクォテーションを2重にすることでエスケープしなければいけません。空文字は、ダブルクォテーションで囲む必要があります。</td></tr>
					<tr><td>@Temporal(TemporalType.DATE)が指定されたjava.util.Date、@Temporal(TemporalType.DATE)が指定されたjava.util.Calendar、java.sql.Date</td><td>yyyy/MM/ddの形式でなければいけません。</td></tr>
					<tr><td>@Temporal(TemporalType.TIME)が指定されたjava.util.Date、@Temporal(TemporalType.TIME)が指定されたjava.util.Calendar、java.sql.Time</td><td>hh:mm:ssの形式でなければいけません。</td></tr>
					<tr><td>@Temporal(TemporalType.TIMESTAMP)が指定されたjava.util.Date、@Temporal(TemporalType.TIMESTAMP)が指定されたjava.util.Calendar、java.sql.Timestamp</td><td>yyyy/MM/dd hh:mm:ss.fffffffffの形式でなければいけません。ただし、.fffffffffについてはなくてもかまいません。</td></tr>
					<tr><td>byte[]、Serializable</td><td>Base64でエンコードされた形式で表現されます。</td></tr>
					<tr><td>Enum型</td><td>S2JDBCで永続化される際に使用される値（列挙の順序もしくは名前）の文字列表現です。</td></tr>
					<tr><td>その他の型</td><td>文字列表現です。</td></tr>
				</table>
				<p>
					データを編集する際は、上述の形式に従ってください。
					編集にはCSVエディタを利用することを推奨します。
					CSVエディタについては<a href="setup.html#CSVエディタ">セットアップのCSVエディタ</a>を参照してください。
				</p>
			</subsection>
		</section>
	</body>
</document>
