Я хочу вставить данные в столбец clob и varchar2 в одном операторе вставки в Oracle.
$conn=oci_connect();
if (!$conn)
{
$e = oci_error(); // For oci_connect errors pass no handle
echo "if not connection<br>";
echo htmlentities($e['message']);
}
else
{
//Where email and type column has varchar2 datatype and elements column has CLOB datatype
$isql="INSERT INTO TEST_DEV
VALUES(':email',':type',':elements')";
$stmt = oci_parse($conn,$isql);
oci_bind_by_name($stmt, ":email", '[email protected]');
oci_bind_by_name($stmt, ":type", 'test_records');
oci_bind_by_name($stmt, ":elements", 'asdadasdsa|asdsa',-1,OCI_B_BLOB);
$rc=oci_execute($stmt);
if(!$rc)
{
$e=oci_error($stmt);
var_dump($e);
}
oci_commit($conn);
}
oci_free_statement($stmt);
oci_close($conn);
Этот код дает ошибку. Как решить ??
Спасибо,
Фейсал Насир
Вам нужно удалить апострофы вокруг заполнителей в вашем SQL, иначе вы вставите текст «: email» буквально, а не переменные данные, которые вы пытаетесь связать:
$isql = 'INSERT INTO TEST_DEV VALUES(:email, :type, :elements)';
oci_bind_by_name()
не принимает строковые литералы в качестве значений, так как связывается по ссылке. Присвойте свои значения переменным и используйте их в вызове функции:
$email = '[email protected]';
oci_bind_by_name($stmt, ':email', $email);
Поскольку вы вставляете только символьные данные (в конце концов, это CLOB), вам не нужно делать что-то другое с вашей привязкой. oci_bind_by_name()
по умолчанию SQLT_CHR
так что просто свяжите как другие переменные:
$elements = 'asdadasdsa|asdsa';
oci_bind_by_name($stmt, ':elements', $elements);
Для дальнейшего ознакомления (включая несколько примеров работы с LOB) прочитайте Работа с большими объектами в Oracle и PHP в «Oracle + PHP Cookbook».
Других решений пока нет …