首頁  >  文章  >  後端開發  >  oracle資料庫函數庫_PHP教程

oracle資料庫函數庫_PHP教程

WBOY
WBOY原創
2016-07-21 16:02:05914瀏覽


class DB_Sql {
var $Debug = false;
var $Home = "/u01/app/oracle/product/8.0.4";
var $Remote = 1;
/* 此查詢將在第一次連接後直接發送
範例:
var $ConnectQuery="ALTER SESSION SET nls_date_language=german nls_date_format='DD.MM.RRRR'";
->設定此會話的日期格式,當您的ora-role
無法更改時,這很好*/
var $ConnectQuery='';
/* 由於Oracle 8.0.5、Apache 和PHP3.0.6出現奇怪的錯誤
你不需要設定ENV - 在我的系統上Apache
將變成殭屍,如果我不這樣做不要將其設定為FALSE!
相反,我在 apache 啟動之前設定了這些 ENV-vars。
如果不確定,請嘗試一下,是否有效。 */
var $OraPutEnv = true;

var $Database = "";
var $User = "";
var $Password = "";

var $Link_ID = 0;
var $Query_ID = 0;
var $Record = array();
var $Row;

var $Errno = 0;
var $ Error = "";
var $ora_no_next_fetch=false;


/* 從db_mysql 複製以確保完整性*/
/* public:標識常數。永遠不要改變這一點。 */
var $type = "oracle";
var $revision = "修訂版:1.3";
var $Halt_On_Error = "是"; ## "yes"(停止並顯示訊息)、 "no"(安靜忽略錯誤)、"report"(忽略錯誤,但發出警告)

/* public: 建構子*/
function DB_Sql ($query = "") {
$this->query($query);
}

/* public:一些瑣碎的報告*/
function link_id() {
return $this->Link_ID;
}

function query_id() {
return $this->Query_ID;
}

function connect() {
上面請參閱為什麼我們這樣做#
if ($this->OraPutEnv) {
PutEnv("ORACLE_SID=$this- >資料庫」);
PutEnv("ORACLE_HOME=$this->Home");
}
}
if ( 0 == $this->Link_ID ) {
if($this->Debug) {
printf("
Connect()到$this ->資料庫...
n ");
}
if($this->Remote) {
if($this->Debug) {
printf("
connect() $this->User/ * *****@$this->資料庫
n");
}  
$this->Link_ID=ora_plogon
("$this->使用者/$this->;密碼@$ this->資料庫","");
/****************(SSilk 評論)
這在我的系統上不起作用:
$this->Link_ID=ora_plogon
("$this->User@$this->Database.world","$this->Password")
***** ******* ***/
} else {
if($this->調試) {
printf("
connect() $this->用戶, $this-> ;密碼
n");
}  
$this->Link_ID=ora_plogon("$this->用戶","$this->密碼");
/* (SSilk 的評論:不知道這是如何運作的,但我保持不變! br>n");
}
if (!$this->Link_ID) {
$this->halt("connect() Link-ID == false " .
"($ this->Link_ID), ora_plogon 失敗");
} else {
//echo "commit on

";
ora_commiton ($this->Link_ID);
}
ora_commiton ($this->Link_ID);
}
if($this->Debug) {
printf("
connect() 取得Link_ID: $this->Link_IDn");
}
## 執行連線查詢
if ($this->ConnectQuery) {
$this->query($this->ConnectQuery);
}
}
}

## 為了增加每個系統/使用者的遊標數量,請編輯
## init.ora 檔案並增加max_open_cursors 參數。您的
## 預設值是每個使用者 100 個。
## 我們試圖以某種方式改變 query() 的行為,它嘗試
## 保護遊標,但另一方面要小心,你
## 不要使用舊的結果。
##  
## 您也可以廣泛使用->disconnect()!
## 未使用的 QueryID 有時會被回收。  

函數查詢($Query_String)  
{

/* 請勿輸入空白查詢。 */
if (empty($Query_String))
{
回傳0;
}

$this->connect();
$this->lastQuery= $Query_String;

if (!$this->Query_ID) {
$this->Query_ID= ora_open($this->Link_ID);
}
if($this-> Debug) {
printf("Debug: query = %s
n", $Query_String);
printf("
偵錯:Query_ID:%d
n",$this-> Query_ID);
}

if(!@ora_parse($this->Query_ID,$Query_String)) {
$this->Errno=ora_errorcode($this->Query_ID);
$this->Error= ora_error($this->Query_ID);
$this->halt("
ora_parse() 失敗:
$Query_String
將其貼到sqlplus!") ;
} elseif (!@ora_exec($this->Query_ID)) {
$this->Errno=ora_errorcode($this->Query_ID);
$this->Error=ora_error($this ->Query_ID);
$this->halt("
n$Query_Stringn
將其貼到sqlplus!");
}

$this->Row=0;

if(!$this->Query_ID) {
$this->halt("無效的SQL: ".$Query_String);
}

回傳$this->Query_ID;
}

function next_record() {
if (!$this->ora_no_next_fetch &&  
0 ==== Query_ID)) {
if ( $this->Debug) {
printf("
next_record(): ID: %d 行: %d
n",
$this-> Query_ID,$this-> ;第1 行);
// $this->Row 1 的更多資訊是$this->num_rows(),
// 但並非在所有情況下都有效(複雜的選擇)
// 它是這裡很慢
}
$this->Row =1;

$errno=ora_errorcode($this->Query_ID);
if(1403 == $errno) { # 1043 表示沒有找到更多記錄
$this->Errno=0;
$this->Error="";
$this->disconnect() ;
$stat=0;
} else {
$this->Error=ora_error($this->Query_ID);
$this->Errno=$errno;
if( $this->Debug) {
printf("
%d 錯誤:%s",
$this->Errno,
$this->Error );
}
$stat=0;
}
} else {
$this->ora_no_next_fetch=false;
for($ix=0;$ixQuery_ID);$ix ) {
$col=strtolower(ora_columnname($this->Query_ID,$ix));
$value=ora_getcolumn($this->Query_ID,$ix);
$this->Record[ "$col" ] = $value;
$this->記錄[ $ix ] = $value;
#DBG echo"[$col]: $value
n ";
}
$stat=1;
}

回傳$stat;
}

##eek() 只適用於$pos - 1和$pos
## 也許我做了一個自己的實現,但我的
## 意見是,這應該由PHP3 完成
functioneek($pos) {
if ($this- >Row - 1 == $pos) {
$this->ora_no_next_fetch=true;
} elseif ($this->Row == $pos ) {
## 不執行任何操作
} else {
$this->halt("無效的eek(): 位置不能由API 處理。
“。
“此版本中只允許查找最後一個元素
”。
“差異太大。 $pos 當前pos:$this- >行”);
}
if ($this->Debug) echo "
調試:seek = $pos
";
$this- >Row=$pos;
}

function lock($table, $mode = "write") {
if ($mode == "write") {
$result = ora_do($this->) ;Link_ID, "以行獨佔模式鎖定表$table");
} else {
$結果= 1;
}
回傳$結果;
}

函數解鎖() {
return ora_do($this->Link_ID, "commit");
}

// 重要提示:此函數不適用於 Oracle-Database-Links!
// 你可以自由地獲得更好的方法。 :)
函數元資料($table,$full=false) {
$count = 0;
$id = 0;
$res = array();

/*
* 由於與Table 的相容性問題,我們更改了metadata() 的行為
*;
* 取決於$full,元資料傳回以下值:
*
*
* - full 為false(預設):
* $result[]:
* [0]["table "] 表名稱
* [0]["name"] 欄位名稱
* [ 0]["type"] 欄位類型
* [0]["len"] 欄位長度
* [0]["flags"] 欄位標誌("NOT NULL", "INDEX")
* [0]["format"] 數字的精確度和小數位數(例如「10,2」)或空
* [0]["index"] 索引名稱(如果有)
* [0 ]["chars"] 字元數(如果有字元型別)
*
* - 完整為true
* $result[]:
* ["num_fields"] 元資料記錄數
* [0]["table"] 表名稱
* [0]["name"]欄位名稱
* [0]["type"] 欄位類型
* [0]["len "] 欄位長度
* [0]["flags"] 欄位標誌("NOT NULL", "INDEX")
* [0]["format"] 數字的精確度和小數位數(例如, "10,2")或空
* [0]["index"] 索引名稱(如果有)一)
* [0]["chars"] 字元數(如果有字元類型)
* [0]["php_type"] 對應的PHP 類型
* [0][" php_subtype"] PHP 類型的子類型
* ["meta"][field name] 名為“field name”的欄位的索引
* 如果您有名稱,但沒有索引號,則可以使用此方法-非常快
* 測試: if (isset($result['meta']['myfield'])) {} ...
*/

$this->connect() ;

## 這是一個RIGHT OUTER JOIN:「()」,如果您想查看
## 這個查詢結果是什麼,請嘗試以下操作:
## $table = new Table; $db = 新的my_DB_Sql; # 你必須建立
## # 你自己的類別
# # $table->show_results($db->query(see query vvvvvv))
##
$this-> ;query("SELECT T.table_name,T.column_name,T.data_type,".
"T.data_length,T.data_ precision,T.data_scale,T.nullable,".
"T.char_col_decl_length,I .index_name"。
" FROM ALL_TAB_COLUMNS T,ALL_IND_COLUMNS I"。
" WHERE T.column_name=I.column_name ( )"。
" AND T.table_name=I.table_name ( )"。
" AND T.table_name=UPPER('$table') ORDER BY T.column_id");

$i=0;
while ($this->next_record()) {
$res[$i]["table"] = $this->Record[table_name];
$res[$i]["name"] = strtolower($this->Record[column_name]);
$res[$i]["type"] = $this->Record[data_type];
$res[$i]["len"] = $this->Record[data_length];
if ($this->Record[index_name]) $res[$i]["flags"] = "INDEX ";
$res[$i]["flags"] .= ($this->Record [nullable] == 'N') ? '':'非空';
$res[$i]["format"]= (int)$this->Record[data_ precision].",".
(int)$this->Record[data_scale];
if ("0,0"==$res[$i]["format"]) $res[$i]["format"] ='';
$res[$i]["index"] = $this->Record[index_name];
$res[$i]["chars"] = $this->Record[char_col_decl_length ];
if ($full) {
$j=$res[$i]["name"];
$res["meta"][$j] = $i;
$res["meta"][strtoupper($j)] = $i;
switch ($res[$i]["type"]) {
case "VARCHAR2" :
case "VARCHAR " :
case "CHAR" :
$res["php_type "]="字串";
$res["php_subtype"]="";
休息;
案例「日期」:
$res["php_type"]="string";
$res["php_subtype"]="日期";
休息;
案例「BLOB」:
案例「CLOB」:
案例「BFILE」:
案例「RAW」:
案例「LONG」:
案例「LONG RAW」:
$res["php_type"]="string ";
$res["php_subtype"]="blob";
休息;
case "NUMBER" :
if ($res[$i]["format"]) {
$res["php_type"]="double";
$res["php_subtype"]="";
} else {
$res["php_type"]="int";
$res["php_subtype"]="";
}
休息;
預設值:
$this->halt("metadata(): 類型不是有效值:'$res[ $i][type]'");
休息;
}
}
if ($full) $res["meta"][$res[$i]["name"] ] = $i;
$i ;
}
if ($full) $res["num_fields"]=$i;
# $this->disconnect();
返回$res; }

## 此功能未經測試!
函數affected_rows() {
if ($this->Debug) echo "
調試:affected_rows=". ora_numrows($this->Query_ID)."
";
return ora_numrows ($this->Query_ID);
}

## 已知錯誤:它不適用於SELECT DISTINCT 和任何依賴結果行的
## 其他構造。
## 所以你*真的需要*檢查你所做的每個查詢,如果它
##可以用它!
##
## 此外,對於合格的替換,您需要解析
## 選擇,因為這將失敗:「SELECT id, from FROM ...」)。
## 「from」是-據我所知Oracle中的一個關鍵字,所以它
##只能這樣使用。但你已經被警告過。
function num_rows() {
$curs=ora_open($this->Link_ID);

##這是重要的部分,也是HACK!
if (eregi("^[[:space:]]*SELECT[[:space:]]",$this->lastQuery) )  
{

# 這適用於所有人??情況,包括SELECT DISTINCT 情況。
# 我們只需從原始sql 表達式中選擇count(*)
# 並刪除ORDER BY(如果有)以提高速度
# 我也喜歡正則表達式;-)))  
$q = sprintf("從(%s) 選擇COUNT(*) 個",
@eregi_Replace("ORDER[[:space:]] BY[^)]*()*)", "1 ",  
$ this->lastQuery)  
);

# 也適用於子選擇:
# if (eregi("[[:space:]] space:]] .*[[:space:]] FROM)", $this->lastQuery,$r))
# $areplace=$r[1];
# $q=eregi_Replace(" ^[[:space:]]*SELECT[[:space:]] ".
# ".*[[:space:]] FROM",
# "SELECT COUNT(*) FROM$areplace" ,
# $this->lastQuery);

if ($this->Debug) echo "
調試:num_rows: $q
";

ORA_parse( $curs,$q);
ORA_exec($curs);
ORA_fetch($curs);
$結果= ORA_getcolumn($curs,0);
ORA_close($curs);
if ($this->Debug)
{  
echo "
偵錯:ID ".$this->QueryID。
“num_rows =”。 $結果."
";
}
回傳$結果;
}  
else  
{
$this->halt("最後一個查詢不是SELECT:$this ->lastQuery");
}
}

function num_fields() {
if ($this->Debug) echo "
調試:num_fields=". ora_numcols($ this->Query_ID) 。 「
」;
return ora_numcols($this->Query_ID);
}

function nf() {
return $this->num_rows();
}

function np() {
print $this->num_rows();
}

function f($Name) {
return $this->Record[ $Name];
}

function p($Name) {
print $this->Record[$Name];
}

/* public:序列編號*/
function nextid($seq_name)
{
$this->connect();

/* 獨立Query_ID */
$Query_ID = ora_open($this- >Link_ID);

if(!@ora_parse($Query_ID,"SELECT $seq_name.NEXTVAL FROM DUAL"))  
{
// 還沒有這樣的序列,那就創建它
if( !@ora_parse($Query_ID,"建立序列$seq_name")  

!@ora_exec($Query_ID)
)
{
$Query_ID)
)
{
$this-halt(" nextid() 函數- 無法建立序列」);
回傳0;
}
@ora_parse($Query_ID,"SELECT $seq_name.NEXTVAL FROM DUAL");
}  
if (!@ora_exec($Query_ID)) {
$this->halt("
ora_exec() 失敗:
nextID 函數");
}
if (@ora_fetch($ Query_ID) ) {
$next_id = ora_getcolumn($Query_ID, 0);
}
else {
$next_id = 0;
}
if ( $Query_ID >if (
ora_close($Query_ID);
}

回傳$next_id;
}

function disconnect() {
if($this-this>Debug) {
echo "調試:斷開$this->Query_ID...
n ”;
}
if ( $this->Query_ID echo "警告:斷開連接():無法釋放ID $this->Query_IDn";
# return();
}
ora_close($this->Query_ID);
$this ->Query_ID=0;
}

/* 私有:錯誤處理*/
functionhalt($msg) {
if ($this->Halt_On_Error == "no")
return;

$this->haltmsg($msg);
if ($this->Halt_On_Error != "report") die("會話已停止。 "); }

functionhaltmsg($msg) {
printf("
資料庫錯誤: %s
n" , $msg);
printf("Oracle 錯誤: %s (%s)
n",
$this->Errno,
$this->Error ) ;
}

function table_names() {
$this->connect();
$this->query("
SELECT table_name,tablespace_name FROM table> ");
$i=0;
while ($this->next_record())
{
$info[$i]["table_name"] =$this->Record[" table_name"];
$info[$i]["tablespace_name"]=$this->Record["tablespace_name"];
$i ;
}  
回傳$資訊;
}


// 一些事務支援
// ct_oracle.inc 中使用的方法
function begin_transaction()  
{
$this->connect ()
// 現在,禁用自動提交
Ora_CommitOff($this->Link_ID);
if ($this->Debug)
{
print "BEGIN TRANSACTION
";
}
}  
function end_transaction()  
{
if ($this->Debug)
{
print "BEGIN TRANSACTION
";
{
print "BEGIN TRANSACTION
";
}
print "BEGIN TRANSACTION
";
> >
$res = 1;
if(!@Ora_Commit($this->Link_ID))
{
Ora_CommitOn($this->Link_ID);
$this->halt( "無法完成交易");
$res = 0;
}
// 再次啟用自動提交
Ora_CommitOn($this->Link_ID);

if ($this ->Debug)
{
print "END TRANSACTION : $res
";
}
返回$res;
}

}

? > 

http://www.bkjia.com/PHPjc/316678.htmlwww.bkjia.comtruehttp: //www.bkjia.com/PHPjc/316678.htmlTechArticle
?類別DB_Sql { var $Debug = false; var $Home = /u01/app/oracle/product/8.0.4; var $Remote = 1; /* 此查詢將在第一次連接後直接發送範例: var $Connect ...
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn