MySQL 數據類型細分下來,大概有以下幾類:
數值,典型代表為 tinyint,int,bigint
浮點/定點,典型代表為 float,double,decimal 以及相關的同義詞
字元串,典型代表為 char,varchar
時間日期,典型代表為 date,datetime,time,timestamp
二進制,典型代表為 binary,varbinary
位類型
枚舉類型
集合類型
大對象,比如 text,blob
json 文檔類型
一、數值類型(不是數據類型,別看錯了)如果用來存放整數,根據范圍的不同,選擇不同的類型。
注意:timestamp 代表的時間戳是一個 int32 存儲的整數,取值范圍為 '1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999';datetime 取值范圍為 '1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。
1. 如果時間有可能超過時間戳范圍,優先選擇 datetime。2. 如果需要單獨獲取年份值,比如按照年來分區,按照年來檢索等,最好在表中添加一個 year 類型來參與。3. 如果需要單獨獲取日期或者時間,最好是單獨存放,而不是簡單的用 datetime 或者 timestamp。後面檢索時,再加函數過濾,以免後期增加 SQL 編寫帶來額外消耗。
建立表 t5,對這些可能需要的欄位全部分離開,這樣以後寫 SQL 語句的時候就很容易了。
當然了,這種情形佔用額外的磁碟空間。如果想在易用性與空間佔用量大這兩點來折中,可以用 MySQL 的虛擬列來實時計算。比如假設 c5 欄位不存在,想要得到 c5 的結果。mysql-(ytt/3305)->alter table t5 drop c5, add c5 year generated always as (year(c1)) virtual;Query OK, 1 row affected (2.46 sec)Records: 1 Duplicates: 0 Warnings: 0
五、二進制類型
binary(10)/varbinary(10) 代表的不是字元個數,而是位元組數。
行結束符不一樣。char 的行結束符是 ,binary 的行結束符是 0x00。
由於是二進制存儲,所以字元編碼以及排序規則這類就直接無效了。
六、位類型
1. 對於 bit(8) 如果單純存放 1 位,左邊以 0 填充 00000001。2. 查詢時可以直接十進制來過濾數據。3. 如果此欄位加上索引,MySQL 不會自己做類型轉換,只能用二進制來過濾。
創建表 c1, 欄位性別定義一個比特位。mysql-(ytt/3305)->create table c1(gender bit(1));Query OK, 0 rows affected (0.02 sec)
mysql-(ytt/3305)->select cast(gender as unsigned) 'f1' from c1;+------+| f1 |+------+| 0 || 1 |+------+2 rows in set (0.00 sec)
過濾數據也一樣,二進制或者直接十進制都行。mysql-(ytt/3305)->select conv(gender,16,10) as gender -> from c1 where gender = b'1';+--------+| gender |+--------+| 1|+--------+1 row in set (0.00 sec)mysql-(ytt/3305)->select conv(gender,16,10) as gender -> from c1 where gender = '1';+--------+| gender |+--------+| 1|+--------+1 row in set (0.00 sec)
mysql-(ytt/3305)->create table c2(gender char(0));Query OK, 0 rows affected (0.03 sec)
mysql-(ytt/3305)->select count(*) from c1;+----------+| count(*) |+----------+| 33554432 |+----------+1 row in set (1.37 sec)
mysql-(ytt/3305)->insert into c2 select if(gender = 0,'',null) from c1;Query OK, 33554432 rows affected (2 min 18.80 sec)Records: 33554432 Duplicates: 0 Warnings: 0
兩張表的磁碟佔用差不多。root@ytt-pc:/var/lib/mysql/3305/ytt# ls -sihl總用量 1.9G4085684 933M -rw-r----- 1 mysql mysql 932M 12月 11 10:16 c1.ibd4082686 917M -rw-r----- 1 mysql mysql 916M 12月 11 10:22 c2.ibd
檢索方式稍微有些不同,不過效率也差不多。所以說,字元類型不愧為萬能類型。
七、枚舉類型
1. 最大佔用 2 Byte。2. 最大支持 65535 個不同元素。3. MySQL 後台存儲以下標的方式,也就是 tinyint 或者 smallint 的方式,下標從 1 開始。4. 排序時按照下標排序,而不是按照裡面元素的數據類型。所以這點要格外注意。
創建表 t7。mysql-(ytt/3305)->create table t7(c1 enum('mysql','oracle','dble','postgresql','mongodb','redis','db2','sql server'));Query OK, 0 rows affected (0.03 sec)
1. 最大佔用 8 Byte,int64。2. 內部以二進制位的方式存儲,對應的下標如果以十進制來看,就分別為 1,2,4,8,...,pow(2,63)。3. 最大支持 64 個不同的元素,重復元素的插入,取出來直接去重。4. 元素之間可以組合插入,比如下標為 1 和 2 的可以一起插入,直接插入 3 即可。
mysql-(ytt/3305)->create table c7(c1 set('mysql','oracle','dble','postgresql','mongodb','redis','db2','sql server'));Query OK, 0 rows affected (0.02 sec)
mysql-(ytt/3305)->INSERT INTO c7WITH RECURSIVE ytt_number (cnt) AS ( SELECT 1 AS cnt UNION ALL SELECT cnt + 1 FROM ytt_number WHERE cnt < pow(2, 7) )SELECT *FROM ytt_number;Query OK, 128 rows affected (0.01 sec)Records: 128 Duplicates: 0 Warnings: 0
示例 10
mysql-(ytt/3305)->select ytt_sample_data_type(1111,222) 'result';+--------------------------+| result |+--------------------------+| The result is: '246642'. |+--------------------------+1 row in set (0.00 sec)

綜上所述,日期這塊類型的選擇遵循以下原則:
4. 如果有保存毫秒類似的需求,最好是用時間類型自己的特性,不要直接用字元類型來代替。MySQL 內部的類型轉換對資源額外的消耗也是需要考慮的。
示例 5
binary 和 varbinary 對應了 char 和 varchar 的二進制存儲,相關的特性都一樣。不同的有以下幾點:
示例 6
來看這個 binary 存取的簡單示例,還是之前的變數 @a。
切記!這里要提前計算好 @a 佔用的位元組數,以防存儲溢出。
bit 為 MySQL 里存儲比特位的類型,最大支持 64 比特位, 直接以二進制方式存儲,一般用來存儲狀態類的信息。比如,性別,真假等。具有以下特性:
示例 7
其實這樣的場景,也可以定義為 char(0),這也是類似於 bit 非常優化的一種用法。
那現在我給表 c1 簡單的造點測試數據。
把 c1 的數據全部插入 c2。
枚舉類型,也即 enum。適合提前規劃好了所有已經知道的值,且未來最好不要加新值的情形。枚舉類型有以下特性:
示例 8
八、集合類型
集合類型 SET 和枚舉類似,也是得提前知道有多少個元素。SET 有以下特點:
示例 9
定義表 c7 欄位 c1 為 set 類型,包含了 8 個值,也就是下表最大為 pow(2,7)。
插入 1 到 128 的所有組合。
九、數據類型在存儲函數中的用法
函數里除了顯式聲明的變數外,默認 session 變數的數據類型很弱,隨著給定值的不同隨意轉換。
定義一個函數,返回兩個給定參數的乘積。定義里有兩個變數,一個是 v_tmp 顯式定義為 int64,另外一個 @vresult 隨著給定值的類型隨意變換類型。
簡單調用下。
總結
本篇把 MySQL 基本的數據類型做了簡單的介紹,並且用了一些容易理解的示例來梳理這些類型。我們在實際場景中,建議選擇適合最合適的類型,不建議所有數據類型簡單的最大化原則。比如能用 varchar(100),不用 varchar(1000)。
Ⅱ R軟體中的數據num和int什麼意思怎樣把int轉為num
是int r=static_cast<int>(sqrt(num))吧
將sqrt(num)的值強制類型轉換為int型
Ⅲ 怎麼把資料庫中某個欄位的值賦值給一個變數
rnum="select rnum from dbo.room where roomname=roomname1"
這一句只是一個查詢語句,下面還得有類似:
rs.open rnum,conn,1,1
的數據,然後再改為上:
If num>rs.recordcount Then
Ⅳ 關於ASP的ACCESS資料庫查詢的問題
使用movenext
比如你定義了一頁顯示20條
<%
page=request("page")
sql=你的sql語句
set rs = Server.CreateObject("Adodb.Recordset")
rs.open sql,conn,1,1
Rnum=rs.recordcount
maxsize=20
if Rnum/maxsize=int(Rnum/maxsize) then
totalpage=int(Rnum/maxsize)
else
totalpage=int(Rnum/maxsize)+1
end if
if page>1 then
targetCursor=maxsize*(page-1)
rs.move targetCursor
else
rs.movefirst
end iF
i=0
do while Not rs.eof and i<maxsize
%>
=========循環顯示內容=========
<%
rs.movenext
i=i+1
loop
%>
<a href="#" onclick="gotopage(1)">首頁</a>
<a href="#" onclick="gotopage(<%=page-1%>)">上一頁</a>
<a href="#" onclick="gotopage(<%=page+1%>)">下一頁</a>
<a href="#" onclick="gotopage(<%=totalpage%>)">尾頁</a>
<script>
function gotopage(thispage){
window.location.href="?page="+thispage;
}
</script>
===================
很久不用asp,不知道寫得對不對,盡供參考
Ⅳ Oracle資料庫rownum和row_number的不同點
明確對於rownum
來說它是oracle系統順序分配為從查詢返回的行的編號,返回的第一行分配的是1,第二行是二,以此類推,這個為欄位可以用於限制查詢的返回的總行數,因為rownum總是從1開始,但是1以上的自然數在rownum
做等於判斷時都認為是false
條件,所以無法查到
rownum=n
(n》1的自然數),所以查找第二行以後的記錄可以用子查詢方法來解決,給子查詢中的rownum取別名;對於小於某個值的情況兩種方法都差不多,但是對於某個不等於一的值或者求某個值到某個值之間的情況,用row_number()
別名獲得排名
,比用rownum偽列要簡單方便的多;因為偽列總是從一開始查找;
具體用法和區別參見以下代碼;
--取出工資最高的前5位
select
empno,ename,sal,rownum
from
emp;
select
*
from
(select
*
from
emp
order
by
sal
desc)
where
rownum<=5;
select
*
from
(select
ename,sal,row_number()
over(order
by
sal
desc)
as
num
from
emp)
where
num<=5;
select
*
from
(select
ename,sal,row_number()
over(order
by
sal
desc)
from
emp)
where
rownum<=5
--工資的前3名
select
*
from
emp
where
sal
>=any(select
*
from
(select
sal
from
emp
order
by
sal
desc)
where
rownum<=3);
select
*
from(select
*
from
emp
order
by
sal
desc)
where
rownum
<4;
select
*
from
(select
ename,sal,empno,deptno
,row_number()
over
(order
by
sal
desc)
from
emp)
where
rownum<4;
select
*
from
(select
ename,sal,empno,deptno
,row_number()
over
(order
by
sal
desc)
as
num
from
emp)
where
num<4
--按照工資排序,取出第6名到第10名
--使用偽列獲得
select
*
from
(select
ename,sal,rownum
r
from
(select
*
from
emp
order
by
sal
desc)
where
rownum<=10)
where
r>5;
--使用排名函數獲得
select
*
from
(select
ename,sal,row_number()
over(order
by
sal
desc)
as
num
from
emp)
where
num>5
and
num<=10;
-------
按工資從高到低獲得工資排名第四的員工
select
*
from
(select
ename,sal,row_number()
over(order
by
sal
desc)
as
num
from
emp)
where
num=4;
select
*
from
(select
ename,sal,rownum
r
from
(select
*
from
emp
order
by
sal
desc)
where
rownum<=4)
where
r=4;
總結oracle中rownum和row_number()的區別
row_number()是分析函數,基本語法為row_number()
over(partition
by
欄位
order
by
欄位)
rownum是一個偽列
select
*
from
dept
where
rownum<=3;
select
*
from
dept
where
rownum
between
2
and
3;這兒會出錯,因為rownum的特性(沒有1就不會有2,沒有3)決定的
SELECT
*
FROM
(SELECT
A.*,ROWNUN
FROM
DEPT
A)T1
WHERE
T1.ROWNUM
BETWEEN
2
AND
3;這么寫不對,要這樣寫
SELECT
*
FROM
(SELECT
A.*,ROWNUM
RN
FROM
DEPT
A)T1
WHERE
T1.RN
BETWEEN
2
AND
3;
他們的主要區別是:使用rownum進行排序的時候是先對結果集加入偽列rownum然後再進行排序,而函數row_number()在包含排序從句後是先排序再計算行號碼。
Ⅵ sql 分頁
SELECTTOP10*
FROM(SELECT*
FROM(selects.PositionNameassName,
h.MonValueasmonValue,
ROW_NUMBER()OVER(ORDERBYs.PositionNameASC)ASRNUM
fromHourSourceh
LEFTJOINPollutantponp.PollutantCode=h.PollutantCode
LEFTJOINStationsons.StationCode=h.StationCode
whereh.TimePointBETWEEN'2015-01-0111:00'and
'2015-01-0112:00'
ands.stationIdin(1,2))bbPIVOT(MAX(monvalue)FORpNamein(O3,CO,PM10))ASpvt)A
WHEREA.RNUM>0andA.rnum<10
sqlserver 資料庫?
Ⅶ 資料庫原理中num是什麼意思
一般代表number(數字)的簡寫,如studentNum(學生人數),有的資料庫中用這個代表數值型數據類型。
Ⅷ this.rnum = Math.random()*100+10;這句什麼意思啊,在代碼中起什麼作用
這是個賦值語句,this 只某個類 rnum 是這個類的屬性 math.random()*100+10 是得到一個隨機數然後*100+10 把這個結果賦值給屬性RNUM
採納哦
Ⅸ 關於PHP資料庫
PHP調用三種資料庫的方法
本文比較詳細的介紹PHP調用MySQL、ODBC以及ORACLE資料庫。
MySQL是一個小巧靈瓏的資料庫伺服器軟體,對於中、小型應用系統是非常理想的。除了支持標準的ANSI SQL語句外,最重要的是,它還支持多種平台,而在Unix/Linux系統上,MySQL支持多線程運行方式,從而能獲得相當好的性能。它和PHP、 Apache一樣,是屬於開放源代碼軟體。其官方網站是:http://www.mysql.com,上面提供Windows,Linux,Unix版本的源代碼的下載。
注意,MySQL訪問函數都需要有相應的許可權才能運行。常用的相關函數介紹如下:
(1)integer mysql_connect(主機,用戶名,口令);
此函數開始一個對指定主機上的MySQL資料庫的連接。若該資料庫位於一個不同地埠,則在主機名後加上冒號和埠號。所有參數均為可選的,預設情況下分別對應為本地主機、用戶正在執行的腳本名和空。主機可以是IP地址或域名。
在腳本執行結束時,連接被自動關閉,也可以用mysql_close提前關閉。
(2)boolean mysql_create_db(資料庫名);
創建一個資料庫。注意必須用一個帶有創建資料庫許可權的帳號打開連接。
(3)boolean mysql_select_db(資料庫名,連接號);
選擇預設資料庫。
(4)integer mysql_query(SQL語句,連接號);
對指定資料庫進行查詢。如果SQL語句是select,則返回一個結果號,否則返回的值可以不理會。如果失敗,返回false.。
(5)array mysql_fetch_array(結果號);
取出下一行,返回一個數組.可以用數字下標訪問(第一個欄位是下標 0),也可以用字元串下標訪問(即使用各欄位名)。如已取了最後一行,返回 false.。
(6)mysql_fetch_row(結果號);
返回一個矩陣代表結果集中一行的所有域。每次調用都會產生下一行,直到沒有行剩下時返回false。每個域值都由一個從零開始的偏移量索引。這是從查詢中獲取結果的最快方法。
(7)integer mysql_num_rows(結果號);
返回結果集中行的數目
(8)integer mysql_num_fields(結果號);
返回結果集中域的數目。
(9)integer mysql_list_dbs();
向伺服器查詢資料庫列表。它返回一個結果指針,該指針可用於mysql_fetch_row函數及類似函數。
(10)mysql_list_tables(資料庫名);
獲取一個指向指定資料庫的表單列表的結果指針。該結果指針可用於任何從結果集中獲取行的函數。
(11)mysql_close(連接號);
關閉對資料庫的連接。連接必須是由mysql_connect打開的。該函數的使用不是嚴格必需的,因為在腳本結束時,所有非永久鏈路都會被自動關閉。
(12)mysql_pconnect(主機,用戶名,口令);
與mysql_connect完全相似,但建立一個"永久連接",該連接一經建立永不關閉,即使使用mysql_close函數或程序執行完畢也不關閉.下一次試圖建立永久連接時,系統如發現已存在一個永久連接,則直接返回該連接號而不重新創建。
下面是一個調用MYSQL資料庫並分頁顯示的例子。
<?
$pagesize = 5; //每頁顯示5條記錄
$host="localhost";
$user="user";
$password="psw";
$dbname="book"; //所查詢的庫表名;
//連接MySQL資料庫
mysql_connect("$host","$user","$password") or die("無法連接MySQL資料庫伺服器!");
$db = mysql_select_db("$dbname") or die("無法連接資料庫!");
$sql = "select count(*) as total from pagetest";//生成查詢記錄數的SQL語句
$rst = mysql_query($sql) or die("無法執行SQL語句:$sql !"); //查詢記錄數
$row = mysql_fetch_array($rst) or die("沒有更多的記錄!"); /取出一條記錄
$rowcount = $row["total"];//取出記錄數
mysql_free_result($rst) or die("無法釋放result資源!"); //釋放result資源
$pagecount = bcdiv($rowcount+$pagesize-1,$pagesize,0);//算出總共有幾頁
if(!isset($pageno)) {
$pageno = 1; //在沒有設置pageno時,預設為顯示第1頁
}
if($pageno<1) {
$pageno = 1; //若pageno比1小,則把它設置為1
}
if($pageno>$pagecount) {
$pageno = $pagecount; //若pageno比總共的頁數大,則把它設置為最後一頁
}
if($pageno>0) {
$href = eregi_replace("%2f","/",urlencode($PHP_SELF));//把$PHP_SELF轉換為可以在URL上使用的字元串,這樣的話就可以處理中文目錄或中文文件名
if($pageno>1){//顯示上一頁的褳接
echo "<a href="" . $href . "?pageno=" . ($pageno-1) . "">上一頁</a> ";
}
else{
echo "上一頁";
}
for($i=1;$i<$pageno;$i++){
echo "<a href="" . $href . "?pageno=" . $i . "">" . $i . "</a> ";
}
echo $pageno . " ";
for($i++;$i<=$pagecount;$i++){
echo "<a href="" . $href . "?pageno=" . $i . "">" . $i . "</a> ";
}
if($pageno<$pagecount){//顯示下一頁的褳接
echo "<a href="" . $href . "?pageno=" . ($pageno+1) . "">下一頁</a> ";
}
else{
echo "下一頁 ";
}
$offset = ($pageno-1) * $pagesize;//算出本頁第一條記錄在整個表中的位置(第一條記錄為0)
$sql = "select * from pagetest LIMIT $offset,$pagesize";//生成查詢本頁數據的SQL語句
$rst = mysql_query($sql);//查詢本頁數據
$num_fields = mysql_num_fields($rst);//取得欄位總數
$i = 0;
while($i<$num_fields){//取得所有欄位的名字
$fields[$i] = mysql_field_name($rst,$i);//取得第i+1個欄位的名字
$i++;
}
echo "<table border="1" cellspacing="0" cellpadding="0">";//開始輸出表格
echo "<tr>";
reset($fields);
while(list(,$field_name)=each($fields)){//顯示欄位名稱
echo "<th>$field_name</th>";
}
echo "</tr>";
while($row=mysql_fetch_array($rst)){//顯示本頁數據
echo "<tr>";
reset($fields);
while(list(,$field_name)=each($fields)){//顯示每個欄位的值
$field_value = $row[$field_name];
if($field_value==""){
echo "<td> </td>";
}
else{
echo "<td>$field_value</td>";
}
}
echo "</tr>";
}
echo "</table>";//表格輸出結束
mysql_free_result($rst) or die("無法釋放result資源!");//釋放result資源
}
else{
echo "目前該表中沒有任何數據!";
}
mysql_close($server) or die("無法與伺服器斷開連接!");//斷開連接並釋放資源
?>
開放資料庫連接(ODBC)已成為一種與資料庫進行通信的工業標准。PHP也提供了標準的介面,使得PHP能調用Access,SQL SERVER等資料庫。其相關函數是:
(1)integer odbc_connect(string dsn, string user, string password)
連接到一個ODBC資料庫源名字上。
(2)integer odbc_exec(integer connection, string query)或 odbc_do(integer connection, string query)
在一個連接上執行查詢。
(3)boolean odbc_fetch_row(integer result, integer row)
從一個結果集中獲取一行數據。Row參數是可選的,若為空缺,則返回下一個有效行。在結果集中不再剩餘行時返回false。
(4)boolean odbc_close(integer connection)
關閉一個資料庫的連接。若在該連接上有打開的事務,則返回一個錯誤,而且連接不會被關閉。
最後,還是看個分頁的例子:
<?
//設定每頁顯示條數
$show_num = 10;
$spages = $pages;//避免$pages後期被改變
//定義連接
$dsn = "localhost";
$user = "sa";
$password = "";
//計算總記錄數
$rs_num = "select count(*) as id from bbs where zu='0' and lei='".$lei."'";
$conn_id = odbc_connect($dsn,$user,$password);
$rnum = odbc_exec($conn_id,$rs_num);
while(odbc_fetch_row($rnum)){
$total_rs = odbc_result($rnum,"id");//將總記錄數放入$total_rs變數
}
//計算與頁有關的條數
$nnn = $total_rs / $show_num;//計算總頁數
$hnnn = intval($nnn);//將總頁數取整
$cnnnn = $nnn - $hnnn;
//計算所需總頁數
switch ($cnnn){
case "0":
$hnnn++;
$nnn = $hnnn;//總頁數
break;
default :
$nnn = $hnnn;//總頁數
break;
};
if ($nnn == 0)$nnn++;
//計算頁面改變所需的條件
$fore = $pages;
$next = $pages;
$fore -= 1;
$next += 1;
if ($fore > 0) {
echo "<a>首頁</a>";
echo "<a>前頁</a>";
};
if ($pages < $nnn) {
echo "<a>後頁</a>";
echo "<a>尾頁</a>";
};
echo "共".$nnn."頁";
$query_string = "SELECT * FROM table where condition order by you wanted order";
$cur = odbc_exec($conn_id,$query_string);
//取到循環的頂部
$cnum = ($pages-1) * $show_num;//計算當前的記錄游標的位置
//空循環到顯示記錄游標處
if ($cnum != 0){
for ($i=0;$i<=$cnum;odbc_fetch_row($cur)){$i++;};
};
$i=1;
//顯示記錄
while(odbc_fetch_row($cur)){
echo ;
if ($i == $show_num){//在不滿頁數時跳出程序
break;
};
$i++;
};
//關閉連接
odbc_close($conn_id);
?>
Oracle(甲骨文)是世界上最為流行的關系資料庫。它是大公司推崇的工業化的強有力的引擎。我們先看看其相關的函數:
(1)integer ora_logon(string user , string password)
開始對一個Oracle資料庫伺服器的連接。
(2)integer ora_open(integer connection)
打開給出的連接的游標。
(3)integer ora_do(integer connection, string query)
在給出的連接上執行查詢。PHP生成一個指示器,解析查詢,並執行之。
(4)integer ora_parse(integer cursor, string query)
解析一個查詢並准備好執行。
(5)boolean ora_exec(integer cursor)
執行一個先前由ora_parse函數解析過的查詢。
(6)boolean ora_fetch(integer cursor)
此函數會使得一個執行過的查詢中的行被取到指示器中。這使得您可以調用ora_getcolumn函數。
(7)string ora_getcolumn(integer cursor, integer column)
返回當前的值。列由零開始的數字索引。
(8)boolean ora_logoff(integer connection)
斷開對資料庫伺服器的鏈接。
以下是向ORACLE資料庫插入數據的示常式序:
<html>
<head><title>向ORACLE資料庫中插入數據</title></head>
<body>
<form action="<?echo $PHP_SELF;?>" method="post">
<table border="1" cellspacing="0" cellpadding="0">
<tr>
<th>ID</th>
<th>name</th>
<th>Description</th>
</tr>
<tr>
<td><input type="text" name="name" maxlength="50" size="10"></td>
<td><input type="text" name="email" maxlength="255" size="30"></td>
<td><input type="text" name="Description" maxlength="255" size="50"></td>
</tr>
<tr align="center">
<td colspan="3"><input type="submit" value="提交"><input type="reset" value="重寫"></td>
</tr>
</table>
</form>
<?
//先設置兩個環境變數ORACLE_HOME,ORACLE_SID
putenv("ORACLE_HOME=/oracle/app/oracle/proct/8.0.4");
putenv("ORACLE_SID=ora8");
//設置網頁顯示中文
putenv("NLS_LANG=Simplified_Chinese.zhs16cgb231280");
if($connection=ora_logon("scott","tiger")) {
//庫表test有ID,name,Description三項
$sql = 'insert into test(ID,name,Description) values ';
$sql .= '('' . $ID . '','' . $name . '',''. $Description . '')';
if($cursor=ora_do($connect,$sql)) {
print("insert finished!");
}
$query = 'select * from test';
if($cursor=ora_do($connect,$query)) {
ora_fetch($cursor);
$content0=ora_getcolumn($cursor,0);
$content1=ora_getcolumn($cursor,1);
$content2=ora_getcolumn($cursor,2);
print("$content0");
print("$content1");
print("$content2");
ora_close($cursor);
}
ora_logoff($connection);
}
?>
</body>
</html>
通過PHP你可以輕松的連接到資料庫,請求數據並將其顯示在你的web站點中,甚至修改資料庫中的數據。 MySQL是一種很流行的資料庫,並且在互聯網中有許多有關PHP與MySQL的教程。MySQL是免費的,這一點也許就吸引了不少人。由於其廣泛應用, 我就不想在這里贅述MySQL的使用方法了。Oracle被大量在企業應用中採用,因此我們就利用Oracle來介紹PHP與資料庫的連接。我們當然不會 提及Oracle資料庫的設計原理,原因是這已經超出了我們的討論范圍。
PHP提供了兩套函數與Oracle連接,分別是ORA_和OCI函數。其中ORA_函數略顯陳舊。OCI函數更新據說更好一些。兩者的使用語法幾乎相差無幾。如前所述,你的PHP安裝選項應該可以支持兩者的使用。
想獲得更多有關在Microsoft Windows平台上安裝支持PHP3的Apache伺服器的知識以及更多有關Oracle資料庫的知識,請查閱以下URL:www.csoft.net/~vsbabu/articles/oraphp.html。
4.1 連接
if ($conn=Ora_Logon("user@TNSNAME","password"))
{
echo "SUCCESS ! Connected to database\n";
}
else
{
echo "Failed :-( Could not connect to database\n";
}
Ora_Logoff($conn);
phpinfo();
?>
以上代碼使用TNSNAME(在你的tnsnames.ora文件中指明)定義的Oracle資料庫名稱、用戶名稱和密碼連接資料庫。在成功連接的基礎上,ora_logon函數返回一個非零的連接ID並儲存在變數$conn中。
4.2 查詢
假設與資料庫已經連接就緒,下面我們就來實際的應用對資料庫的查詢。下面的代碼演示了一個連接並查詢的典型例子:
/*
* 連接資料庫並執行查詢
*/
function printoraerr($in_cur)
{
// 檢查Oracle是否出錯
// 如果存在錯誤則顯示
// 當指針被激活時每次請求Oracle後調用該函數
if(ora_errorcode($in_cur))
echo "Oracle code - ".ora_error($in_cur)."\n";
return;
}
/** 主程序 */
if (!($conn=ora_logon("user@TNSNAME","password")))
{
echo "Connection to database failed\n";
exit;
}
echo "Connected as connection - $conn
\n";
echo "Opening cursor ...
\n";
$cursor=ora_open($conn); printoraerr($cursor);
echo "Opened cursor - $cursor
\n";
$qry="select user,sysdate from al";
echo "Parsing the query $qry ...
\n";
ora_parse($cursor,$qry,0); printoraerr($cursor);
echo "Query parsed
\n";
echo "Executing cursor ...
\n";
ora_exec($cursor); printoraerr($cursor);
echo "Executed cursor
\n";
echo "Fetching cursor ...
\n";
while(ora_fetch($cursor))
{
$user=ora_getcolumn($cursor,0); printoraerr($cursor);
$sysdate=ora_getcolumn($cursor,1); printoraerr($cursor);
echo " row = $user, $sysdate
\n";
}
echo "Fetched all records
\n";
echo "Closing cursor ...
\n";
ora_close($cursor);
echo "Closed cursor
\n";
echo "Logging off from oracle...
\n";
ora_logoff($conn);
echo "Logged off from oracle
\n";
?>
(譯者註:以上代碼段缺少注釋,請讀者參考PHP Manual的Oracle資料庫函數部分)
4.3 顯示結果
以下代碼演示了怎樣查詢資料庫並將結果輸出:
function printoraerr($in_cur, $conn)
{
// 檢查Oracle是否出錯
// 如果存在錯誤則顯示
// 當指針被激活時每次請求Oracle後調用該函數
// If it encountered an error, we exit immediately
if(ora_errorcode($in_cur))
{
echo "Oracle code - ".ora_error($in_cur)."
n";
ora_logoff($conn);
exit;
}
return;
}
function exequery($w_qry,$conn)
{
$cursor=ora_open($conn); printoraerr($cursor,$conn);
ora_parse($cursor,$w_qry,0); printoraerr($cursor,$conn);
ora_exec($cursor); printoraerr($cursor,$conn);
$numrows=0;
$w_numcols=ora_numcols($cursor);
// 顯示頭部
echo "
\n";
for ($i=0;$i<$w_numcols;$i++)
{
$align=(ora_columntype($cursor,$i)=="NUMBER")?"RIGHT":"LEFT";
echo "\t ".ora_columnname($cursor,$i)." \n";
}
echo "
\n";
while(ora_fetch($cursor))
{
echo " \n";
for ($i=0;$i<$w_numcols;$i++)
{
$align=(ora_columntype($cursor,$i)=="NUMBER")?"RIGHT":"LEFT";
if(ora_columntype($cursor,$i)=="LONG")
echo " ".
ora_getcolumn($cursor,$i)."
\n";
else
echo " ".ora_getcolumn($cursor,$i)." \n";
printoraerr($cursor,$conn);
}
$numrows++;
echo "
\n";
}
if ($numrows==0)
echo " Query returned no records
\n";
else
{
echo " \n";
echo " Count \n";
echo " $numrows \n";
echo "
\n";
}
echo " \n";
ora_close($cursor);
return;
}
// 主程序
if(!($conn=ora_logon("user@SID","password")))
{
echo "Error: Cannot connect to database\n";
exit;
}
$qry="SELECT
deptno \"Dept\"
,empno \"Emp\"
,empnm \"Name\"
,salary \"Salary\"
FROM
employee
ORDER BY 1,2";
exequery($qry);
ora_logoff($conn);
?>
(譯者註:以上代碼段缺少注釋,請讀者參考PHP Manual的Oracle資料庫函數部分)
4.4 基於HTTP的Oracle登錄
將以下代碼加在PHP頁面代碼之前以確認Oracle登錄。注意你必須正確設定$ SID。
if(!isset($PHP_AUTH_USER))
{
Header("WWW-authenticate: basic realm=\"$SID\"");
Header("HTTP/1.0 401 Unauthorized");
$title="Login Instructions";
echo "
You are not authorized to enter the site
\n";
exit;
}
else
{
if (!($conn=ora_logon("$PHP_AUTH_USER@$SID",$PHP_AUTH_PW)))
{
Header("WWW-authenticate: basic realm=\"$SID\"");
Header("HTTP/1.0 401 Unauthorized");
$title="Login Instructions";
echo "
You are not authorised to enter the site
\n";
exit;
}
}
?>
Ⅹ java怎麼將excel中string類型在導入到資料庫時轉換成表中對應的id
首先你得解析excle,再封裝實體,賦值對應的欄位,存入資料庫,類似下面的這個:
publicstaticvoidreadExcel(StringfilePath){
Proctsprocts=newProcts();
SqlSessionsqlSession=MybatisSqlSessionFactory.getSession();
ProctsMapperproctsMapper=sqlSession.getMapper(ProctsMapper.class);
Map<Integer,String>map1=FileUtil.readfile(filePath,null);
for(inti=0;i<map1.size();i++){
//獲取工作表
Workbookworkbook=ExcelUtil.reWorkbook(map1.get(i));
//獲取sheet個數
intshNum=ExcelUtil.reExcelSheet(workbook);
for(intnum=0;num<shNum;num++){
//獲取行數
introwNum=ExcelUtil.reExcelSheetRowNum(workbook,num);
if(rowNum!=0)
{
for(intrnum=0;rnum<=rowNum;rnum++){
//獲取列數
intcellNum=ExcelUtil.reExcelSheetCellNum(workbook,num,rnum);
if(cellNum!=0)
{
Stringvalue=ExcelUtil.reExcelValue(workbook,num,rnum,0,false);
procts.setProctcode(value);
procts.setActivestatus("1");
intcode=proctsMapper.updateByProctCode(procts);
sqlSession.commit();
if(code!=0)
{
logger.info("讀取Excel的行數為{},更新數據條數為{}",rnum,code);
}
}
}
}
}
logger.info("讀取Excel完成");
}
}