SQLclの文字化け対策(MS932で使う)

SQL*Plusの後継といってよいと思うツールのSQLcl。コマンドラインで使うときに便利だけれど、参考URLとかがUTF-8だったので、何とかMS932でやれないかと文字化けで苦労したので、その覚書。

SQLcl単体でもダウンロードできますが、SQL Developerに同梱されてるもので試してます。
あと、SQL DeveloperはJRE同梱版をお勧めします。JREのバージョンが違うと動かないので。

テストに利用したOracleのDBの文字コードはJA16SJISTILDEです。
```bat
SQL> select * from v$nls_parameters;
PARAMETER                  VALUE                            CON_ID
__________________________ _____________________________ _________
NLS_LANGUAGE               JAPANESE                              3
NLS_TERRITORY              JAPAN                                 3
NLS_CURRENCY               \                                     3
NLS_ISO_CURRENCY           JAPAN                                 3
NLS_NUMERIC_CHARACTERS     .,                                    3
NLS_CALENDAR               GREGORIAN                             3
NLS_DATE_FORMAT            YYYY/MM/DD HH24:MI:SS                 3
NLS_DATE_LANGUAGE          JAPANESE                              3
NLS_CHARACTERSET           JA16SJISTILDE                         3
NLS_SORT                   BINARY                                3
NLS_TIME_FORMAT            HH24:MI:SSXFF                         3
NLS_TIMESTAMP_FORMAT       RR-MM-DD HH24:MI:SSXFF                3
NLS_TIME_TZ_FORMAT         HH24:MI:SSXFF TZR                     3
NLS_TIMESTAMP_TZ_FORMAT    RR-MM-DD HH24:MI:SSXFF TZR            3

PARAMETER                 VALUE           CON_ID
_________________________ ____________ _________
NLS_DUAL_CURRENCY         \                    3
NLS_NCHAR_CHARACTERSET    AL16UTF16            3
NLS_COMP                  BINARY               3
NLS_LENGTH_SEMANTICS      BYTE                 3
NLS_NCHAR_CONV_EXCP       FALSE                3

19行が選択されました。
```



# 参考URL
[https://scrapbox.io/cybernote/SQLcl](https://scrapbox.io/cybernote/SQLcl)

[https://docs.oracle.com/cd/F40596_01/sqcug/working-sqlcl.html#GUID-7AEF14E8-EA31-49A8-9A11-A9E765E2C7B6](https://docs.oracle.com/cd/F40596_01/sqcug/working-sqlcl.html#GUID-7AEF14E8-EA31-49A8-9A11-A9E765E2C7B6)

# DOS窓で使うためのバッチファイル作成
次のバッチファイルを作成して、ここからSQLclを起動する。環境変数やパスを設定する案もあり。

```bat:sqlcl.bat
@echo off

:: tnsnames.oraの場所
SET TNS_ADMIN=%HOMEDRIVE%%HOMEPATH%

:: クライアント側の文字
:: SET NLS_LANG=Japanese_Japan.JA16SJISTILDE
:: spoolのエンコーディング
:: SET JAVA_TOOL_OPTIONS="-Duser.language=ja"

:: SQLclの場所
SET AP_PATH=C:\opt\programs\sqldeveloper\sqldeveloper\bin
:: login.sqlの場所
SET SQLPATH=%HOMEDRIVE%%HOMEPATH%

%AP_PATH%\sql /nolog
```

SQL Developerは``c:\opt\programs\sqldeveloper``にインストールしている前提。
tnsnames.oraは``%HOMEDRIVE%%HOMEPATH%``直下にある前提。

<FONT color="RED">2022/10/08 NLS_LANGとJAVA_TOOL_OPTIONSを指定せずとも文字化けしなかった。</FONT>
~~文字化け対策のポイントは次の2つ。~~
~~ポイント1：<FONT color="RED">NLS_LANGに"Japanese_Japan.JA16SJISTILDE"</FONT>を入れる。画面の文字化け対策。~~
~~ポイント2：<FONT color="RED">JAVA_TOOL_OPTIONSに"-Duser.language=ja -Dfile.encoding=MS932"</FONT>を入れる。特にspoolする際の文字化け対策としてfile.encodingの指定が重要。spoolのデフォルトエンコーディングがUTF-8っぽい。~~

# お試し用のsqlファイル

次のsqlファイルを上記バッチから動かします。

```sql:insms932.sql
SET ENCODING MS932

spool "c:\temp\insms932.log"

conn a001/a001@ORCLPDB1
SHOW ENCODING
SHOW SQLFORMAT

drop table t_order_item cascade constraint;

create table t_order_item (
  order_item_id decimal(7,0) not null
  , shipping_address_desc char(50)
  , constraint pk_t_order_item primary key ( order_item_id )
)
;
insert into t_order_item (order_item_id, shipping_address_desc) values(1, '漢字(0x8160:～)');
insert into t_order_item (order_item_id, shipping_address_desc) values(2, 'ｶﾀｶﾅ');
insert into t_order_item (order_item_id, shipping_address_desc) values(3, 'ABC@!\~');
insert into t_order_item (order_item_id, shipping_address_desc) values(4, '(ほっけ)');

commit;

SET SQLFORMAT CSV
SHOW SQLFORMAT
select * from t_order_item;

SET SQLFORMAT INSERT
SHOW SQLFORMAT
select * from t_order_item;

SET SQLFORMAT ANSICONSOLE
SHOW SQLFORMAT
select * from t_order_item;

spool off
```

# 実行結果
```bat
接続しました.

Sessionが変更されました。

encoding "MS932"
SQL書式: ANSICONSOLE

Table T_ORDER_ITEMが削除されました。


Table T_ORDER_ITEMは作成されました。


1行挿入しました。


1行挿入しました。


1行挿入しました。


1行挿入しました。


コミットが完了しました。

SQL書式: CSV
"ORDER_ITEM_ID","SHIPPING_ADDRESS_DESC"
1,"漢字(0x8160:～)                                   "
2,"ｶﾀｶﾅ                                              "
3,"ABC@!\~                                           "
4,"(ほっけ)                                          "

SQL書式: INSERT
REM INSERTING into T_ORDER_ITEM
SET DEFINE OFF;
Insert into T_ORDER_ITEM (ORDER_ITEM_ID,SHIPPING_ADDRESS_DESC) values (1,'漢字(0x8160:～)                                   ');
Insert into T_ORDER_ITEM (ORDER_ITEM_ID,SHIPPING_ADDRESS_DESC) values (2,'ｶﾀｶﾅ                                              ');
Insert into T_ORDER_ITEM (ORDER_ITEM_ID,SHIPPING_ADDRESS_DESC) values (3,'ABC@!\~                                           ');
Insert into T_ORDER_ITEM (ORDER_ITEM_ID,SHIPPING_ADDRESS_DESC) values (4,'(ほっけ)                                          ');

SQL書式: ANSICONSOLE

   ORDER_ITEM_ID SHIPPING_ADDRESS_DESC                                 
________________ _____________________________________________________ 
               1 漢字(0x8160:～)                                          
               2 ｶﾀｶﾅ                                                  
               3 ABC@!\~                                               
               4 (ほっけ)                                                 

```