見出し画像

シェルからSQL実行する(hsqldb-01,MAC,zsh,Java19)

概要

hsqldb付属のsqltool.jarでコマンドラインからSQLを指定して実行する。
Apache Derby付属のijで実行と同等の内容。
まず、MACのターミナルを起動してプロンプト表示を実行シェルがわかるように変えた後、MACのSafariでhsqldbをホームサイトからダウンロードした場合に配置されるディレクトリをHSQLDB_HOMEという環境変数に設定する。

~ % PS1="%N %# "
-zsh % HSQLDB_HOME=~/Downloads/hsqldb-2.7.1/hsqldb

hsqldbではSQLでのvalues構文が使用できるのでまずそれを試す。

-zsh % java -jar ${HSQLDB_HOME}/lib/sqltool.jar --inlineRc=url=jdbc:hsqldb:mem:. --sql="values(5+4*3/2-1);"
10

別解としてvalues構文を下記のようにFROM句で(values(0))指定で使用するとSELECTでORACLEのDUAL表と同様に使用できる。

-zsh % java -jar ${HSQLDB_HOME}/lib/sqltool.jar --inlineRc=url=jdbc:hsqldb:mem:. --sql="SELECT 5+4*3/2-1 from (values(0));"
10

ORACLE互換構文であることをSQL内で明示的にSET DATABASE SQL SYNTAX ORA TRUE指定することでDUAL表指定でも使用できる。

-zsh % java -jar ${HSQLDB_HOME}/lib/sqltool.jar --inlineRc=url=jdbc:hsqldb:mem:. --sql="SET DATABASE SQL SYNTAX ORA TRUE;SELECT 5+4*3/2-1 from DUAL;"
10

ORACLE互換構文の指定はコマンドラインでのJDBC設定のURLプロパティ側でsql.syntax_ora=trueすることでも使用できる。

-zsh % java -jar ${HSQLDB_HOME}/lib/sqltool.jar --inlineRc=url="jdbc:hsqldb:mem:.;sql.syntax_ora=true" --sql="SELECT 5+4*3/2-1 from DUAL;"
10

補足であるが互換構文指定がない場合はDUAL表使用はエラーになる。

-zsh % java -jar ${HSQLDB_HOME}/lib/sqltool.jar --inlineRc=url=jdbc:hsqldb:mem:. --sql="SELECT 5+4*3/2-1 from DUAL;"
223, 2023 11:42:51 午後 org.hsqldb.cmdline.SqlTool objectMain
重大: SQL Error at '--sql' line 1:
"SELECT 5+4*3/2-1 from DUAL"
user lacks privilege or object not found: DUAL
org.hsqldb.cmdline.SqlTool$SqlToolException

DUAL表はDB2互換構文指定時も使用できる。

-zsh % java -jar ${HSQLDB_HOME}/lib/sqltool.jar --inlineRc=url=jdbc:hsqldb:mem:. --sql="SET DATABASE SQL SYNTAX DB2 TRUE;SELECT 5+4*3/2-1 from DUAL;"
10
-zsh % java -jar ${HSQLDB_HOME}/lib/sqltool.jar --inlineRc=url="jdbc:hsqldb:mem:.;sql.syntax_db2=true" --sql="SELECT 5+4*3/2-1 from DUAL;"           
10

MSSQLServer互換構文指定時にはFROM句を省いたSELECT指定で同様の結果が得られる。

-zsh % java -jar ${HSQLDB_HOME}/lib/sqltool.jar --inlineRc=url=jdbc:hsqldb:mem:. --sql="SET DATABASE SQL SYNTAX MSS TRUE;SELECT 5+43/2-1;"
10
-zsh % java -jar ${HSQLDB_HOME}/lib/sqltool.jar --inlineRc=url="jdbc:hsqldb:mem:.;sql.syntax_mss=true" --sql="SELECT 5+43/2-1;"
10

このFROM句無しのSELECT文使用も互換指定の無い場合エラーになる。

-zsh % java -jar ${HSQLDB_HOME}/lib/sqltool.jar --inlineRc=url=jdbc:hsqldb:mem:. --sql="SELECT 5+4*3/2-1;" 
302, 2023 9:47:59 午前 org.hsqldb.cmdline.SqlTool objectMain
重大: SQL Error at '--sql' line 1:
"SELECT 5+4*3/2-1"
unexpected end of statement
org.hsqldb.cmdline.SqlTool$SqlToolException

FROM句無しのSELECT文使用はMYSQL互換構文指定時にも使用できる。

-zsh % java -jar ${HSQLDB_HOME}/lib/sqltool.jar --inlineRc=url=jdbc:hsqldb:mem:. --sql="SET DATABASE SQL SYNTAX MYS TRUE;SELECT 5+4*3/2-1;"
10
-zsh % java -jar ${HSQLDB_HOME}/lib/sqltool.jar --inlineRc=url="jdbc:hsqldb:mem:.;sql.syntax_mys=true" --sql="SELECT 5+4*3/2-1;"
10

また、PostgreSQL互換構文指定時にも使用できる。

-zsh % java -jar ${HSQLDB_HOME}/lib/sqltool.jar --inlineRc=url=jdbc:hsqldb:mem:. --sql="SET DATABASE SQL SYNTAX PGS TRUE;SELECT 5+4*3/2-1;"
10
-zsh % java -jar ${HSQLDB_HOME}/lib/sqltool.jar --inlineRc=url="jdbc:hsqldb:mem:.;sql.syntax_pgs=true" --sql="SELECT 5+4*3/2-1;"
10

実行環境

-zsh % sw_vers
ProductName:		macOS
ProductVersion:		13.2
BuildVersion:		22D49
-zsh % zsh --version
zsh 5.8.1 (x86_64-apple-darwin22.0)
-zsh % java -version
openjdk version "19.0.2" 2023-01-17
OpenJDK Runtime Environment Homebrew (build 19.0.2)
OpenJDK 64-Bit Server VM Homebrew (build 19.0.2, mixed mode, sharing)
-zsh % echo ${PS1}
%N %# 
-zsh % java -jar ${HSQLDB_HOME}/lib/sqltool.jar --inlineRc=url=jdbc:hsqldb:mem:. --sql="select DATABASE_VERSION() from (values(0));" 
2.7.1

hsqldb版数取得にselect DATABASE_VERSION() from (values(0));を使用。

参照

MacOS環境でJavaを使用する
MacOS環境のJavaでhsqldbを使用する
シェルからSQL実行する(Apache Derby-01,MAC,zsh,Java19)

この記事が気に入ったらサポートをしてみませんか?