putenv("Oracle_SID=oracle8"); putenv("ORACLE_HOME=/oracle/prodUCt/release/8.1.5"); class db_sql { var $Debug = 0; var $sqoe = 1; // sqoe= show query on error var $Database = "dev";
var $User = "scott"; var $PassWord = "tiger"; var $Link_ID = 0; var $Record = array(); var $Row; var $numRow; var $Parse; var $Error = ""; function connect() { if ( 0 == $this->Link_ID ) { if($this->Debug) { printf(" Connecting to $this->Database... \n"); } $this->Link_ID=OCILogon("$this->User","$this->Password"); if (!$this->Link_ID) { $this->halt("Link-ID == false " . "($this->Link_ID), OCILogon failed"); } if($this->Debug) { printf(" OBTained the Link_ID: $this->Link_ID \n"); } } } function query($Query_String) { if($Query_String=="") { echo "执行语句不能为空!"; return false; } $this->connect(); $this->Parse=OCIParse($this->Link_ID,$Query_String); if(!$this->Parse) { $this->Error=OCIError($this->Parse); } else { OCIExecute($this->Parse); $this->Error=OCIError($this->Parse); } $this->Row=0; if($this->Debug) { printf("Debug: query = %s \n", $Query_String); } if ($this->Error["code"]!=1403 && $this->Error["code"]!=0 && $this->sqoe) echo " ".$this->Error["message"]." Query :\"$Query_String\""; $numRow=OCIRowCount($this->Parse); return $this->Parse; } function next_record() { if(0 == OCIFetchInto($this->Parse,$result,OCI_ASSOC+OCI_RETURN_NULLS)) { if ($this->Debug) { printf(" ID: %d,Rows: %d \n", $this->Link_ID,$this->num_rows()); } $this->Row +=1; $errno=OCIError($this->Parse); if(1403 == $errno) { # 1043 means no more records found $this->Error=""; $this->disconnect(); $stat=0; } else { $this->Error=OCIError($this->Parse); if($this->Debug) { printf(" Error: %s", $this->Error["message"]); } $stat=0; } } else { for($ix=1;$ix<=OCINumcols($this->Parse);$ix++) { $col=strtoupper(OCIColumnname($this->Parse,$ix)); $colreturn=strtolower($col); $this->Record[ "$colreturn" ] = $result["$col"]; if($this->Debug) echo"[$col]:".$result["$col"]." \n"; } $stat=1; } return $stat; } function record_exist() { if(0 == OCIFetchInto($this->Parse,$result)) { return 0; } else { return 1; } return $stat; } function seek($pos) { $this->Row=$pos; } 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) * ["meta"][field name] index of field named "field name" * The last one is used, if you have a field name, but no index. * 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; } if ($full) $res["meta"][$res[$i]["name"]] = $i; $i++; } if ($full) $res["num_fields"]=$i; # $this->disconnect(); return $res; } function affected_rows() { return OCIRowCount($this->Parse); } function num_rows() { $iii=0; while ($this->next_record()) { $iii++; } OCIExecute($this->Parse); return $iii
|