やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

SQLite3構文 expression(パラメータ)

 SQL文内で使える変数。sqlite_bind()関数でセットする。今回は.param set Key Valueで使う。

成果物

パラメータ

書式 意味
?NNN NNNには1SQLITE_MAX_VARIABLE_NUMBER(デフォルトは999)の数値をセットする。その位置
? 非推奨。?NNN推奨。他のDBMSとの互換性のためにある。
:AAA 名前付きパラメータ。?NNN同様、番号が振られる。混乱をさけるため併用すべきでない。
@AAA パラメータの名前が@AAAである。他は:AAAと同様。
$AAA Tcl言語における変数名の形式。1つ以上の::と接尾辞(...)を含めることができる。
  • 値が割り当てられていないパラメータはNULLになる
  • sqlite3_bind_parameter_index()関数でパラメータのインデックスを返す

一覧

?NNN

 ?1に値Aをセット。

.param init
.param set ?1 A

 ?1SQL文にセット。

select 'A' = ?1;
1
select 'B' = ?1;
0

 ?1の値を変更。

.param set ?1 B
select 'B' = ?1;
1

 未作成のパラメータが使われたらNULLになる。

select 'B' = ?2;





.param list
?1 'B'

:AAA

 :queryに値Aをセット。

.param init
.param set :query A
select 'A' = :query;
1
select 'B' = :query;
0
.param set :query B
select 'B' = :query;
1

@AAA

 @queryに値Aをセット。

.param init
.param set @query A
select 'A' = @query;
1
select 'B' = @query;
0
.param set @query B
select 'B' = @query;
1

$AAA

 $queryに値Aをセット。

.param init
.param set $query A
select 'A' = $query;
1
select 'B' = $query;
0

 Tcl形式の連想配列

.param init
.param set $human(name) Yamada
.param set $human(age) 20
select $human(name);
select $human(age);
Yamada
20

 名前空間

.param init
.param set $human::name Yamada
.param set $human::age 20
select $human::name;
select $human::age;
Yamada
20

 名前空間なら2つ以上の階層もOK。

.param init
.param set $sys::human::name Yamada
.param set $sys::human::age 20
select $sys::human::name;
select $sys::human::age;
Yamada
20

 名前空間を使った上で、連想配列もOK。

.param init
.param set $sys::human(name) Yamada
.param set $sys::human(age) 20
select $sys::human(name);
select $sys::human(age);
Yamada
20

 以下は未定義のためNULL

select $sys::human;



 ::の代わりに.を使おうとしたがダメ。

.param init
.param set $sys.human(name) Yamada
.param set $sys.human(age) 20
select $sys.human(name);
select $sys.human(age);
Error: near ".": syntax error
Error: near ".": syntax error

 連想配列のキー名に.が使える。

.param init
.param set $ns::sys(human.name) Yamada
.param set $ns::sys(human.age) 20
select $ns::sys(human.name);
select $ns::sys(human.age);
Yamada
20

 だが、親子関係はない。完全一致するキー名としてのみ使える。よって以下のようにすると、未定義キーなのでNULLが返される。[name,age]とか['Yamada',20]などが返されることはない。

select $ns::sys(human);



対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux

前回まで