コマンドラインからSQLに引数を渡す方法についてまとめています。
SQLに引数を渡すサンプルコード
引数渡しの方法は、DBMSごとにまったく異なっています。それぞれサンプルを交えて解説します。
MySQLで、コマンドラインからSQLに引数を渡すサンプルコード
MySQLのCLIコマンド、mysqlには変数を渡すためのオプションがありません。しかし、以下のように-eオプションで変数を設定するSQLをコマンドラインに含めることでシェルの変数を渡すことができます。
以下の例では、@aに20000,@bにKyoichiを代入して、ファイルtest.sqlの内容を実行しています。
$ mysql -u user1 -p -e "set @a=20000; set @b='Kyoichi'; source test.sql;" Enter password: +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 20988 | 1960-01-31 | Kyoichi | Lamma | M | 1988-07-13 | | 21560 | 1953-09-28 | Kyoichi | Dechter | M | 1985-11-19 | | 23879 | 1962-08-09 | Kyoichi | Vesel | M | 1991-06-29 | | 24635 | 1964-08-12 | Kyoichi | Cochrane | F | 1994-03-19 | | 24723 | 1960-11-04 | Kyoichi | Penn | M | 1985-09-18 | | 24803 | 1957-06-20 | Kyoichi | Ranta | M | 1993-07-24 | | 25114 | 1954-11-29 | Kyoichi | Bednarek | F | 1991-12-20 | | 26475 | 1961-03-22 | Kyoichi | Bierbaum | F | 1990-03-01 | | 28794 | 1954-05-20 | Kyoichi | Peron | M | 1987-03-15 | | 30043 | 1961-11-09 | Kyoichi | Litvinov | M | 1989-01-24 | +--------+------------+------------+-----------+--------+------------+
test.sqlの内容は以下の通りです。
$ cat test.sql select * from employees.employees where emp_no > @a and first_name = @b limit 10;
Oracleで、コマンドラインからSQLに引数を渡すサンプルコード
Oracleでは、&変数名という記述をすることで、引数を渡すことができます。SQL*Plusにて、以下のようにしてstats.sqlを作成します。
SELECT &GROUP_COL, MAX(&NUMBER_COL) MAXIMUM FROM &TABLE GROUP BY &GROUP_COL . SAVE STATS
@statsでファイルstats.sqlを実行すると&変数名の箇所で入力を求められます。
@stats Enter value for group_col: JOB_ID old 1: SELECT &GROUP_COL, new 1: SELECT JOB_ID, Enter value for number_col: SALARY old 2: MAX(&NUMBER_COL) MAXIMUM new 2: MAX(SALARY) MAXIMUM Enter value for table: EMP_DETAILS_VIEW old 3: FROM &TABLE new 3: FROM EMP_DETAILS_VIEW Enter value for group_col: JOB_ID old 4: GROUP BY &GROUP_COL new 4: GROUP BY JOB_ID
&変数の箇所に入力した値が代入され、SQLが実行されます。
JOB_ID MAXIMUM ---------- ---------- AC_ACCOUNT 8300 AC_MGR 12000 AD_ASST 4400 AD_PRES 24000 AD_VP 17000 FI_ACCOUNT 9000 FI_MGR 12000 HR_REP 6500 IT_PROG 9000 MK_MAN 13000 MK_REP 6000 JOB_ID MAXIMUM ---------- ---------- PR_REP 10000 PU_CLERK 3100 PU_MAN 11000 SA_MAN 14000 SA_REP 11500 SH_CLERK 4200 ST_CLERK 3600 ST_MAN 8200 19 rows selected.
参考)Oracle公式:SQL*Plusでのスクリプトの使用
なお、コマンドラインから引数を渡すには、以下のように実行することで、先頭から順に&変数に指定した引数が渡されます。
@stats JOB_ID SALARY EMP_DETAILS_VIEW JOB_ID
【関連記事】
▶SQL*Plusコマンド一覧と使い方まとめ
postgreSQLで、コマンドラインからSQLに引数を渡すサンプルコード
postgreSQLでは、psqlコマンドに-vオプションで変数を設定すると、SQL内で「:変数名」の箇所に代入されます。以下は、DVDレンタルデータベースで、引数渡しでリリース年が2006年のものを抽出した例です。
$ psql -U postgres -d dvdrental -v var1=2006 < ./test.sql film_id | title | description ---------+-------------------+----------------------------------------------------------------------------------------------------------------------- 133 | Chamber Italian | A Fateful Reflection of a Moose And a Husband who must Overcome a Monkey in Nigeria 384 | Grosse Wonderful | A Epic Drama of a Cat And a Explorer who must Redeem a Moose in Australia 8 | Airport Pollock | A Epic Tale of a Moose And a Girl who must Confront a Monkey in Ancient India 98 | Bright Encounters | A Fateful Yarn of a Lumberjack And a Feminist who must Conquer a Student in A Jet Boat 1 | Academy Dinosaur | A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies 2 | Ace Goldfinger | A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China 3 | Adaptation Holes | A Astounding Reflection of a Lumberjack And a Car who must Sink a Lumberjack in A Baloon Factory 4 | Affair Prejudice | A Fanciful Documentary of a Frisbee And a Lumberjack who must Chase a Monkey in A Shark Tank 5 | African Egg | A Fast-Paced Documentary of a Pastry Chef And a Dentist who must Pursue a Forensic Psychologist in The Gulf of Mexico 6 | Agent Truman | A Intrepid Panorama of a Robot And a Boy who must Escape a Sumo Wrestler in Ancient China (10 rows)
SQLファイルtest.sqlの内容は以下のとおりです。
$ cat test.sql select film_id, title, description from film where release_year=:var1 limit 10;
まとめ
- MySQLの引数渡しは、-eオプションでsetで変数設定する
- Oracleの引数渡しは、@SQLファイル名に続けて引数を羅列する
- postgreSQLの引数渡しは、-vオプションで変数を設定する