分享
 
 
 

DB2数据库使用经验漫谈(1)

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

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 列名 setdata type <类型>4、Grant (赋权)对[public/用户/组] 赋于在表上的[all/select/insert/update/delete] 权限:Grant [all/select/insert/update/delete] on [<模式名>.]表名to [public/用户/组];对[public/用户/组] 赋于在包上的[bind/execute/]权限:Grant [bind/execute/] onpackage [<模式名>.][包名] 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/password

con = 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 ATOMIC

VALUES(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 database

Connection 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 results

while (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 resources

if (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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有