『壹』 oracle中查詢clob欄位時報空指針
update tbname
set 欄位=EMPTY_CLOB()
where ....;
http://www.itpub.net/viewthread.php?tid=22626&pid=16990072&page=1&extra=#
這個文章 非常棒
『貳』 php+oracle怎麼操作clob類型欄位的增刪改
http://www.bbsdba.com/forum.php?mod=viewthread&tid=61064&extra=page%3D1
『叄』 php+oracle讀取和插入clob類型欄位的數據
我在mysql上做的,沒oracle的環境,你說出錯,能不能把錯誤貼出來看下
『肆』 oracle資料庫和mysql資料庫的區別
Oracle資料庫與MySQL資料庫的區別是本文我們主要介紹的內容,希望能夠對您有所幫助。
1.組函數用法規則
mysql中組函數在select語句中可以隨意使用,但在oracle中如果查詢語句中有組函數,那其他列名必須是組函數處理過的,或者是group by子句中的列否則報錯
eg:
select name,count(money) from user;這個放在mysql中沒有問題在oracle中就有問題了。
2.自動增長的數據類型處理
MYSQL有自動增長的數據類型,插入記錄時不用操作此欄位,會自動獲得數據值。ORACLE沒有自動增長的數據類型,需要建立一個自動增長的序列號,插入記錄時要把序列號的下一個值賦於此欄位。
CREATE SEQUENCE序列號的名稱(最好是表名+序列號標記)INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;
其中最大的值按欄位的長度來定,如果定義的自動增長的序列號NUMBER(6),最大值為999999
INSERT語句插入這個欄位值為:序列號的名稱.NEXTVAL
3.單引號的處理
MYSQL里可以用雙引號包起字元串,ORACLE里只可以用單引號包起字元串。在插入和修改字元串前必須做單引號的替換:把所有出現的一個單引號替換成兩個單引號。
4.翻頁的SQL語句的處理
MYSQL處理翻頁的SQL語句比較簡單,用LIMIT開始位置,記錄個數;PHP里還可以用SEEK定位到結果集的位置。ORACLE處理翻頁的SQL語句就比較繁瑣了。每個結果集只有一個ROWNUM欄位標明它的位置,並且只能用ROWNUM<100,不能用ROWNUM>80。
以下是經過分析後較好的兩種ORACLE翻頁SQL語句(ID是唯一關鍵字的欄位名):
語句一:
SELECT ID, [FIELD_NAME,...] FROM
TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW, ID
FROM TABLE_NAME WHERE 條件1 ORDER BY 條件2) WHERE NUMROW > 80 AND NUMROW
< 100 ) ORDER BY 條件3;
語句二:
SELECT * FROM (( SELECT ROWNUM AS
NUMROW, c.* from (select [FIELD_NAME,...] FROM TABLE_NAME WHERE 條件1
ORDER BY 條件2) c) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY
條件3;
5.長字元串的處理
長字元串的處理ORACLE也有它特殊的地方。INSERT和UPDATE時最大可操作的字元串長度小於等於4000個單位元組,如果要插入更長的字元串,請考慮欄位用CLOB類型,方法借用ORACLE里自帶的DBMS_LOB程序包。插入修改記錄前一定要做進行非空和長度判斷,不能為空的欄位值和超出長度欄位值都應該提出警告,返回上次操作。
6.日期欄位的處理
MYSQL日期欄位分DATE和TIME兩種,ORACLE日期欄位只有DATE,包含年月日時分秒信息,用當前資料庫的系統時間為SYSDATE,精確到秒,或者用字元串轉換成日期型函數TO_DATE(『2001-08-01』,』YYYY-MM-DD』)年-月-日24小時:分鍾:秒的格式YYYY-MM-DD
HH24:MI:SS TO_DATE()還有很多種日期格式,可以參看ORACLE
DOC.日期型欄位轉換成字元串函數TO_CHAR(『2001-08-01』,』YYYY-MM-DD HH24:MI:SS』)
日期欄位的數學運算公式有很大的不同。MYSQL找到離當前時間7天用DATE_FIELD_NAME
> SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE找到離當前時間7天用 DATE_FIELD_NAME
>SYSDATE - 7;
MYSQL中插入當前時間的幾個函數是:NOW()函數以`'YYYY-MM-DD
HH:MM:SS'返回當前的日期時間,可以直接存到DATETIME欄位中。CURDATE()以』YYYY-MM-DD』的格式返回今天的日期,可以直接存到DATE欄位中。CURTIME()以』HH:MM:SS』的格式返回當前的時間,可以直接存到TIME欄位中。例:insert
into tablename (fieldname) values (now())
而oracle中當前時間是sysdate
7.空字元的處理
MYSQL的非空欄位也有空的內容,ORACLE里定義了非空欄位就不容許有空的內容。按MYSQL的NOT NULL來定義ORACLE表結構,導數據的時候會產生錯誤。因此導數據時要對空字元進行判斷,如果為NULL或空字元,需要把它改成一個空格的字元串。
8.字元串的模糊比較
MYSQL里用欄位名like%『字元串%』,ORACLE里也可以用欄位名like%『字元串%』但這種方法不能使用索引,速度不快,用字元串比較函數instr(欄位名,『字元串』)>0會得到更精確的查找結果。
9.程序和函數里,操作資料庫的工作完成後請注意結果集和指針的釋放。
=======================================================================================
1. Oracle是大型資料庫而Mysql是中小型資料庫,Oracle市場佔有率達40%,Mysql只有20%左右,同時Mysql是開源的而Oracle價格非常高。
2. Oracle支持大並發,大訪問量,是OLTP最好的工具。
3. 安裝所用的空間差別也是很大的,Mysql安裝完後才152M而Oracle有3G左右,且使用的時候Oracle佔用特別大的內存空間和其他機器性能。
4.Oracle也Mysql操作上的區別
①主鍵
Mysql一般使用自動增長類型,在創建表時只要指定表的主鍵為auto increment,插入記錄時,不需要再指定該記錄的主鍵值,Mysql將自動增長;Oracle沒有自動增長類型,主
鍵一般使用的序列,插入記錄時將序列號的下一個值付給該欄位即可;只是ORM框架是只要是native主鍵生成策略即可。
②單引號的處理
MYSQL里可以用雙引號包起字元串,ORACLE里只可以用單引號包起字元串。在插入和修改字元串前必須做單引號的替換:把所有出現的一個單引號替換成兩個單引號。
③翻頁的SQL語句的處理
MYSQL處理翻頁的SQL語句比較簡單,用LIMIT 開始位置, 記錄個數;ORACLE處理翻頁的SQL語句就比較繁瑣了。每個結果集只有一個ROWNUM欄位標明它的位置, 並且只能用
ROWNUM<100, 不能用ROWNUM>80
④ 長字元串的處理
長字元串的處理ORACLE也有它特殊的地方。INSERT和UPDATE時最大可操作的字元串長度小於等於4000個單位元組, 如果要插入更長的字元串, 請考慮欄位用CLOB類型,方法借用
ORACLE里自帶的DBMS_LOB程序包。插入修改記錄前一定要做進行非空和長度判斷,不能為空的欄位值和超出長度欄位值都應該提出警告,返回上次操作。
⑤空字元的處理
MYSQL的非空欄位也有空的內容,ORACLE里定義了非空欄位就不容許有空的內容。按MYSQL的NOT NULL來定義ORACLE表結構, 導數據的時候會產生錯誤。因此導數據時要對空字元
進行判斷,如果為NULL或空字元,需要把它改成一個空格的字元串。
⑥字元串的模糊比較
MYSQL里用 欄位名 like '%字元串%',ORACLE里也可以用 欄位名 like '%字元串%' 但這種方法不能使用索引, 速度不快。
⑦Oracle實現了ANSII SQL中大部分功能,如,事務的隔離級別、傳播特性等而Mysql在這方面還是比較的弱。
『伍』 請問下mysql和oracle的區別
請問下mysql和oracle的區別:
1、價格
價格是兩個資料庫之間最顯著的差異。Oracle有一個名為Oracle Express Edition的東西,這個版本完全免費。不幸的是,該版本對這些功能有太多限制。如果你繼續購買全功能標准版或企業版,它將花費你數萬美元。另一方面,MySQL是一個開源資料庫,完全免費。最著名的Facebook社交網站運行在MySQL上。
2、安全
雖然MySQL使用三個參數來驗證用戶,即用戶名,密碼和位置,但Oracle使用了許多安全功能,如用戶名,密碼,配置文件,本地身份驗證,外部身份驗證,高級安全增強功能等。
3、對象名稱
雖然某些模式對象名稱在Oracle和MySQL中都不區分大小寫,例如列,存儲過程,索引等,但在某些情況下,兩個資料庫之間的區分大小寫不同;Oracle對所有對象名稱都不區分大小寫,但是,與Oracle不同,某些MySQL對象名稱(如資料庫和表)區分大小寫(取決於底層操作系統)。
4、字元數據類型
兩個資料庫中支持的字元類型存在一些差異。MySQL為字元類型提供CHAR和VARCHAR,最大長度允許為65,535位元組(CHAR最多可以為255位元組,VARCHAR為65.535位元組)。另一方面,Oracle支持四種字元類型,即CHAR,NCHAR,VARCHAR2和NVARCHAR2;所有四種字元類型都需要至少1個位元組長;CHAR和NCHAR最大可以是2000個位元組,NVARCHAR2和VARCHAR2的最大限制是4000個位元組。可能會在最新版本中進行擴展。
『陸』 php操作oracle的clob類型,為什麼老是提示錯誤
哥們,我也遇到這樣的問題啊,同求解,解決了說一聲啊
『柒』 php+oracle讀取clob類型的欄位報錯
htmlspecialchars是字元串轉義函數,參數是字元串,而你給了一個對象
『捌』 SQL Server 和 Oracle 以及 MySQL 有哪些區別
Oracle
Oracle 能在所有主流平台上運行(包括Windows)。完全支持所有的工業標准。採用完全開放策略。可以使客戶選擇最適合的解決方案。對開發商全力支持,Oracle並行伺服器通過使一組結點共享同一簇中的工作來擴展Windows NT的能力,提供高可用性和高伸縮性的簇的解決方案。如果Windows NT不能滿足需要,用戶可以把資料庫移到UNIX中。Oracle的並行伺服器對各種UNIX平台的集群機制都有著相當高的集成度。Oracle獲得最高認證級別的ISO標准認證.Oracle性能最高,保持開放平台下的TPC-D和TPC-C的世界記錄Oracle多層次網路計 算,支持多種工業標准,可以用ODBC、JDBC、OCI等網路客戶連接。
Oracle 在兼容性、可移植性、可聯結性、高生產率上、開放性也存在優點。Oracle產品採用標准SQL,並經過美國國家標准技術所(NIST)測試。與 IBM SQL/DS,DB2,INGRES,IDMS/R等兼容。Oracle的產品可運行於很寬范圍的硬體與操作系統平台上。可以安裝在70種以上 不同的大、中、小型機上;可在VMS、DOS、UNIX、WINDOWS等多種操作系統下工作。能與多種通訊網路相連,支持各種協議(TCP/IP、 DECnet、LU6.2等)。提供了多種開發工具,能極大的方便用戶進行進一步的開發。Oracle良好的兼容性、可移植性、可連接性和高生產率是 Oracle RDBMS具有良好的開放性。
Oracle價格是比較昂貴的。據說一套正版的Oracle軟體早在2006年年底的時候在市場上的價格已經達到了6位數。所以如果你的項目不是那種超級大的項目,還是放棄Oracle吧。
SQL Server
SQL Server 是 Microsoft推出一套產品,它具有使用方便、可伸縮性好、與相關軟體集成程度高等優點,逐漸成為Windows平台下進行資料庫應用開發較為理想的 選擇之一。SQLServer是目前流行的資料庫之一,它已廣泛應用於金融、保險、電力、行政管理等與資料庫有關的行業。而且,由於其易操作性及友好的界 面,贏得了廣大用戶的青睞,尤其是SQLServer與其它資料庫,如Access、FoxPro、Excel等有良好的ODBC介面,可以把上述資料庫 轉成SQLServer的資料庫,因此目前越來越多的讀者正在使用SQLServer。
SQL Server由於是微軟的產品,又有著如此強大的功能,所以他的影響力是幾種資料庫系統中比較大,用戶也是比較多的。它一般是和同是微軟產品的.net平台一起搭配使用。當然其他的各種開發平台,都提供了與它相關的資料庫連接方式。因此,開發軟體用SQL Server做資料庫是一個正確的選擇。
MySQL
MySQL不支持事務處理,沒有視圖,沒有存儲過程和觸發器,沒有資料庫端的用戶自定義函數,不能完全使用標準的SQL語法。
從資料庫行家聽說的第一件事就是MySQL缺乏transactions,rollbacks, 和subselects的功能。如果你計劃使用MySQL寫一個關於銀行、會計的應用程序,或者計劃維護一些隨時需要線性遞增的不同類的計數器,你將缺乏transactions功能。在現有的發布版本的 MySQL下,請不要有任何的這些想法。(請注意,MySQL的測試版3.23.x系列現在已經支持transactions了)。
在非常必要的情況下,MySQL的局限性可以通過一部分開發者的努力得到克服。在MySQL中你失去的主要功能是subselect語句,而這正是其它的所有資料庫都具有的。換而言之,這個失去的功能是一個痛苦。
MySQL沒法處理復雜的關聯性資料庫功能,例如,子查詢(subqueries),雖然大多數的子查詢都可以改寫成join
另一個MySQL沒有提供支持的功能是事務處理(transaction)以及事務的提交(commit)/撤銷(rollback)。一個事務指的是被當作一個單位來共同執行的一群或一套命令。如果一個事務沒法完成,那麼整個事務裡面沒有一個指令是真正執行下去的。對於必須處理線上訂單的商業網站來說,MySQL沒有支持這項功能,的確讓人覺得很失望。但是可以用MaxSQL,一個分開的伺服器,它能通過外掛的表格來支持事務功能。
外鍵(foreignkey)以及參考完整性限制(referentialintegrity)可以讓你制定表格中資料間的約束,然後將約束 (constraint)加到你所規定的資料裡面。這些MySQL沒有的功能表示一個有賴復雜的資料關系的應用程序並不適合使用MySQL。當我們說 MySQL不支持外鍵時,我們指的就是資料庫的參考完整性限制--MySQL並沒有支持外鍵的規則,當然更沒有支持連鎖刪除(cascadingdelete)的功能。簡短的說,如果你的工作需要使用復雜的資料關聯,那你還是用原來的Access吧。
你在MySQL中也不會找到存儲進程(storedprocere)以及觸發器(trigger)。(針對這些功能,在Access提供了相對的事件進程(eventprocere)。
MySQL+php+apache三者被軟體開發者稱為「php黃金組合」。
Oracle和MySQL的主要區別
Oracle:客戶端和命令窗口,都是由用戶決定內容-> conn user_name/password;
MySQL:客戶端和命令窗口,都是由資料庫決定內容-> use datebase;
都可以創建多資料庫多用戶,個人傾向於Oracle一個資料庫中多個用戶的形式,MySQL多個資料庫多個用戶形式(最好每個資料庫對應一個用戶)
Oracle是大型資料庫而MySQL是中小型資料庫,Oracle市場佔有率達40%,MySQL只有20%左右,同時MySQL是開源的而Oracle價格非常高。
Oracle支持大並發,大訪問量,是OLTP(On-Line Transaction Processing聯機事務處理系統)最好的工具。
安裝所用的空間差別也是很大的,MySQL安裝完後才152M而Oracle有3G左右,且使用的時候Oracle佔用特別大的內存空間和其他機器性能。
Oracle也與MySQL操作上的一些區別
組函數用法規則
MySQL中組函數在select語句中可以隨意使用,但在Oracle中如果查詢語句中有組函數,那其他列名必須是組函數處理過的,或者是group by子句中的列否則報錯
eg:
select name,count(money) from user;這個放在MySQL中沒有問題在Oracle中就有問題了。
自動增長的數據類型處理
MySQL有自動增長的數據類型,插入記錄時不用操作此欄位,會自動獲得數據值。Oracle沒有自動增長的數據類型,需要建立一個自動增長的序列號,插入記錄時要把序列號的下一個值賦於此欄位。
CREATE SEQUENCE序列號的名稱(最好是表名+序列號標記)INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;
其中最大的值按欄位的長度來定,如果定義的自動增長的序列號NUMBER(6),最大值為999999
INSERT語句插入這個欄位值為:序列號的名稱.NEXTVAL
單引號的處理
MySQL里可以用雙引號包起字元串,Oracle里只可以用單引號包起字元串。在插入和修改字元串前必須做單引號的替換:把所有出現的一個單引號替換成兩個單引號。
翻頁的SQL語句的處理
MySQL處理翻頁的SQL語句比較簡單,用LIMIT開始位置,記錄個數;PHP里還可以用SEEK定位到結果集的位置。Oracle處理翻頁的SQL語句就比較繁瑣了。每個結果集只有一個ROWNUM欄位標明它的位置,並且只能用ROWNUM<100,不能用ROWNUM>80。
以下是經過分析後較好的兩種Oracle翻頁SQL語句(ID是唯一關鍵字的欄位名):
語句一:
SELECT ID, [FIELD_NAME,...] FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW, ID FROM TABLE_NAME WHERE 條件1 ORDER BY 條件2) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 條件3;
語句二:
SELECT * FROM (( SELECT ROWNUM AS NUMROW, c.* from (SELECT [FIELD_NAME,...] FROM TABLE_NAME WHERE 條件1 ORDER BY 條件2) c) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 條件3;
長字元串的處理
長字元串的處理Oracle也有它特殊的地方。INSERT和UPDATE時最大可操作的字元串長度小於等於4000個單位元組,如果要插入更長的字元串,請考慮欄位用CLOB類型,方法借用Oracle里自帶的DBMS_LOB程序包。插入修改記錄前一定要做進行非空和長度判斷,不能為空的欄位值和超出長度欄位值都應該提出警告,返回上次操作。
日期欄位的處理
MySQL日期欄位分DATE和TIME兩種,Oracle日期欄位只有DATE,包含年月日時分秒信息,用當前資料庫的系統時間為SYSDATE,精確到秒,或者用字元串轉換成日期型函數TO_DATE('2001-08-01','YYYY-MM-DD')年-月-日24小時:分鍾:秒的格式YYYY-MM-DD HH24:MI:SS TO_DATE()還有很多種日期格式,可以參看Oracle DOC.
日期型欄位轉換成字元串函數TO_CHAR('2001-08-01','YYYY-MM-DD HH24:MI:SS')
日期欄位的數學運算公式有很大的不同。MySQL找到離當前時間7天用DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)Oracle找到離當前時間7天用 DATE_FIELD_NAME >SYSDATE - 7;
MySQL中插入當前時間的幾個函數是:NOW()函數以`'YYYY-MM-DD HH:MM:SS'返回當前的日期時間,可以直接存到DATETIME欄位中。CURDATE()以'YYYY-MM-DD'的格式返回今天的日期,可以直接存到DATE欄位中。CURTIME()以'HH:MM:SS'的格式返回當前的時間,可以直接存到TIME欄位中。例:insert into tablename (fieldname) values (now())
而Oracle中當前時間是sysdate
空字元的處理
MySQL的非空欄位也有空的內容,Oracle里定義了非空欄位就不容許有空的內容。按MySQL的NOT NULL來定義Oracle表結構,導數據的時候會產生錯誤。因此導數據時要對空字元進行判斷,如果為NULL或空字元,需要把它改成一個空格的字元串。
字元串的模糊比較
MySQL里用欄位名like%'字元串%',Oracle里也可以用欄位名like%'字元串%'但這種方法不能使用索引,速度不快,用字元串比較函數instr(欄位名,'字元串')>0會得到更精確的查找結果。
程序和函數里,操作資料庫的工作完成後請注意結果集和指針的釋放。
主鍵
MySQL一般使用自動增長類型,在創建表時只要指定表的主鍵為auto increment,插入記錄時,不需要再指定該記錄的主鍵值,MySQL將自動增長;Oracle沒有自動增長類型,主鍵一般使用的序列,插入記錄時將序列號的下一個值付給該欄位即可;只是ORM框架是只要是native主鍵生成策略即可。
Oracle實現了ANSIISQL中大部分功能,如,事務的隔離級別、傳播特性等而MySQL在這方面還是比較的弱
『玖』 在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 的別名
『拾』 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;
/