Для работы с БД у меня есть библиотека, в ней используется такой код:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
public static function query($sql, &$ref_params=null, $batch=false) {
...
foreach ($params as $param=>&$value) {
switch (gettype($value)) {
case 'string':
$t = SQLT_CHR;
$s = 200;
break;
case 'integer':
$t = SQLT_INT;
$s = 16;
break;
default:
$t = SQLT_CHR;
$s = 200;
break;
}
if (in_array($param, $paramlist)) {
if (static::debug()) print_r(['oci_bind_by_name',$st, $param, $value, (array_key_exists($param,$return) ? $s : -1), $t]);
oci_bind_by_name($st, $param, $value, (array_key_exists($param,$return) ? $s : -1), $t);
}
}
...
if (static::debug()) {
print "\n*DEBUG*\n";
print "SQL: *$sql*\n";
print "ARG: " . print_r($params, true) . "\n";
print "\n";
}
oci_set_prefetch($st, 100);
$res = oci_execute($st, ($batch ? OCI_NO_AUTO_COMMIT : OCI_COMMIT_ON_SUCCESS));
...
}
Для простых select-запросов код работает нормально.
С insert почему-то проблема.
Вызываю код так:
1.
$bm->exec($sql, [':ivi'=>$ivi::IVI_BM_ID, ':client'=>$row['ID'], ':account'=>$row['ACCOUNT_ID'], ':service'=>$row['SERVICE_ID'], ':token'=>$key]);
Из отладочного вывода я вижу, что все задается правильно:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
*DEBUG*
SQL: *insert into TRANS_BATCH_LINK (TRANS_PROVIDER_ID, LOCAL_CLIENT_ID, LOCAL_ACCOUNT_ID, LOCAL_SERVICE_ID, FIELD, VALUE)
values (:ivi, :client, :account, :service, 'access_token', :token)
*
ARG: Array
(
[:ivi] => 2
[:client] => 2829
[:account] => 7081
[:service] => 328937
[:token] => xxxxx_xxxxx_xxxxx_xxxxx_xxxxx
)
Если SQL-запрос выполнять вручную, то он успешно выполняется.
Биндинг переменных тоже работает корректно:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
Array
(
[0] => oci_bind_by_name
[1] => Resource id #31
[2] => :ivi
[3] => 2
[4] => -1
[5] => 3
)
Array
(
[0] => oci_bind_by_name
[1] => Resource id #31
[2] => :client
[3] => 2829
[4] => -1
[5] => 1
)
Array
(
[0] => oci_bind_by_name
[1] => Resource id #31
[2] => :account
[3] => 7081
[4] => -1
[5] => 1
)
Array
(
[0] => oci_bind_by_name
[1] => Resource id #31
[2] => :service
[3] => 328937
[4] => -1
[5] => 1
)
Array
(
[0] => oci_bind_by_name
[1] => Resource id #31
[2] => :token
[3] => xxxxx_xxxxx_xxxxx_xxxxx_xxxxx
[4] => -1
[5] => 1
)
Длина переменной задана -1, т.к. это входящие параметры, для возвращаемых параметров задается буфер фиксированного размера, но в этом запросе возвращаемых параметров нет.
Однако при выполнении кода я получаю ошибку:
1.
2.
PHP Warning: oci_bind_by_name(): ORA-01036: illegal variable name/number in .../lib/classes/Billing.class.php on line 299
Warning: oci_bind_by_name(): ORA-01036: illegal variable name/number in .../lib/classes/Billing.class.php on line 299
Строка 299 — это как раз строка, где биндятся параметры запроса.
Что тут неправильно?