kuro

1 minute read

ORA-01008 バインドされていない変数があります

Laravelを使っていて遭遇したこの

ORA-01008 バインドされていない変数があります。

検索しても簡単に探せなかったのでメモをしておきます。

今回はLaravelでクエリを生成する際に発生したエラーでした。

まず、ログなり確認して生成されたSQLをSQLクライアントに貼り付けて実際に動作するか確認してみます。

今回のは動かなかったので、バインドされている変数を見てみると、値が想定と違う場所に来ていました。

場所を見るとサブクエリを使っている部分で、Laravelでサブクエリを使う際にbindingの追加をしていないことが原因のようでした。

ただ単純にmergeBinding($subquery)をしただけでは、?に埋まるバインド変数がおかしな順序になってしまいました。
順序にも気をつける必要があります。
というより今回はQueryBuilder(hogetable::select(~~~)を使っておらず、ファサード(DB::table(〜〜))を使ってjoinしていたので、

addBinding($subquery->getBindings(), 'join')

をサブクエリをjoinした後に書きました。
その後、$mainqueryのquery内のbindingsをみると追加されていました。
joinを使ったなら、addBindingのtypeは指定しないとうまくバインドできないようでした。

以上、備忘録でした。