文章詳情頁
DB2數據庫使用經驗漫談(1)
瀏覽:2日期:2023-11-10 14:54:44
DB2數據庫使用DML(Data Manipulation Language commands)數據操縱語言DDL(Data Definition Language commands) 數據定義語言TCC(Transaction Control commands) 事務控制語言SCC(System Control commands ) 系統控制語言一 DML數據操縱語言(一)數據查詢命令select <查詢內容>From <表名>where <條件>/*in,between,like%或_*/group by<分組內容>having<組內條件>order by<排序內容>[asc/desc];(二)數據更新命令1、數據插入命令(1).具體的值插入表中 Insert into <表名> [(列名表)] values<值表1>,<值表2>,<值表2>... (注: 日期,字符型值加引號) (2).將其它表滿足條件的數據插入到一個表中 Insert into <表名> [<列表名>] <select 子句>2、數據修改命令Update <表名> set <列名1>=<表達式1>,<列名2>=<表達式2>...[where<條件>];Update <表名> set <列名1>=(< select 子句 >) [where<條件>];3、數據刪除命令Delete from <表名> [where<條件>];二 DDL數據定義語言(一)、基本數據類型1.字符串字符串為一個字節序列,字符串的長度為序列中的字節數。假如長度為零,則該字符串的值稱為空字符串。CHAR(x) 是固定長度字符串。(1=VARCHAR(x) 可變長度字符 x<=4000,x>254不能用group by ,order by,distinct 和除 12345678下一頁 union all以外的任何設置操作。GRAPHIC(x)是固定圖形字符串。(1=BLOB 二進制字符串,是一個字節序列,用于保存非傳統數據,如圖象、圖形、聲音等數據。2 數字 :所有數字都有符號和精度。精度是除開符號的位數或數字數。SMALLINT 小整數,是精度為5位的兩字節整數。INTEGER 大整數,是精度為10位的四字節整數。REAL 單精度浮點數,是實數的32位近似值。DOUBLE 雙精度浮點數,是實數的64位近似值,DOUBLE也稱FLOAT。DECIMAL(p,s) DECIMAL是一個十進制數。小數點的位置由數字的 精度(p)和小數位(s)確定。精度是數字的總位數,必須小于32。小數位是小數部分數字的位數且總是小于或等于精度值。假如未指定精度和小數位,則十進制值的缺省精度為5,缺省小數位為0。3 日期時間值 :日期時間值是日期、時間以及時間戳記的表示,日期時間值可以用于某些算術運算和字符串運算并且與某些字符串是相容的。DATE 由三個部分構成(年、月以及日)。TIME 使用24小時制,分為三個部分(小時、分鐘以及秒)。IMESTAMP 分為七個部分(年、月、日、小時、分鐘、秒以及微秒)。4空值 空值是一個區別于所有非空值的非凡值。它意味著行中的那一列無任何其它值。所有數據類型都存在空值。(二)、數據定義1、Create (創建)創建表:Create table [<模式名>.]<表名> (<列名1> <類型> [Null|Not null] [,<列 名2> <類型>...]創建視圖:Create view [<模式名>.]<視圖名> [<列名表>] as select 語句 上一頁12345678下一頁 創建別名:Create alias [<模式名>.]別名 for [<模式名>.]表名/視圖名/別名創建索引:Create [unique] index <索引名> /*I_表名_字段名*/ on <表名>(<列名>[asc|desc]創建模式:Create schema 模式名 authorization 權限名2、Drop (摧毀)摧毀表:drop table [<模式名>.]表名摧毀視圖:drop view [<模式名>.]視圖名摧毀別名:drop alias [<模式名>.]別名摧毀觸發器:drop trigger [<模式名>.]觸發器名摧毀索引:drop index [<模式名>.]<索引名>摧毀包:drop package [<模式名>.]包名3、Alter (變更)增加表列:Alter table [<模式名>.]<表名> add column [<列名1> <類型> [Null|Not null]]...增加約束: Alter table [<模式名>.]<表名> add constraint 列名 CHECK (約束)刪除約束:Alter table [<模式名>.]<表名> drop constraint 約束名 修改列類型:Alter table [<模式名>.]<表名> alter column 列名 set data type <類型>4、Grant (賦權)對[public/用戶/組] 賦于在表上的[all/select/insert/update/delete] 權限:Grant [all/select/insert/update/delete] on [<模式名>.]表名to [public/用戶/ 組];對[public/用戶/組] 賦于在包上的[bind/execute/]權限:Grant [bind/execute/] on package [<模式名>.][包名] to [public/用戶/組]; 上一頁12345678下一頁 對[public/用戶/組] 賦于在索引上的[control]權限: Grant control on index [<模式名>.]索引名 to [public/用戶/組]5、Revoke (回收)從public/用戶/組] 回收在表上的[all/select/insert/update/delete] 權限:Revoke [all/select/insert/update/delete] on [表名] from [public/用戶/組];從public/用戶/組] 回收在包上的[bind/execute/] 權限:Revoke [bind/execute/] on package [<模式名>.][包名]from [public/用戶/組];三 事務控制語言1.事務提交命令: Commit;2.事務回退命令: Rollback;四 系統控制語言1.取消自動提交:Update command options using c off;2.連接數據庫:Connect to 數據庫名 user 用戶 using 密碼3.斷開數據庫連接:Connect resetDisconnect 數據庫名4.列出數據庫中的所有表:List tables for all5.列出數據庫中的模式名為schema_name的所有表:List tables for schema schema_name6.查看表結構Describe table 模式名.表名Describe select * from 模式名.表名7.查看表的索引Describe indexes for table 模式名.表名五 函數(一) 列函數列函數對列中的一組值進行運算以得到單個結果值。1.AVG返回某一組中的值除以該組中值的個數的和2.COUNT (*)返回非空列值的行數。3.MAX返回一組值中的最大值4.MIN返回一組值中的最小值5. MOD求余(二) 標量函數 上一頁12345678下一頁 標量函數對值進行某個運算以返回另一個值。下列就是一些由DB2通用數據庫提供的標量函數的示例。1.ABS返回數的絕對值2.HEX返回值的十六進制表示3.LENGTH返回自變量中的字節數(對于圖形字符串則返回雙字節字符數。)4.YEAR抽取日期時間值的年份部分5.NULLIF(a,b)假如a=b則值為空,否則值為a6.COALESCE(a,b,c):返回第一個具有非空值的參數的值7.UCASE(str)小寫字符轉換成大寫字符8.ICASE(str)大寫字符轉換成小寫字符9.LOCAT(str1,str2,n)返回從第n個字符起,在str1中str2第一次出現的位置10.SUBSTR(str,m,n)返回從第m個字符起,,在str中的n個字符串六 嵌入式SQL(SQLJ)將SQL語句嵌入應用程序時,必須按以下步驟預編譯應用程序并將其與數據庫聯編:1.創建源文件,以包含帶嵌入式 SQL 語句的程序格式: # SQL{ SQL語句 } 。2.連接數據庫,然后預編譯每個源文件。語法: SQLJ 源文件名例:import java.sql.*;import sqlj.runtime.*;import sqlj.runtime.ref.*;#sql iterator App_Cursor1 (String empno, String firstnme) ;#sql iterator App_Cursor2 (String) ;class App{static { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance(); } catch (Exception e) { e.printStackTrace(); } }public static void main(String argv[]) { try { App_Cursor1 cursor1; App_Cursor1 cursor2; String str1 = null; String str2 = null; int count1; Connection con = null;String url = "jdbc:odbc:tese2"; DefaultContext ctx = DefaultContext.getDefaultContext(); if (ctx == null) {try { if (argv.length == 0) {String userid ="tdl";String passwd ="user";con = DriverManager.getConnection(url, userid, passwd);} else if (argv.length == 2) { // connect with default id/passwordcon = DriverManager.getConnection(url); } else {System.out.println("Usage: java App [username password]");System.exit(0); } con.setAutoCommit(false); ctx = new DefaultContext(con);} catch (SQLException e) {System.out.println("Error: could not get a default context");System.err.println(e) ;System.exit(1); }DefaultContext.setDefaultContext(ctx); }#sql cursor1 = { SELECT empno, firstnme from db2admin.employee }; System.out.println("Received results:"); while (cursor1.next()) {str1 = cursor1.empno();str2 = cursor1.firstnme();System.out.print (" empno= " + str1);System.out.print (" firstname= " + str2);System.out.print (""); } cursor1.close();#sql cursor2 = { SELECT firstnme from db2admin.employee where empno = :str1 }; System.out.println("Received results:"); while (true) {#sql { FETCH :cursor2 INTO :str2 };if (cursor2.endFetch()) break;System.out.print (" empno= " + str1);System.out.print (" firstname= " + str2);System.out.print (""); } cursor2.close();// rollback the update System.out.println("Rollback the update..."); #sql { ROLLBACK work }; System.out.println("Rollback done."); } catch( Exception e ) { e.printStackTrace(); } }}注:本程序采用JDBCODBC橋的方式訪問數據庫,必須配置ODBC數據源。 上一頁12345678下一頁 七 觸發器建一個觸發器,應包含以下部分:觸發器名字觸發器觸發事件: insert,delete,update激活時間: before,after粒度: for each statement,for each row過渡變量:old row:表示觸發事件之前被修改的值:new row表示觸發事件之后被修改的值old table表示觸發事件之前全部被修改行的一個只讀假想表new table表示觸發事件之后全部被修改行的一個假想表觸發條件: 由WHEN開始,可包含一個或多個謂詞,可包含過渡變量和子查詢觸發體: 由一個或多個SQL語句組成例:CREATE TRIGGER REORDER AFTER UPDATE OF ON_HAND, MAX_STOCKED ON PARTS REFERENCING NEW AS N_ROW FOR EACH ROW MODE DB2SQL WHEN (N_ROW.ON_HAND < 0.10 * N_ROW.MAX_STOCKED AND N_ROW.ORDER_PENDING = 'N') BEGIN ATOMICVALUES(ISSUE_SHIP_REQUEST(N_ROW.MAX_STOCKED - N_ROW.ON_HAND, N_ROW.PARTNO));UPDATE PARTS SET PARTS.ORDER_PENDING = 'Y'WHERE PARTS.PARTNO = N_ROW.PARTNO; END八 存儲過程存儲過程主要通過Stored Procedure Builder來建立,(一)對存儲過程的調用分三部分:1.連接(與數據庫建立連接) Class.forName("COM.ibm.db2.jdbc.net.DB2Driver").newInstance(); Connection con=DriverManager.getConnection(url,user,password); 上一頁12345678下一頁 2。注冊輸出參數 cs.registerOutParameter (3, Types.INTEGER);3。調用存儲過程: CallableStatement cs=con.prepareCall("{call store_name(參數,參數,參數)}");(二)調用舉例:import java.net.URL;import java.sql.*;class test2{ public static void main(String args[]) { String url = "jdbc:db2://wellhope/sample"; String user="db2admin"; String password="db2admin"; try { Class.forName("COM.ibm.db2.jdbc.net.DB2Driver").newInstance(); //與數據庫建立連接 Connection con=DriverManager.getConnection(url,user,password); checkForWarning(con.getWarnings()); DatabaseMetaData dma=con.getMetaData();String str="This is a string"; //int hashcode=str.hashCode(); //System.out.println("Hashcode "+hashcode); //創建Statement對象,用于執行SQL語句 Statement stmt=con.createStatement(); //創建CallableStatement對象,用于執行存儲過程 CallableStatement cs=con.prepareCall("{call PRO_YHDL1(?,?,?)}"); //注冊輸出參數 cs.registerOutParameter (3, Types.INTEGER); int result = 0; cs.setString(1,"123"); cs.setString(2,"123"); cs.execute(); result = cs.getInt (3); dispResultSet(result); cs.close(); con.close(); } catch(SQLException ex) { System.out.println("* * * SQLException caught * * *"); while(ex!=null) { System.out.println("SQLState: "+ex.getSQLState()); System.out.println("Message: "+ex.getMessage()); System.out.println("Vendor: "+ex.getErrorCode()); ex=ex.getNextException(); System.out.println(""); } } catch(java.lang.Exception ex) { ex.printStackTrace(); } }(三)存儲過程舉例: 上一頁12345678下一頁 Pro_yhdl1是一個存儲過程,它的功能是從數據庫表YHDL中取出PWD:import java.sql.*; public class Pro_yhdl1{public static void pro_yhdl1 ( String m_id, String m_pwd, int[] result ) throws SQLException, Exception{// Get connection to the databaseConnection con = DriverManager.getConnection("jdbc:default:connection");PreparedStatement stmt = null;ResultSet rs = null;String sql;String m_password="";sql = "SELECT"+ " DB2ADMIN.YHDL.PWD"+ " FROM"+ "DB2ADMIN.YHDL"+ " WHERE"+ "("+ " ( "+ " DB2ADMIN.YHDL.ID = '"+m_id.trim()+"'"+ " )"+ ")";stmt = con.prepareStatement( sql );rs = stmt.executeQuery();// Access query resultswhile (rs.next()){ m_password=rs.getString(1); m_password=m_password.trim(); if (rs.wasNull()) System.out.print("NULL"); else System.out.print(m_password); }if(m_password.equals(m_pwd.trim())){ result[0] =1;}else{ result[0] =0;}// close open resourcesif (rs != null) rs.close();if (stmt != null) stmt.close();if (con != null) con.close();// set return parameter//result[0] = result[0];}}九 JAVA數據庫鏈接(JDBC)DB2 的 Java 支持包括 JDBC,一個以供給商為中心的動態 SQL 接口,它通過標準的 Java方法提供對應用程序的數據存取。JDBC 與 DB2 CLI 相似之處在于您不必預編譯或聯編 JDBC 程序。使用 JDBC 編寫的應用程序只使用動態 SQL。JDBC編程步驟:1建立與數據庫的連接: Class.forName("Com.ibm.db2.jdbc.net.DB2Driver"); connection con=DriverManager.getConnection(url);2.創建Statement對象: Statement stmt=con.createStatement();3執行查詢語句: ResultSet rs=stmt.execQuery("SQL語句");4.獲取和設置選項: ResultSetMetaData rsmd=rs.getMetaData(); int numCols=rsmd.getColumnCount()獲取結果集總列數; rsmd.getColumnLabel(i))獲取記錄值; setMaxRows :設置結果集能容納的最多行數. setQueryTimeout:設置一個語句執行等待的時間. setEscapeProcessing:通知驅動程序如何處理轉義字符.5.關閉Statement stmt.clost();十 調用層接口(CLI)CLI不是一種新的查詢語言,它只不過是應用程序可利用SQL語句去提交事務處理的一種簡單接口,對數據庫的查詢和修改,仍要使用SQL語言編寫,包括CLI函數的調用。調用層接口(CLI)為DB2所提供的處理動態SQL語句的兩種機制之一,即在應用程序首次運行時,動態SQL語句提交給數據庫系統,CLI依靠一組函數調用,可嵌入主語言中。 上一頁12345678
排行榜