1. php如何讀取clob欄位
寫入數據
在使用PDO的預處理方法時,如果使用bindParam()等而不指定欄位的數據類型或使用execute(),PDO都會默認為string類型,並且限定一個默認長度
所以在存clob類型欄位時必須使用bindParam()或bindValue()等,並指定字元串長度,例如 $pdo -> bindParam(『:clobData』, $clobData, PDO::PARAM_STR,strlen($clobData));
讀取數據
PDO取出的CLOB欄位值在該欄位不為空時是資源標識符,為空時為空字元串,取數據方法如下
$arr = $pdo -> fetch();
is_resource($arr[『clob』]) && $arr[『clob』] =stream_get_contents($arr[『clob』]);
希望能幫到你
2. php操作oracle的clob類型,為什麼老是提示錯誤
哥們,我也遇到這樣的問題啊,同求解,解決了說一聲啊
3. php+oracle讀取和插入clob類型欄位的數據
我在mysql上做的,沒oracle的環境,你說出錯,能不能把錯誤貼出來看下
4. php調用oracle存儲過程與函數
對於存儲過程的源代碼,開始都需要先定義接受的參數,例如:
PROCEDURE edit_entry(
status_out OUT NUMBER,
status_msg_out OUT VARCHAR2,
id_inout IN OUT INTEGER,
title_in IN VARCHAR2,
text_out OUT CLOB,
categories_in IN list_of_numbers
);
從 PHP 中調用存儲過程 對於要從 PHP 中執行以調用過程的 SQL 語句而言,您將通常在 Oracle BEGIN ...END; 塊(稱作匿名塊)中嵌入調用。例如:
<?php
// etc.
//$sql = 'BEGIN sayHello(:name, :message); END;';
//然後,通過調用 oci_bind_by_name() 將參數綁定到 PHP 變數。 如果使用以下 DDL 語句定義了 sayHello
//:
//CREATE OR REPLACE PROCEDURE
//sayHello (name IN VARCHAR2, greeting OUT VARCHAR2)
//AS
//BEGIN
//greeting := 'Hello ' || name;
//END;
//
//注意,您可以使用 SQL*Plus 命令行運行上面的語句。將該語句保存到文件 (SAYHELLO.SQL)。接下來,使用
//SQL*Plus 登錄:
//$ sqlplus username@SID
//然後,使用 START 命令創建該過程:
//SQL> START /home/username/SAYHELLO.SQL
//以下 PHP 腳本調用該過程:$conn = oci_connect('SCOTT','TIGER') or die;
$sql = 'BEGIN sayHello(:name, :message); END;';
$stmt = oci_parse($conn,$sql);
// Bind the input parameter
oci_bind_by_name($stmt,':name',$name,32);
// Bind the output parameter
oci_bind_by_name($stmt,':message',$message,32);
// Assign a value to the input
$name = 'Harry';
oci_execute($stmt);
// $message is now populated with the output value
print "$message\n";
?>
調用程序包中的過程時,將使用句號來分隔程序包名稱與過程名稱。 可以使用以下語句指定 blog 程序包:
CREATE OR REPLACE PACKAGE blog AS
TYPE cursorType IS REF CURSOR RETURN blogs%ROWTYPE;
/*
Fetch the latest num_entries_in from the blogs table, populating
entries_cursor_out with the result
*/
PROCEDURE latest(
num_entries_in IN NUMBER,
entries_cursor_out OUT cursorType
);
/*
Edit a blog entry.If id_inout is NULL, results in an INSERT, otherwise
attempts to UPDATE the existing blog entry. status_out will have the value
1 on success, otherwise a negative number on failure with status_msg_out
containing a description
categories_in is a collection where list_of_numbers is described by
TYPE list_of_numbers AS VARRAY(50) OF NUMBER;
*/
PROCEDURE edit_entry(
status_out OUT NUMBER,
status_msg_out OUT VARCHAR2,
id_inout IN OUT INTEGER,
title_in IN VARCHAR2,
text_out OUT CLOB,
categories_in IN list_of_numbers
);
END blog;
/
5. 如何提取clob類型的數據
給你段參考代碼,讀取clob數據
import java.io.InputStream;
import java.io.Reader;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestClobOut {
public static void main(String args[]){
String data;
Reader inStream=null;
//獲得資料庫連接
Connection con = ConnectionFactory.getConnection();//ConnectionFactory類是另外定義的,不必糾結
con.setAutoCommit(false);
Statement st = con.createStatement();
//不需要「for update」
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1");
if (rs.next())
{
java.sql.Clob clob = rs.getClob("CLOBATTR");
inStream = clob.getCharacterStream();
char[] c = new char[(int) clob.length()];
inStream.read(c);
//data是讀出並需要返回的數據,類型是String
data = new String(c);
inStream.close();
}
inStream.close();
con.commit();
con.close();
}
}
6. 在window環境和Linux環境下怎麼用PHP連接oracle資料庫,具體的步驟怎麼做怎麼載入模塊載入哪些模塊
windows和Linux都能執行
Oracle Call Interface(OCI)使用戶可以訪問 Oracle 10,Oracle9,Oracle8 和 Oracle7 資料庫。支持將 PHP 變數與 Oracle 佔位符(placeholder)綁定,具有完整的 LOB,FILE 和 ROWID 支持,以及允許使用用戶提供的定義變數。
例子 1. 基本查詢
<?php
$conn = oci_connect('hr', 'hr', 'orcl');
if (!$conn) {
$e = oci_error();
print htmlentities($e['message']);
exit;
}
$query = 'SELECT * FROM DEPARTMENTS';
$stid = oci_parse($conn, $query);
if (!$stid) {
$e = oci_error($conn);
print htmlentities($e['message']);
exit;
}
$r = oci_execute($stid, OCI_DEFAULT);
if(!$r) {
$e = oci_error($stid);
echo htmlentities($e['message']);
exit;
}
print '<table border="1">';
while($row = oci_fetch_array($stid, OCI_RETURN_NULLS)) {
print '<tr>';
foreach($row as $item) {
print '<td>'.($item?htmlentities($item):' ').'</td>';
}
print '</tr>';
}
print '</table>';
oci_close($conn);
?>
例子 2. 用綁定變數插入
<?php
// Before running, create the table:
// CREATE TABLE MYTABLE (mid NUMBER, myd VARCHAR2(20));
$conn = oci_connect('scott', 'tiger', 'orcl');
$query = 'INSERT INTO MYTABLE VALUES(:myid, :mydata)';
$stid = oci_parse($conn, $query);
$id = 60;
$data = 'Some data';
oci_bind_by_name($stid, ':myid', $id);
oci_bind_by_name($stid, ':mydata', $data);
$r = oci_execute($stid);
if($r)
print "One row inserted";
oci_close($conn);
?>
例子 3. 將數據插入到 CLOB 列中
<?php
// Before running, create the table:
// CREATE TABLE MYTABLE (mykey NUMBER, myclob CLOB);
$conn = oci_connect('scott', 'tiger', 'orcl');
$mykey = 12343; // arbitrary key for this example;
$sql = "INSERT INTO mytable (mykey, myclob)
VALUES (:mykey, EMPTY_CLOB())
RETURNING myclob INTO :myclob";
$stid = oci_parse($conn, $sql);
$clob = oci_new_descriptor($conn, OCI_D_LOB);
oci_bind_by_name($stid, ":mykey", $mykey, 5);
oci_bind_by_name($stid, ":myclob", $clob, -1, OCI_B_CLOB);
oci_execute($stid, OCI_DEFAULT);
$clob->save("A very long string");
oci_commit($conn);
// Fetching CLOB data
$query = 'SELECT myclob FROM mytable WHERE mykey = :mykey';
$stid = oci_parse ($conn, $query);
oci_bind_by_name($stid, ":mykey", $mykey, 5);
oci_execute($stid, OCI_DEFAULT);
print '<table border="1">';
while ($row = oci_fetch_array($stid, OCI_ASSOC)) {
$result = $row['MYCLOB']->load();
print '<tr><td>'.$result.'</td></tr>';
}
print '</table>';
?>
可以很容易地訪問存儲過程,就和從命令行訪問一樣。 例子 4. 使用存儲過程
<?php
// by webmaster at remoterealty dot com
$sth = oci_parse($dbh, "begin sp_newaddress( :address_id, '$firstname',
'$lastname', '$company', '$address1', '$address2', '$city', '$state',
'$postalcode', '$country', :error_code );end;");
// This calls stored procere sp_newaddress, with :address_id being an
// in/out variable and :error_code being an out variable.
// Then you do the binding:
oci_bind_by_name($sth, ":address_id", $addr_id, 10);
oci_bind_by_name($sth, ":error_code", $errorcode, 10);
oci_execute($sth);
?>
連接處理
OCI8 擴展提供了 3 個不同函數來連接 Oracle。取決於用戶來使用對自己的應用程序最合適的函數。本節的信息有助於用戶作出合適的選擇。
連接到 Oracle 伺服器從所需的時間上來講是個相當花費的操作。oci_pconnect() 函數使用了一個連接的持久緩沖區,可以被不同的腳本請求重復使用。這意味著通常在每個 PHP 進程(或 Apache 子進程)中只需要連接一次。
如果應用程序連接 Oracle 時對每個 web 用戶都使用了不同的認證信息,則由 oci_pconnect() 使用的持久緩沖區就用處不大了,因為隨著並發用戶的增加,到某個程度後會由於要保持太多的空閑連接而對 Oracle 伺服器的整體性能起到逆反的影響。如果應用程序是這樣的架構,建議要麼用 oci8.max_persistent 和 oci8.persistent_timeout 配置選項(此二者可以使用戶控制持久連接緩沖區的大小和生命周期)來協調應用程序,要麼用 oci_connect() 來連接。
oci_connect() 和 oci_pconnect() 都使用了一個連接緩沖區。如果在某個腳本中用同樣的參數多次調用 oci_connect(),則第二個和之後的調用會返回已有的連接句柄。oci_connect() 使用的連接緩沖區會在腳本執行完畢後或者明確地關閉了連接句柄時被清空。oci_pconnect() 有相似的行為,不過其緩沖區獨立地維持著並在不同請求之間都存活著。
要記住此緩沖特性,因為它使兩個句柄沒有在事務級隔離開來(事實上是同一個連接句柄,因此沒有任何方式的隔離)。如果應用程序需要兩個獨立的,事務級隔離的連接,應該使用 oci_new_connect()。
oci_new_connect() 總是創建一個到 Oracle 伺服器的新連接,不管其它連接是否已經存在。高流量的 web 應用應該避免使用 oci_new_connect(),尤其是在程序最忙的部分。
有關於它的其他函數:
目錄
OCI-Collection->append -- 向 collection 增加單元
OCI-Collection->assign -- 從現有的另一個 collection 向 collection 賦值
OCI-Collection->assignElem -- 給 collection 中的單元賦值
OCI-Collection->free -- 釋放關聯於 collection 的對象的資源
OCI-Collection->getElem -- 返回單元的值
OCI-Collection->max -- 返回 collection 中單元的最大數目
OCI-Collection->size -- 返回 collection 中的單元數目
OCI-Collection->trim -- 從 collection 尾端開始刪除單元
OCI-Lob->append -- Appends data from the large object to another large object
OCI-Lob->close -- 關閉 LOB 描述符
OCI-Lob->eof -- Tests for end-of-file on a large object's descriptor
OCI-Lob->erase -- Erases a specified portion of the internal LOB data
OCI-Lob->export -- 將 LOB 的內容導出到文件中
OCI-Lob->flush -- Flushes/writes buffer of the LOB to the server
OCI-Lob->free -- 釋放與 LOB 描述符所關聯的資源
OCI-Lob->getBuffering -- Returns current state of buffering for the large object
OCI-Lob->import -- 將數據從文件導入 LOB
OCI-Lob->load -- 返回大對象的內容
OCI-Lob->read -- Reads part of the large object
OCI-Lob->rewind -- Moves the internal pointer to the beginning of the large object
OCI-Lob->save -- 將數據保存到大對象中
OCI-Lob->seek -- Sets the internal pointer of the large object
OCI-Lob->setBuffering -- Changes current state of buffering for the large object
OCI-Lob->size -- Returns size of large object
OCI-Lob->tell -- Returns current position of internal pointer of large object
OCI-Lob->truncate -- Truncates large object
OCI-Lob->write -- Writes data to the large object
OCI-Lob->writeTemporary -- 寫入一個臨時的大對象
oci_bind_by_name -- 綁定一個 PHP 變數到一個 Oracle 位置標志符
oci_cancel -- 取消從游標讀取數據
oci_close -- 關閉 Oracle 連接
oci_commit -- 提交未執行的事務處理
oci_connect -- 建立一個到 Oracle 伺服器的連接
oci_define_by_name -- 在 SELECT 中使用 PHP 變數作為定義的步驟
oci_error -- 返回上一個錯誤
oci_execute -- 執行一條語句
oci_fetch_all -- 獲取結果數據的所有行到一個數組
oci_fetch_array -- Returns the next row from the result data as an associative or numeric array, or both
oci_fetch_assoc -- Returns the next row from the result data as an associative array
oci_fetch_object -- Returns the next row from the result data as an object
oci_fetch_row -- Returns the next row from the result data as a numeric array
oci_fetch -- Fetches the next row into result-buffer
oci_field_is_null -- 檢查欄位是否為 NULL
oci_field_name -- 返回欄位名
oci_field_precision -- 返回欄位精度
oci_field_scale -- 返回欄位范圍
oci_field_size -- 返回欄位大小
oci_field_type_raw -- 返回欄位的原始 Oracle 數據類型
oci_field_type -- 返回欄位的數據類型
oci_free_statement -- 釋放關聯於語句或游標的所有資源
oci_internal_debug -- 打開或關閉內部調試輸出
oci_lob_ -- Copies large object
oci_lob_is_equal -- Compares two LOB/FILE locators for equality
oci_new_collection -- 分配新的 collection 對象
oci_new_connect -- 建定一個到 Oracle 伺服器的新連接
oci_new_cursor -- 分配並返回一個新的游標(語句句柄)
oci_new_descriptor -- 初始化一個新的空 LOB 或 FILE 描述符
oci_num_fields -- 返回結果列的數目
oci_num_rows -- 返回語句執行後受影響的行數
oci_parse -- 配置 Oracle 語句預備執行
oci_password_change -- 修改 Oracle 用戶的密碼
oci_pconnect -- 使用一個持久連接連到 Oracle 資料庫
oci_result -- 返回所取得行中欄位的值
oci_rollback -- 回滾未提交的事務
oci_server_version -- 返回伺服器版本信息
oci_set_prefetch -- 設置預提取行數
oci_statement_type -- 返回 OCI 語句的類型
ocibindbyname -- oci_bind_by_name() 的別名
ocicancel -- oci_cancel() 的別名
ocicloselob -- OCI-Lob->close 的別名
ocicollappend -- OCI-Collection->append 的別名
ocicollassign -- OCI-Collection->assign 的別名
ocicollassignelem -- OCI-Collection->assignElem 的別名
ocicollgetelem -- OCI-Collection->getElem 的別名
ocicollmax -- OCI-Collection->max 的別名
ocicollsize -- OCI-Collection->size 的別名
ocicolltrim -- OCI-Collection->trim 的別名
ocicolumnisnull -- oci_field_is_null() 的別名
ocicolumnname -- oci_field_name() 的別名
ocicolumnprecision -- oci_field_precision() 的別名
ocicolumnscale -- oci_field_scale() 的別名
ocicolumnsize -- oci_field_size() 的別名
ocicolumntype -- oci_field_type() 的別名
ocicolumntyperaw -- oci_field_type_raw() 的別名
ocicommit -- oci_commit() 的別名
ocidefinebyname -- oci_define_by_name() 的別名
ocierror -- oci_error() 的別名
ociexecute -- oci_execute() 的別名
ocifetch -- oci_fetch() 的別名
ocifetchinto -- 獲取下一行到一個數組
ocifetchistatement -- oci_fetch_all() 的別名
ocifreecollection -- OCI-Collection->free 的別名
ocifreecursor -- oci_free_statement() 的別名
ocifreedesc -- OCI-Lob->free 的別名
ocifreestatement -- oci_free_statement() 的別名
ociinternaldebug -- oci_internal_debug() 的別名
ociloadlob -- OCI-Lob->load 的別名
ocilogoff -- oci_close() 的別名
ocilogon -- oci_connect() 的別名
ocinewcollection -- oci_new_collection() 的別名
ocinewcursor -- oci_new_cursor() 的別名
ocinewscriptor -- oci_new_descriptor() 的別名
ocinlogon -- oci_new_connect() 的別名
ocinumcols -- oci_num_fields() 的別名
ociparse -- oci_parse() 的別名
ociplogon -- oci_pconnect() 的別名
ociresult -- oci_result() 的別名
ocirollback -- oci_rollback() 別名
ocirowcount -- oci_num_rows() 的別名
ocisavelob -- OCI-Lob->save 的別名
ocisavelobfile -- OCI-Lob->import 的別名
ociserverversion -- oci_server_version() 的別名
ocisetprefetch -- oci_set_prefetch() 的別名
ocistatementtype -- oci_statement_type() 的別名
ociwritelobtofile -- OCI-Lob->export 的別名
ociwritetemporarylob -- OCI-Lob->writeTemporary 的別名