Ⅰ oracle sql語法 ①中的:1代表什麼;②中聲明的變數類型是什麼;③中的賦值語法是什麼
1. 這是一個綁定變數的標准寫法,:1可以理解為一個佔位符。OLTP系統裡面使用這種綁定變數的寫法可以減少硬解析的次數,減少對數據字典以及Latch的使用,單個語句上提升的不大,但是對於整體性能有很大的提升。
2. 聲明了一個number數組類型num_list,其最大存儲number元素的個數為20。java裡面類似於int[20]。
3. 聲明變數v_id 類型為num_list,並且初始化變數v_id的第一、二個element為100,101。
Ⅱ java連接oracle資料庫java.sql.SQLException:無效的列索引問題
java.sql.SQLException: 無效的列索引
無效的列索引
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:207)
atoracle.jdbc.driver.OraclePreparedStatement.setStringInternal(OraclePreparedStatement.java:5328)
atoracle.jdbc.driver.OraclePreparedStatement.setString(OraclePreparedStatement.java:5320)
at untitled5.addreader1.validID(addreader1.java:128)
at untitled5.addreader1.jButton1_actionPerformed(addreader1.java:97)
at untitled5.addreader1_jButton1_actionAdapter.actionPerformed(addreader1.java:175)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
代碼:String driverName = "oracle.jdbc.OracleDriver";
Driver driver = (Driver) Class.forName(driverName).newInstance();
//連接資料庫
Connection con = DriverManager.getConnection(
"jdbc:oracle:thin:@LONG:1521:orcl", "sysman", "tongfang");
PreparedStatement pstmt = con.prepareStatement(
" insert into reader values(?)");
pstmt.setString(1, str1);
pstmt.setString(2,str2);
pstmt.setString(3,str3);
pstmt.setString(4,str4);
ResultSet res = pstmt.executeQuery();
Ⅲ Oracle面試題(基礎篇)
Oracle面試題(基礎篇)
Oracle Database,又名Oracle RDBMS,或簡稱Oracle。是甲骨文公司的一款關系資料庫管理系統。以下是關於Oracle面試題(基礎篇),希望大家認真閱讀!
1. Oracle跟SQL Server 2005的區別?
宏觀上:
1). 最大的區別在於平台,oracle可以運行在不同的平台上,sql server只能運行在windows平台上,由於windows平台的穩定性和安全性影響了sql server的穩定性和安全性
2). oracle使用的腳本語言為PL-SQL,而sql server使用的腳本為T-SQL
微觀上: 從數據類型,資料庫的結構等等回答
2. 如何使用Oracle的游標?
1). oracle中的游標分為顯示游標和隱式游標
2). 顯示游標是用cursor...is命令定義的游標,它可以對查詢語句(select)返回的多條記錄進行處理;隱式游標是在執行插入 (insert)、刪除(delete)、修改(update)和返回單條記錄的查詢(select)語句時由PL/SQL自動定義的。
3). 顯式游標的操作:打開游標、操作游標、關閉游標;PL/SQL隱式地打開SQL游標,並在它內部處理SQL語句,然後關閉它
3. Oracle中function和procere的區別?
1). 可以理解函數是存儲過程的一種
2). 函數可以沒有參數,但是一定需要一個返回值,存儲過程可以沒有參數,不需要返回值
3). 函數return返回值沒有返回參數模式,存儲過程通過out參數返回值, 如果需要返回多個參數則建議使用存儲過程
4). 在sql數據操縱語句中只能調用函數而不能調用存儲過程
4. Oracle的導入導出有幾種方式,有何區別?
1). 使用oracle工具 exp/imp
2). 使用plsql相關工具
方法1. 導入/導出的是二進制的數據, 2.plsql導入/導出的是sql語句的文本文件
5. Oracle中有哪幾種文件?
數據文件(一般後綴為.dbf或者.ora),日誌文件(後綴名.log),控制文件(後綴名為.ctl)
6. 怎樣優化Oracle資料庫,有幾種方式?
個人理解,資料庫性能最關鍵的因素在於IO,因為操作內存是快速的,但是讀寫磁碟是速度很慢的,優化資料庫最關鍵的問題在於減少磁碟的IO,就個人理解應該分為物理的和邏輯的優化, 物理的是指oracle產品本身的一些優化,邏輯優化是指應用程序級別的優化
物理優化的一些原則:
1). Oracle的運行環境(網路,硬體等)
2). 使用合適的優化器
3). 合理配置oracle實例參數
4). 建立合適的索引(減少IO)
5). 將索引數據和表數據分開在不同的表空間上(降低IO沖突)
6). 建立表分區,將數據分別存儲在不同的分區上(以空間換取時間,減少IO)
邏輯上優化:
1). 可以對表進行邏輯分割,如中國移動用戶表,可以根據手機尾數分成10個表,這樣對性能會有一定的作用
2). Sql語句使用佔位符語句,並且開發時候必須按照規定編寫sql語句(如全部大寫,全部小寫等)oracle解析語句後會放置到共享池中
如: select * from Emp where name=? 這個語句只會在共享池中有一條,而如果是字元串的話,那就根據不同名字存在不同的語句,所以佔位符效率較好
3). 資料庫不僅僅是一個存儲數據的地方,同樣是一個編程的地方,一些耗時的操作,可以通過存儲過程等在用戶較少的情況下執行,從而錯開系統使用的高峰時間,提高資料庫性能
4). 盡量不使用*號,如select * from Emp,因為要轉化為具體的列名是要查數據字典,比較耗時
5). 選擇有效的表名
對於多表連接查詢,可能oracle的優化器並不會優化到這個程度, oracle 中多表查詢是根據FROM字句從右到左的數據進行的,那麼最好右邊的表(也就是基礎表)選擇數據較少的表,這樣排序更快速,如果有link表(多對多中間表),那麼將link表放最右邊作為基礎表,在默認情況下oracle會自動優化,但是如果配置了優化器的情況下,可能不會自動優化,所以平時最好能按照這個方式編寫sql
6). Where字句 規則
Oracle 中Where字句時從右往左處理的,表之間的連接寫在其他條件之前,能過濾掉非常多的數據的條件,放在where的末尾, 另外!=符號比較的列將不使用索引,列經過了計算(如變大寫等)不會使用索引(需要建立起函數), is null、is not null等優化器不會使用索引
7). 使用Exits Not Exits 替代 In Not in
8). 合理使用事務,合理設置事務隔離性
資料庫的數據操作比較消耗資料庫資源的,盡量使用批量處理,以降低事務操作次數
7. Oracle中字元串用什麼符號鏈接?
Oracle中使用 || 這個符號連接字元串 如 ‘abc’ || ‘d’
8. Oracle分區是怎樣優化資料庫的`?
Oracle的分區可以分為:列表分區、范圍分區、散列分區、復合分區。
1). 增強可用性:如果表的一個分區由於系統故障而不能使用,表的其餘好的分區仍可以使用;
2). 減少關閉時間:如果系統故障隻影響表的一部份分區,那麼只有這部份分區需要修復,可能比整個大表修復花的時間更少;
3). 維護輕松:如果需要得建表,獨產管理每個公區比管理單個大表要輕松得多;
4). 均衡I/O:可以把表的不同分區分配到不同的磁碟來平衡I/O改善性能;
5). 改善性能:對大表的查詢、增加、修改等操作可以分解到表的不同分區來並行執行,可使運行速度更快
6). 分區對用戶透明,最終用戶感覺不到分區的存在。
9. Oracle是怎樣分頁的?
Oracle中使用rownum來進行分頁, 這個是效率最好的分頁方法,hibernate也是使用rownum來進行oralce分頁的
select * from
( select rownum r,a from tabName where rownum <= 20 )
where r > 10
10. Oralce怎樣存儲文件,能夠存儲哪些文件?
Oracle 能存儲 clob、nclob、 blob、 bfile
Clob 可變長度的字元型數據,也就是其他資料庫中提到的文本型數據類型
Nclob 可變字元類型的數據,不過其存儲的是Unicode字元集的字元數據
Blob 可變長度的二進制數據
Bfile 資料庫外面存儲的可變二進制數據
11. Oracle中使用了索引的列,對該列進行where條件查詢、分組、排序、使用聚集函數,哪些用到了索引?
均會使用索引, 值得注意的是復合索引(如在列A和列B上建立的索引)可能會有不同情況
12. 資料庫怎樣實現每隔30分鍾備份一次?
通過操作系統的定時任務調用腳本導出資料庫
13. Oracle中where條件查詢和排序的性能比較?
Order by使用索引的條件極為嚴格,只有滿足如下情況才可以使用索引,
1). order by中的列必須包含相同的索引並且索引順序和排序順序一致
2). 不能有null值的列
所以排序的性能往往並不高,所以建議盡量避免order by
14. 解釋冷備份和熱備份的不同點以及各自的優點?
冷備份發生在資料庫已經正常關閉的情況下,將關鍵性文件拷貝到另外位置的一種說法
熱備份是在資料庫運行的情況下,採用歸檔方式備份數據的方法
冷備的優缺點:
1).是非常快速的備份方法(只需拷貝文件)
2).容易歸檔(簡單拷貝即可)
3).容易恢復到某個時間點上(只需將文件再拷貝回去)
4).能與歸檔方法相結合,作資料庫“最新狀態”的恢復。
5).低度維護,高度安全。
冷備份不足:
1).單獨使用時,只能提供到“某一時間點上”的恢復。
2).在實施備份的全過程中,資料庫必須要作備份而不能作其它工作。也就是說,在冷備份過程中,資料庫必須是關閉狀態。
3).若磁碟空間有限,只能拷貝到磁帶等其它外部存儲設備上,速度會很慢。
4).不能按表或按用戶恢復。
熱備的優缺點
1).可在表空間或數據文件級備份,備份時間短。
2).備份時資料庫仍可使用。
3).可達到秒級恢復(恢復到某一時間點上)。
4).可對幾乎所有資料庫實體作恢復。
5).恢復是快速的,在大多數情況下在資料庫仍工作時恢復。
熱備份的不足是:
1).不能出錯,否則後果嚴重。
2).若熱備份不成功,所得結果不可用於時間點的恢復。
3).因難於維護,所以要特別仔細小心,不允許“以失敗而告終”。
15. 解釋data block , extent 和 segment的區別?
data block 數據塊,是oracle最小的邏輯單位,通常oracle從磁碟讀寫的就是塊
extent 區,是由若干個相鄰的block組成
segment段,是有一組區組成
tablespace表空間,資料庫中數據邏輯存儲的地方,一個tablespace可以包含多個數據文件
;Ⅳ 如何使用佔位符向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 的別名
Ⅳ 在oracle sql語句里有沒有if...else...的用法,請各位大俠給個例子看看,灰常感謝!!
oracle 中if ..else 可以再pl/sql 中使用,
如果是要在SQL語句中達到這種效果可以用case when ... then ...else ..end;
mysql資料庫中CASE WHEN語句。
case when語句,用於計算條件列表並返回多個可能結果表達式之一。
CASE 具有兩種格式:
簡單 CASE 函數將某個表達式與一組簡單表達式進行比較以確定結果。
CASE 搜索函數計算一組布爾表達式以確定結果。
兩種格式都支持可選的 ELSE 參數。
語法
簡單 CASE 函數:
復制代碼 代碼如下:
CASE input_expression
WHEN when_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
END
CASE 搜索函數:
復制代碼 代碼如下:
CASE
WHEN Boolean_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
END
參數
input_expression
是使用簡單 CASE 格式時所計算的表達式。Input_expression 是任何有效的 Microsoft? SQL Server? 表達式。
WHEN when_expression
使用簡單 CASE 格式時 input_expression 所比較的簡單表達式。When_expression 是任意有效的 SQL
Server 表達式。Input_expression 和每個 when_expression 的數據類型必須相同,或者是隱性轉換。
佔位符,表明可以使用多個 WHEN when_expression THEN result_expression 子句或 WHEN Boolean_expression THEN result_expression 子句。
THEN result_expression
當 input_expression = when_expression 取值為 TRUE,或者 Boolean_expression 取值為 TRUE 時返回的表達式。
result expression 是任意有效的 SQL Server 表達式。
ELSE else_result_expression
當比較運算取值不為 TRUE 時返回的表達式。如果省略此參數並且比較運算取值不為 TRUE,CASE 將返回 NULL
值。Else_result_expression 是任意有效的 SQL Server 表達式。Else_result_expression
和所有 result_expression 的數據類型必須相同,或者必須是隱性轉換。
WHEN Boolean_expression
使用 CASE 搜索格式時所計算的布爾表達式。Boolean_expression 是任意有效的布爾表達式。
結果類型
從 result_expressions 和可選 else_result_expression 的類型集合中返回最高的優先規則類型。有關更多信息,請參見數據類型的優先順序。
結果值
簡單 CASE 函數:
計算 input_expression,然後按指定順序對每個 WHEN 子句的 input_expression = when_expression 進行計算。
返回第一個取值為 TRUE 的 (input_expression = when_expression) 的 result_expression。
如果沒有取值為 TRUE 的 input_expression = when_expression,則當指定 ELSE 子句時 SQL Server 將返回 else_result_expression;若沒有指定 ELSE 子句,則返回 NULL 值。
CASE 搜索函數:
按指定順序為每個 WHEN 子句的 Boolean_expression 求值。
返回第一個取值為 TRUE 的 Boolean_expression 的 result_expression。
如果沒有取值為 TRUE 的 Boolean_expression,則當指定 ELSE 子句時 SQL Server 將返回 else_result_expression;若沒有指定 ELSE 子句,則返回 NULL 值。
下面分享一些mysql case when語句的例子。
A. 使用帶有簡單 CASE 函數的 SELECT 語句
在 SELECT 語句中,簡單 CASE 函數僅檢查是否相等,而不進行其它比較。
例子,使用 CASE 函數更改圖書分類顯示。
復制代碼 代碼如下:
USE pubs
GO
SELECT Category =
CASE type
WHEN 'popular_comp' THEN 'Popular Computing'
WHEN 'mod_cook' THEN 'Modern Cooking'
WHEN 'business' THEN 'Business'
WHEN 'psychology' THEN 'Psychology'
WHEN 'trad_cook' THEN 'Traditional Cooking'
ELSE 'Not yet categorized'
END,
CAST(title AS varchar(25)) AS 'Shortened Title',
price AS Price
FROM titles
WHERE price IS NOT NULL
ORDER BY type, price
COMPUTE AVG(price) BY type
GO
注釋,後來我試了一下不讓用category=。
我使用的代碼為:
復制代碼 代碼如下:
SELECT
case gender
WHEN 1 THEN 'NAN'
WHEN 0 THEN 'NV'
end as gender
FROM
t_swidy_day_nutrient
結果集:
Category Shortened Title Price
------------------- ------------------------- --------------------------
Business You Can Combat Computer S 2.99
Business Cooking with Computers: S 11.95
Business The Busy Executive's Data 19.99
Business Straight Talk About Compu 19.99
avg
==========================
13.73
Category Shortened Title Price
------------------- ------------------------- --------------------------
Modern Cooking The Gourmet Microwave 2.99
Modern Cooking Silicon Valley Gastronomi 19.99
avg
==========================
11.49
Category Shortened Title Price
------------------- ------------------------- --------------------------
Popular Computing Secrets of Silicon Valley 20.00
Popular Computing But Is It User Friendly? 22.95
avg
==========================
21.48
Category Shortened Title Price
------------------- ------------------------- --------------------------
Psychology Life Without Fear 7.00
Psychology Emotional Security: A New 7.99
Psychology Is Anger the Enemy? 10.95
Psychology Prolonged Data Deprivatio 19.99
Psychology Computer Phobic AND Non-P 21.59
avg
==========================
13.50
Category Shortened Title Price
------------------- ------------------------- --------------------------
Traditional Cooking Fifty Years in Buckingham 11.95
Traditional Cooking Sushi, Anyone? 14.99
Traditional Cooking Onions, Leeks, and Garlic 20.95
avg
==========================
15.96
(21 row(s) affected)
B. 使用帶有簡單 CASE 函數和 CASE 搜索函數的
SELECT 語句
在 SELECT 語句中,CASE 搜索函數允許根據比較值在結果集內對值進行替換。
例子:根據圖書的價格範圍將價格(money 列)顯示為文本注釋。
復制代碼 代碼如下:
USE pubs
GO
SELECT 'Price Category' =
CASE
WHEN price IS NULL THEN 'Not yet priced'
WHEN price < 10 THEN 'Very Reasonable Title'
WHEN price >= 10 and price < 20 THEN 'Coffee Table Title'
ELSE 'Expensive book!'
END,
CAST(title AS varchar(20)) AS 'Shortened Title'
FROM titles
ORDER BY price
GO
結果集:
Price Category Shortened Title
--------------------- --------------------
Not yet priced Net Etiquette
Not yet priced The Psychology of Co
Very Reasonable Title The Gourmet Microwav
Very Reasonable Title You Can Combat Compu
Very Reasonable Title Life Without Fear
Very Reasonable Title Emotional Security:
Coffee Table Title Is Anger the Enemy?
Coffee Table Title Cooking with Compute
Coffee Table Title Fifty Years in Bucki
Coffee Table Title Sushi, Anyone?
Coffee Table Title Prolonged Data Depri
Coffee Table Title Silicon Valley Gastr
Coffee Table Title Straight Talk About
Coffee Table Title The Busy Executive's
Expensive book! Secrets of Silicon V
Expensive book! Onions, Leeks, and G
Expensive book! Computer Phobic And
Expensive book! But Is It User Frien
(18 row(s) affected)
C. 使用帶有 SUBSTRING 和 SELECT 的 CASE 函數
例子,使用 CASE 和 THEN 生成一個有關作者、圖書標識號和每個作者所著圖書類型的列表。
首先,來看下 CASE 的語法。在一般的 SELECT 中,其語法如下:
復制代碼 代碼如下:
SELECT <myColumnSpec> =
CASE
WHEN <A> THEN <somethingA>
WHEN <B> THEN <somethingB>
ELSE <somethingE>
END
以上代碼,需要用具體的參數代替尖括弧中的內容。
甚至還可以組合這些選項,添加一個 ORDER BY 子句,例如:
復制代碼 代碼如下:
USE pubs
GO
SELECT
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END AS Range,
Title
FROM titles
GROUP BY
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END,
Title
ORDER BY
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END,
Title
GO
除了選擇自定義欄位之外,在很多情況下 CASE 都非常有用。
稍加深入,還可以得到以前認為不可能得到的分組排序結果集。
使用CASE WHEN進行字元串替換處理
在SELECT查詢中使用CASE WHEN
復制代碼 代碼如下:
/*
mysql> SELECT Name, RatingID AS Rating,
-> CASE RatingID
-> WHEN 'R' THEN 'Under 17 requires an alt.'
-> WHEN 'X' THEN 'No one 17 and under.'
-> WHEN 'NR' THEN 'Use discretion when renting.'
-> ELSE 'OK to rent to minors.'
-> END AS Policy
-> FROM DVDs
-> ORDER BY Name;
+-----------+--------+------------------------------+
| Name | Rating | Policy |
+-----------+--------+------------------------------+
| Africa | PG | OK to rent to minors. |
| Amadeus | PG | OK to rent to minors. |
| Christmas | NR | Use discretion when renting. |
| Doc | G | OK to rent to minors. |
| Falcon | NR | Use discretion when renting. |
| Mash | R | Under 17 requires an alt. |
| Show | NR | Use discretion when renting. |
| View | NR | Use discretion when renting. |
+-----------+--------+------------------------------+
8 rows in set (0.01 sec)
*/
Drop table DVDs;
CREATE TABLE DVDs (
ID SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(60) NOT NULL,
NumDisks TINYINT NOT NULL DEFAULT 1,
RatingID VARCHAR(4) NOT NULL,
StatID CHAR(3) NOT NULL
)
ENGINE=INNODB;
INSERT INTO DVDs (Name, NumDisks, RatingID, StatID)
VALUES ('Christmas', 1, 'NR', 's1'),
('Doc', 1, 'G', 's2'),
('Africa', 1, 'PG', 's1'),
('Falcon', 1, 'NR', 's2'),
('Amadeus', 1, 'PG', 's2'),
('Show', 2, 'NR', 's2'),
('View', 1, 'NR', 's1'),
('Mash', 2, 'R', 's2');
SELECT Name, RatingID AS Rating,
CASE RatingID
WHEN 'R' THEN 'Under 17 requires an alt.'
WHEN 'X' THEN 'No one 17 and under.'
WHEN 'NR' THEN 'Use discretion when renting.'
ELSE 'OK to rent to minors.'
END AS Policy
FROM DVDs
ORDER BY Name;
Ⅵ 如何調整oracle中的sql語句輸入的最大長度
Oracle SQL 語句in長度不得超過1000
IN 子句中的LIST個數最長為1000,超過該數目將報錯,這里可轉用一個臨時表來解決;CREATE TRIGGER語句文本的字元長度不能超過32KB(觸發器中不能使用LONG, LONG RAW 類型;觸發器內可以參照LOB 類型列的列值,但不能通過 :NEW 修改LOB列中的數據;)順便說一下,觸發器中的PARENT關鍵字,只在嵌套表觸發器中有效,11G以前,DBMS_SQL對輸入的SQL長度不能超過32K,原因是輸入參數只能是VARCHAR2類型,11G後,可以用CLOB作為輸入參數,則取消了這個限制一個PL/SQL的包、過程、函數、觸發器的大小,在UNIX上最大是64K,而WINDOWS則是32K大小(32K這個應該不準,看下面的測試)SQL語句可以有多長?(網友說)ORACLE文檔說是64K,實際受一些工具的限制會較這個值低,但網友測試發現可以很長,甚至超過1M(我測試過 170K的都沒問題)。具體多長,10G也未說明,只是與很多環境有關:資料庫配置,磁碟空間,內存多少。。。
PL/SQL中,表達式/SQL本身的長度是可以達到比較長的長度(50K)左右,如:v_str:=:new.f1||:ndw.f2。。。 ; select :new.f1||:new.f2。。。 into v_str from al; 另外發現,如果這樣寫:v_str := 『a』||』b』||。。。則允許的表達式長度將大大的減少。如果表達式/SQL過長,超過了一個ORACLE包/過程允許的最大程序長度,則在編譯時報 pls-123:program too large錯誤,這是pl/sql編譯器本身的限製造成的,即表達式/SQL的長度在PL/SQL中受限於包/過程的最大大小=================================================Oracle Sql語句長度限制問題及解決
最近在寫Sql語句時,碰到兩個問題:
1)ORA-01795: maximum number of expressions in a list is 1000起因:寫出了這樣的sql語句:SELECT PALLET_ID,BOX_ID,STATUS FROM SD_CURRENT_BOX WHERE PALLET_ID IN('"+pallets+"');其中的pallets是有很多個pallet_id組合成的字元串。
分析:很顯然,根據錯誤提示可以知道:in 中items的限制 1000個。
解決:用子查詢來代替pallets長字串。
2)ORA-01704: string literal too long
起因:寫出了這樣的Sql語句:UPDATE PDM_MEMBERLIST SET MEMBERS='<Project> ... 此處略去n多串 <ProjectID>'.
分析:資料庫設計MEMBERS欄位為xmltype格式,數據存儲時候,是以字元串的形式存儲。這樣在xml數據量大的時候,造成sql語句過長,嘗過2k的限制。
解決:參數化sql語句。
==================================================參數化sql語句----防止sql注入攻擊(下)
上一篇寫的sql注入的基本原理,本來要接著寫這篇的,但是由於時間的原因一直沒有寫成,今天是五一假期,總算是能抽空寫寫了。
作為一個程序員,防範sql注入的第一線是由我們來守護的,只要我們在程序中留少許的漏洞,就會給程序增強安全特性。所以我們要做的是要寫安全的程序,防止sql注入在程序體現在不要拼接sql字元串,一定要參數化sql或者寫存儲過程,這里就說說簡單的參數化sql吧。
例子中用c#和Oracle實現,Java中或者其他資料庫中的實現也是類似的。
using System.Data.OracleClient;//引入oracle操作包//定義DML語句
string strSQL = @"select user.name from user where user.name =:userName";//上句中的:userName就是sql語句中參數的佔位符,也就是說在資料庫伺服器中執行這條sql語句的時候這個佔位符要被其他東西替換掉,到底用什麼東西替換呢,接著往下看OracleParameter[] param = {
new OracleParameter(":userName",txtName);}//這里定義一個參數的數組,裡面可以寫入多個sql參數,咱們的這里只有一個,所以就寫入一個參數,這里講佔位符和他的替換也就是參數值對應起來了,txtName就是佔位符的替換值,他是用戶界面中用戶輸入的值,就是他可能含有注入攻擊的字元,這下資料庫伺服器知道用什麼東西替換佔位符了。
定義好sql語句和參數後就是執行了,執行的時候需要同時將sql語句和參數傳入,這樣用戶輸入的帶有非法字元的字元串在資料庫會當作參數處理,而不會當作sql語句和資料庫自己的字元混亂,防止了注入攻擊。
OracleCommandcmd = new OracleCommand();
cmd.CommandText= strSQL;//定義oracle命令的文本內容for(oracleParameter p in param)//將參數傳入{
cmd.Parameters.Add(p);
}
cmd.ExecuteNonQuery();//執行命令
上面基本上是一個完整的參數化sql,不同的資料庫伺服器sql語句中參數的佔位符不同,上面用的是oracle,參數佔位符是冒號(:)加名字,在sqlserver中是用@符號加名字作為佔位符,而在MySQL中用問號(?)加名字來作為參數佔位符,不同的資料庫中參數的表示符號不一樣,這個需要注意。
防止sql注入攻擊(上)
Sql注入是一種入門極低破壞極大的攻擊方式。如果sql是用字元串拼接出來的話,那麼肯定會被注入攻擊,前段時間還傳出了某國外大型社交網站被SQL注入攻擊。
Sql注入攻擊的方式,來這里看的同志們應該很清楚了,就是在拼接字元串的時候,如果輸入的是帶單引號的,那麼輸入laf'or 1='1'--這樣就會逃避條件檢查,後面要是再跟一些shutdown,delete之類的條件,那麼損失基本算是毀滅性的了。前幾天單位開發的過程中我發現幾乎大家都不重視安全,一個寫代碼的人不注意安全只注意實現那麼寫出來的代碼在攻擊者眼前基本就是一個沒有穿衣服的美女。
下面是我一個開發人員的一些經驗,主要用來防止sql注入。
1、首先對運行sql的用戶賦予最小許可權,這個理論也是安全領域的最小特權理論,運行一個程序一定要用最小特權運行,所以不要給用戶服務DBA的許可權,限制要許可權之後可以防止一些毀滅性的攻擊,即使攻入了也不會shutdown修改表之類的。
2、一定不要使用字元串拼接的方式構造sql,必須使用參數化sql,存儲過程可以看作是參數sql,簡單的就直接構造參數化sql,復雜的就寫存儲過程,不過存儲過程中一定不要用字元串,我看有人在存儲過程用字元串,這樣還是不能避免被攻擊,並且在調試的時候非常麻煩。
3、嚴把輸入關,系統肯定是用來交互的,所有用戶輸入的這一關一定要把好,可以利用各種方式來檢驗用戶的輸入,讓輸入都是合法的;可以設敏感字元不讓用戶輸入,這個雖然不是很友好,不過對與安全有保證。在驗證的是可以用正則表達式或者程序驗證,不管用什麼方式只要把敏感字元和可疑字元拒之門外那麼就無法攻擊了,不過限制輸入還是有缺陷,在安全理論方面,只能確定合法,不能確定不合法,比如你在界面限制了合法的,那麼剩餘的都是不合法的,這時候輸入的肯定全部是合法的,如果你限制的是非法的,可是你能確保你限制的全是非法的?如果某一天發現一個非法的不再你限制之內那麼你就會被攻擊。
4、做好自己的檢驗和測試工作,自己可以進行sql注入攻擊,利用工具檢驗。
5、一定要養成具有安全意識的程序員,時刻想著安全。
這幾條之中最重要的是1和2,許可權限制一定要注意,不然會死的很慘的,第二就是程序員的習慣了,一定要用參數化sql和資料庫交互。