php oracle 库,php的oracle资料库函式库

class DB_Sql {

var $Debug = false;

var $Home = "/u01/app/Oracle/PRoduct/8.0.4";

var $Remote = 1;

/* This Query will be sent directly after the first connection

Example:

var $ConnectQuery="ALTER session SET nls_date_language=german nls_date_format='DD.MM.RRRR'";

-> Set the date format for this session, this is fine when your ora-role

cannot be altered */

var $ConnectQuery='';

/* Due to a strange error with Oracle 8.0.5, Apache and php3.0.6

you don't need to set the ENV - on my system Apache

will change to a zombie, if I don't set this to FALSE!

Instead I set these ENV-vars before the startup of apache.

If unsure try it out, if it works. */

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;

/* copied from db_MySQL for completeness */

/* public: identification constant. never change this. */

var $type = "oracle";

var $revision = "Revision: 1.3";

var $Halt_On_Error = "yes"; ## "yes" (halt with message), "no" (ignore errors quietly), "report" (ignore errror, but spit a warning)

/* public: constructor */

function DB_Sql($query = "") {

$this->query($query);

}

/* public: some trivial reporting */

function link_id() {

return $this->Link_ID;

}

function query_id() {

return $this->Query_ID;

}

function connect() {

## see above why we do this

if ($this->OraPutEnv) {

PutEnv("ORACLE_SID=$this->Database");

PutEnv("ORACLE_HOME=$this->Home");

}

if ( 0 == $this->Link_ID ) {

if($this->Debug) {

printf("

Connect()ing to $this->Database...

n");

}

if($this->Remote) {

if($this->Debug) {

printf("

connect() $this->User/******@$this->Database

n");

}

$this->Link_ID=ora_plogon

("$this->User/$this->Password@$this->Database","");

/************** (comment by SSilk)

this dosn't work on my system:

$this->Link_ID=ora_plogon

("$this->User@$this->Database.world","$this->Password");

***************/

} else {

if($this->Debug) {

printf("

connect() $this->User, $this->Password

n");

}

$this->Link_ID=ora_plogon("$this->User","$this->Password");

/* (comment by SSilk: don't know how this could work, but I leave this untouched!) */

}

if($this->Debug) {

printf("

connect() Link_ID: $this->Link_ID

n");

}

if (!$this->Link_ID) {

$this->halt("connect() Link-ID == false " .

"($this->Link_ID), ora_plogon failed");

} else {

//echo "commit on

";

ora_commiton($this->Link_ID);

}

if($this->Debug) {

printf("

connect() Obtained the Link_ID: $this->Link_ID

n");

}

## Execute Connect Query

if ($this->ConnectQuery) {

$this->query($this->ConnectQuery);

}

}

}

## In order to increase the # of cursors per system/user go edit the

## init.ora file and increase the max_open_cursors parameter. Yours is on

## the default value, 100 per user.

## We tried to change the behaviour of query() in a way, that it tries

## to safe cursors, but on the other side be carefull with this, that you

## don't use an old result.

##

## You can also make extensive use of ->disconnect()!

## The unused QueryIDs will be recycled sometimes.

function query($Query_String)

{

/* No empty query please. */

if (empty($Query_String))

{

return 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("

Debug: 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() failed:

$Query_String

Snap & paste this to 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

Snap & paste this to sqlplus!");

}

$this->Row=0;

if(!$this->Query_ID) {

$this->halt("Invalid SQL: ".$Query_String);

}

return $this->Query_ID;

}

function next_record() {

if (!$this->ora_no_next_fetch &&

0 == ora_fetch($this->Query_ID)) {

if ($this->Debug) {

printf("

next_record(): ID: %d Row: %d

n",

$this->Query_ID,$this->Row+1);

// more info for $this->Row+1 is $this->num_rows(),

// but dosn't work in all cases (complicated selects)

// and it is very slow here

}

$this->Row +=1;

$errno=ora_errorcode($this->Query_ID);

if(1403 == $errno) { # 1043 means no more records found

$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 Error: %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->Record[ $ix ] = $value;

#DBG echo"[$col]: $value

n";

}

$stat=1;

}

return $stat;

}

## seek() works only for $pos - 1 and $pos

## Perhaps I make a own implementation, but my

## opinion is, that this should be done by PHP3

function seek($pos) {

if ($this->Row - 1 == $pos) {

$this->ora_no_next_fetch=true;

} elseif ($this->Row == $pos ) {

## do nothing

} else {

$this->halt("Invalid seek(): Position is cannot be handled by API.

".

"Only a seek to the last element is allowed in this version

".

"Difference too big. Wanted: $pos Current pos: $this->Row");

}

if ($this->Debug) echo "

Debug: seek = $pos

";

$this->Row=$pos;

}

function lock($table, $mode = "write") {

if ($mode == "write") {

$result = ora_do($this->Link_ID, "lock table $table in row exclusive mode");

} else {

$result = 1;

}

return $result;

}

function unlock() {

return ora_do($this->Link_ID, "commit");

}

// Important note: This function dosn't work with Oracle-Database-Links!

// You are free to get a better method. :)

function metadata($table,$full=false) {

$count = 0;

$id = 0;

$res = array();

/*

* Due to compatibility problems with Table we changed the behavior

* of metadata();

* depending on $full, metadata returns the following values:

*

* - full is false (default):

* $result[]:

* [0]["table"] table name

* [0]["name"] field name

* [0]["type"] field type

* [0]["len"] field length

* [0]["flags"] field flags ("NOT NULL", "INDEX")

* [0]["format"] precision and scale of number (eg. "10,2") or empty

* [0]["index"] name of index (if has one)

* [0]["chars"] number of chars (if any char-type)

*

* - full is true

* $result[]:

* ["num_fields"] number of metadata records

* [0]["table"] table name

* [0]["name"] field name

* [0]["type"] field type

* [0]["len"] field length

* [0]["flags"] field flags ("NOT NULL", "INDEX")

* [0]["format"] precision and scale of number (eg. "10,2") or empty

* [0]["index"] name of index (if has one)

* [0]["chars"] number of chars (if any char-type)

* [0]["php_type"] the correspondig PHP-type

* [0]["php_subtype"] the subtype of PHP-type

* ["meta"][field name] index of field named "field name"

* This could used, if you have the name, but no index-num - very fast

* Test: if (isset($result['meta']['myfield'])) {} ...

*/

$this->connect();

## This is a RIGHT OUTER JOIN: "(+)", if you want to see, what

## this query results try the following:

## $table = new Table; $db = new my_DB_Sql; # you have to make

## # your own class

## $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') ? '' : 'NOT NULL';

$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"]="string";

$res["php_subtype"]="";

break;

case "DATE" :

$res["php_type"]="string";

$res["php_subtype"]="date";

break;

case "BLOB" :

case "CLOB" :

case "BFILE" :

case "RAW" :

case "LONG" :

case "LONG RAW" :

$res["php_type"]="string";

$res["php_subtype"]="blob";

break;

case "NUMBER" :

if ($res[$i]["format"]) {

$res["php_type"]="double";

$res["php_subtype"]="";

} else {

$res["php_type"]="int";

$res["php_subtype"]="";

}

break;

default :

$this->halt("metadata(): Type is not a valid value: '$res[$i][type]'");

break;

}

}

if ($full) $res["meta"][$res[$i]["name"]] = $i;

$i++;

}

if ($full) $res["num_fields"]=$i;

# $this->disconnect();

return $res;

}

## THIS FUNCTION IS UNSTESTED!

function affected_rows() {

if ($this->Debug) echo "

Debug: affected_rows=". ora_numrows($this->Query_ID)."

";

return ora_numrows($this->Query_ID);

}

## Known bugs: It will not work for SELECT DISTINCT and any

## other constructs which are depending on the resulting rows.

## So you *really need* to check every query you make, if it

## will work with it!

##

## Also, for a qualified replacement you need to parse the

## selection, cause this will fail: "SELECT id, from FROM ...").

## "from" is - as far as I know a keyword in Oracle, so it can

## only be used in this way. But you have been warned.

function num_rows() {

$curs=ora_open($this->Link_ID);

## this is the important part and it is also the HACK!

if (eregi("^[[:space:]]*SELECT[[:space:]]",$this->lastQuery) )

{

# This works for all?? cases, including SELECT DISTINCT case.

# We just make select count(*) from original sql expression

# and remove ORDER BY (if any) for speed

# I like regular expressions too ;-)))

$q = sprintf("SELECT COUNT(*) FROM (%s)",

@eregi_Replace("ORDER[[:space:]]+BY[^)]*()*)", "\1",

$this->lastQuery)

);

# works also for subselects:

# if (eregi("[[:space:]]+FROM([[: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 "

Debug: num_rows: $q

";

ORA_parse($curs,$q);

ORA_exec($curs);

ORA_fetch($curs);

$result = ORA_getcolumn($curs,0);

ORA_close($curs);

if ($this->Debug)

{

echo "

Debug: ID ".$this->QueryID.

" num_rows=". $result ."

";

}

return $result;

}

else

{

$this->halt("Last Query was not a SELECT: $this->lastQuery");

}

}

function num_fields() {

if ($this->Debug) echo "

Debug: 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: sequence number */

function nextid($seq_name)

{

$this->connect();

/* Independent Query_ID */

$Query_ID = ora_open($this->Link_ID);

if(!@ora_parse($Query_ID,"SELECT $seq_name.NEXTVAL FROM DUAL"))

{

// There is no such sequence yet, then create it

if(!@ora_parse($Query_ID,"CREATE SEQUENCE $seq_name")

||

!@ora_exec($Query_ID)

)

{

$this->halt("

nextid() function - unable to create sequence");

return 0;

}

@ora_parse($Query_ID,"SELECT $seq_name.NEXTVAL FROM DUAL");

}

if (!@ora_exec($Query_ID)) {

$this->halt("

ora_exec() failed:

nextID function");

}

if (@ora_fetch($Query_ID) ) {

$next_id = ora_getcolumn($Query_ID, 0);

}

else {

$next_id = 0;

}

if ( $Query_ID > 0 ) {

ora_close($Query_ID);

}

return $next_id;

}

function disconnect() {

if($this->Debug) {

echo "Debug: Disconnecting $this->Query_ID...

n";

}

if ( $this->Query_ID < 1 ) {

echo "Warning: disconnect(): Cannot free ID $this->Query_IDn";

# return();

}

ora_close($this->Query_ID);

$this->Query_ID=0;

}

/* private: error handling */

function halt($msg) {

if ($this->Halt_On_Error == "no")

return;

$this->haltmsg($msg);

if ($this->Halt_On_Error != "report")

die("Session halted.");

}

function haltmsg($msg) {

printf("

Database error: %s

n", $msg);

printf("Oracle Error: %s (%s)

n",

$this->Errno,

$this->Error);

}

function table_names() {

$this->connect();

$this->query("

SELECT table_name,tablespace_name

FROM user_tables");

$i=0;

while ($this->next_record())

{

$info[$i]["table_name"] =$this->Record["table_name"];

$info[$i]["tablespace_name"]=$this->Record["tablespace_name"];

$i++;

}

return $info;

}

// Some transaction support

// Methods are used in ct_oracle.inc

function begin_transaction()

{

$this->connect();

// Now, disable autocommit

Ora_CommitOff($this->Link_ID);

if ($this->Debug)

{

print "BEGIN TRANSACTION

";

}

}

function end_transaction()

{

if ($this->Debug)

{

print "BEGIN TRANSACTION

";

}

$res = 1;

if(!@Ora_Commit($this->Link_ID))

{

Ora_CommitOn($this->Link_ID);

$this->halt("Unable to finish transaction");

$res = 0;

}

// Enable autocommit again

Ora_CommitOn($this->Link_ID);

if ($this->Debug)

{

print "END TRANSACTION : $res

";

}

return $res;

}

}

?>

以上就介绍了php的oracle资料库函式库,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

相关文章

相关视频

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
应用背景为变电站电力巡检,基于YOLO v4算法模型对常见电力巡检目标进行检测,并充分利用Ascend310提供的DVPP等硬件支持能力来完成流媒体的传输、处理等任务,并对系统性能做出一定的优化。.zip深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值