??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲av产在线精品亚洲第一站,日韩精品亚洲aⅴ在线影院,亚洲精品国产国语http://www.tkk7.com/hua/category/10657.html即世界明天毁灭Q我也要在今天种下我的葡萄树?zh-cnTue, 27 Feb 2007 12:26:08 GMTTue, 27 Feb 2007 12:26:08 GMT60ORACLEW记http://www.tkk7.com/hua/archive/2007/01/16/94238.html?/dc:creator>?/author>Tue, 16 Jan 2007 08:43:00 GMThttp://www.tkk7.com/hua/archive/2007/01/16/94238.htmlhttp://www.tkk7.com/hua/comments/94238.htmlhttp://www.tkk7.com/hua/archive/2007/01/16/94238.html#Feedback0http://www.tkk7.com/hua/comments/commentRss/94238.htmlhttp://www.tkk7.com/hua/services/trackbacks/94238.html Oracle SQL(Oracle 9i 9.2.0.1.0)
 
SQL( l构化查询语a) Q是操作关系型数据库中的对象?/strong>
DDL Q数据定义语aQ,用于或删表操作,以及对表U束q行修改?/strong>
DML Q数据操作语aQ,向表中插入纪录,修改U录?/strong>
事务控制语言Qcommit; rollback;
授权语句
 
selectQ数据的查询Q,投媄Q过滤(选择Q查寻,兌查寻Q表q接Q?/div>
 
sqlplus 讉K数据库命令(本地讉K/q程讉KQ,和数据库建立q接的命令,是数据库操作的环?/div>
sqlplus 用户?密码
 
show user 昄当前用户的用户名
 
在sqlplus中可以?! 可以在shell和sqlplus间切换,!shell命o 可以在sqlplus中用shell命o。实际上是sqlplus开了子q程来执行shell命o?/div>
 
Oracle数据库中的表分两c:用户表(用户使用操作的表Q,pȝ表(数据库系l维护的表,数据字典Q?/div>
 
select 查询语句
select table_name from user_tables;Q查询系l表Q?/div>
以上的查询语句就是查询本用户下所拥有的所有表的表名?/div>
 
desc [表名] q是一条sqlplus命oQ注意他不是sql语句Q这条命令用于查看表的结构?/div>
[字段名] [字段的类型]Q这是用完desc命o后显C的表结构?/div>
 
投媄操作Q只查看选择的字D늚信息?/div>
选择操作Q查看字D中的特定某些信息?/div>
多表查询Q通过表间q接Q查d多表中的信息
 
!oerr ora [ 错误号] Q系l可以显C错误的原因和如何修攏V?/div>
如果命o错误输入可以使用edit或ed来修改输入错误。实际上是在~辑~存文g中的最后一条sql语句。也可以使用 (change) c /错误字段/正确字段Q来q行替换操作q行修改?/div>
 
select [表的字段?],[表的字段?], ... from 表名;
select * from 表名; 查寻表中所有字D늚信息
 
关键字不{拆分,sql语句Q以及表名,字段名是大小写不敏感的?/div>
sql语句要以"Q?l尾Q来表示sql语句l束Q如果不?Q?pȝ不会执行此条sql语句Qƈ提示?/div>
sqlplus的buffer中会~存最后一条sql语句Q可以?/"来执行这最后一条sql语句Q也可以使用
edit命o来编辑最后一条sql语句。l命oQlistQ(sqlplus命oQ可以显Cbuffer中最后一条命令?/div>
 
sqlplus
set pause on 回R响应Q分屏显C,只在本会话中有效
set pause off 关闭分屏昄?/div>
set pause '...' 讄分屏昄的提CZ息?/div>
set pause on 先输出提CZ息,回R响应Q分屏显C?/div>
set head off 提头输出关闭
set feed off l尾输出关闭
set echo off 回写关闭
spool 文g?sql 写入指定文g
spool off 关闭写入?/div>
 
清屏命o !clear ?clear screen
 
在Oracle中字W显C是左对齐,数值右寚w?/div>
 
在select 语句中可以用数学表辑ּ?/div>
 
select [表达式(必须包含本表字段名)],[...],.... from 表名Q?/div>
q算的优先的先乘除后加减,同自左向右q算Q括h变优先?/div>
 
select [字段名或表达式] ["别名"]Q[...] ["..."],.... from 表名Q?/div>
 
可以通过在字D名或表辑ּ后加I格"别名"Q可以给列,或者表辑ּl果其别名?/div>
字符串拼接用||W号
 
select 目标字段名||" "||目标字段?from 表名Q?/div>
注意Q在Oracle中的字符串要?..'包含
别名中需要用空|或是大小写敏感时需要用".."包含?/div>
 
sql 脚本Q也是在文件中写有sql语句的文Ӟ可以在sqlplus中运?推荐?sql?/div>
引入sql脚本: sqlplus 用户?密码 @sql脚本(注意@前一定要有空?否则含义变?
Oracle中的I?Ig当无I大处理?/div>
Oracle中控制处理函?NVL(字段名,?Q这个字D中的空值替换ؓ指定|如果不ؓI,则会q回其原倹{?/div>
例:select (salary*12)*(NVL(commission_pct,0)/100+1) salary,first_name from s_emp;
 
distinct 关键?/strong>Q去掉重复行Q这个关键字会处发排序操作)
例: select distinct dept_id,title from s_emp;
注意QdistinctQ关键字之后会对from之前的字D进行排重操作?/div>
column 命oQ这是个sqlplus命oQ?/div>
column命o 列格式的定义
 
column 目标列名 查看q个cL否定义了格式
 
column 目标列名 format a.. 讄列宽?/div>
column last_name heading 'Employee|Name'Q设|题_ FORMAT A15
q其中的'|'是换行符
 
column salary justify left format $99,990.00Q定义数字显C格式)
注意Q如果不满昄的格式,׃把数据显CZؓ"#"
 
column 列名 clear Q清除列格式定义Q?/div>
 
注意Q只有sqlplus命o才有写,q且在用sqlplus命o时结也不能加分受?/div>
 
选择操作
 
order by 排序子句 ASCQ默认,升序Q?DESCQ降序)
 
order by 目标列名Q别名) 排序序Q不写排序顺序,会默认ؓ升序排序Q?/div>
 
例:select first_name from s_emp order by first_name;
    select first_name from s_emp order by first_name desc;
 
注意Q升序空值在l果的末,降序I值在l果的最前面?/div>
 
where 子句
 
where子句使用?select ... from ... 后面Q用来选择所需Q符合条件的Q的记录
 
where后面跟的是表辑ּ 也就?XXX=XXXQ?XXX between X and X QXXX inQXQXQXQ?/div>
like '...' 通配查询
 
between ... and ... ,表示l果在这之间Qbetween and是一个闭区间?/div>
!=Q?lt;>Q^=Q这三个都标识不{于Q?lt;=Q?gt;=Q?Q这些运符都可以用?/div>
... in (va1,val2,...) 判断l果是否在这个枚举中存在
like '...' 字符串通配查询Q?%'表示多个字符Q?_'Q表CZ个字W?/div>
... and ... 表示只有两个条g同时满
... or ... 表示条g只要满其中只一可?/div>
all ... 是要求都满条g?/div>
not .....Q则是可以与以上的条件生反效果?/div>
... is null 使用来判断值是不是I?/div>
注意QOracle中的字符串是严格区分大小写的?
 
1.注意数据cd
2.选择合适的q算W?/div>
 
Oracle 数据库函敎ͼ单行函数Q?/strong>
 
Oracle中的函数和C中的函数差不多,也是有函数名Q参数表Q和q回值类型组成的
 
1,字符函数
   字符是大写敏感?/div>
   转小?lower(...)
   转大?upper(...)
   首字母大?initcap(...)
   dual表,是专门用于函数测试和q算的,他只有一条记?span>     
   字符串拼?concat(...,....)
   求指定子?substr(...,起始位置Q取字符个数)
   可以使用"-"表示从右向左取,取的时候可以从左往友取?/div>
    例:select substr(first_name,-2,2) sub from s_emp;Q取后两个)
       select substr(first_name,2,2) sub from s_emp;Q取前两个)
2,数值函?/div>
   四舍五入 round(数据,保留数点后几位)
   可以用负数表C小数点前,0Q表C小数点后第一位,也就是保留个位,-1表示个位Q保留到?span>   位)?/div>
   例:select round(15.36,1) from dual;
   截取数字函数 trunc(数据Q保留的位数Q小数点后位敎ͼ) 截取个位之后?
   例:select trunc(123.456,1) from dual;
3Q日期函?/div>
   日期格式Q?/div>
   全日期格?世纪信息Q年月日Q时分秒?/div>
   ~省日期格式Q日-?q?dd-mon-rr
   修改当前会话的日期格式,会按照指定的格式输出日期
   alter session set nls_date_format='yyyy mm dd hh24:mi:ss';
   q回当前日期 sysdate
   例:select sysdate from dual;
   日期是格式敏感的
   求两个日期间盔R了多个?months_between(date1,date2)
   加减指定数量的月?add_months(date,月数)Q月数可以ؓ负,负值就是减ȝ应的月数?/div>
   从下周开始的日期加一?next_day(date,天数)
   例:select next_day(sysdate,2) from dual;
   q回月末的日?last_day(date)
   截取日期 trunc(date,'q或月或日或时分U?)
   例:select trunc(add_months(sysdate,1),'month') from dual;
 
4Q不同数据类型间转换函数
   日期{成字W?tochar(date,'日期格式')
   日期格式要用有效格式Q格式大写敏感 'yyyy mm dd hh24:mi:ss','year'(全拼的年),'mm'(数字表示的月) 'month'(全拼的月)Q?day'(星期的全?Q?ddspth' (日期的全? 'yy mm dd'
   例:select to_char(sysdate,'yyyy mm dd hh24:mi:ss')from dual;
   字W{换成数字 to_number('...')
   数字{字符to_char(numberQ?fmt') fmt是数字格?/div>
   字W串转成日期 to_date('...','日期格式')
   例:select to_char(to_date('2006 11 03','yyyy mm dd'),'dd-month-yy') from dualQ?/div>
5Q函数嵌?/div>
例:select to_char(to_date('2006 11 03','yyyy mm dd'),'dd-month-yy') from dualQ?/div>
 
表连接(兌查寻Q?/strong>
如果多表查询时不加where子句Q也是qo条g或者是使用了无效的条gQ就会生两表之间记录的怺逐条匚wQ组合)Q生很多无效的l果Q笛卡尔U)?/div>
注意Q在使用表连接时Q要注意查询的表间的关系信息Q表之间的字D|表示的信息的关系
{D?/div>
 select [表别?.字段?]Q[表别?.字段?],...
 from ? 表别? Q表2 表别?
 where 表别?.字段?=表别?.字段?;
 表连接时Q当表与表之间有同名字段Ӟ可以加上表名或表的别名,加以区分Q用时要用
表名.字段名或表别?字段名(列名Q。当表的字段名是唯一Ӟ可以不用加上表名或表的别名?/div>
注意Q当起了别名Q就不能再用表?字段?/div>
例:select a.first_name,a.last_name,b.name from s_emp a,s_dept b where a.dept_id=b.id;
 
非等D?/strong>
 select [表别?.字段?]Q[表别?.字段?],...
 from ? 表别? Q表2 表别?
 where 表别?.字段? ..... 表别?.字段?
 ....可以使比较运符Q也可以使其他的除了'='的运符
例:select e.ename, d.grade,e.sal from emp e,salgrade d where e.sal between d.losal and d.hisal;
 
自连?/strong> 用别名把一张表中的数据分成两部分,然后在用条件过滤?/div>
 select [表别?.字段?]Q[表别?.字段?],...
 from ? 表别? Q表1 表别?
 where 表别?.字段?=表别?.字段?;
例:select a.first_name ename,b.first_name cname from s_emp a,s_emp b where a.manager_id=b.id;
以上所提到的表q接Q都叫做内连接?/strong>
 
 
外连?/strong> 会用一方表中的所有记录去和另一D中的记录按条件匹配,Ig会匹配,q个表中的所有记录都会显C,数据库会模拟录去和那些不匚w的记录匹配?/div>
例:select a.first_name enamei,a.id,b.first_name cname,b.id from s_emp a,s_emp b where a.manager_id=b.id(+);
注意Q要把那一方的记录全部都显C出来,q有注意条g(+)跟在要全部显C的那个表的字段后?/div>
 
l函?/strong>
group l?
group by 分组子句Q按指定的分l规则分l?Q这个group by 子句可以跟在 select 语句后或?having后面。group by子句也会出发排序操作Q会按分l字D|序?/div>
 
select [l函数或分组的字D名] Q?.. from 表名 group by [字段?],[字段?],.....Q?/div>
例:select avg(salary) from s_emp group by dept_id;
 
注意Q组函数可以处理一l数据,q回一个倹{组函数会忽略空倹{count()除外Q他会把I录也记录在内?/div>
 
avg(..),求^均|sum(..),求和 q两个函数的参数只能是number型的?/div>
 
以下所提到的函数可以用Q意类型做参数?/div>
count(..)Q用来统计记录数Q可以用排重命令。count(...)默认使用的是all?/div>
max(..),min(..)求最大值和最|
count(*),l计表中记录数?/div>
例:select max(b.name),avg(a.salary), max(c.name) from s_emp a,s_dept b,s_region c where a.dept_id=b.id and b.region_id=c.id group by b.id;
注意Q只要写了group by子句Qselect后就只能用group by后的字段或者是l函数?/div>
      where子句只能够过滤记录?/div>
having子句可以qol函数结果或是分l的信息Q且写在group by子句后?/div>
?
 select max(b.name),avg(a.salary), max(c.name) from s_emp a,s_dept b,s_region c where a.dept_id=b.id and b.region_id=c.id group by b.id having sum(a.salary)>4000;
 
column 也可以定义有别名的列的格式?/div>
column "别名" 格式定义
注意Q要先过滤掉不需要的记录Q然后再q行分组操作Q提高效率?/div>
 
子查?/strong>
子查询,是可以嵌在M的sql语句中的select语句?/div>
 
在select语句中嵌套子查询Ӟ会先执行子查询。一般的会将子查询放在运符的右辏V?/div>
 
注意Q在使用子查询时Q要注意q个q算W是单行的(也就是只能是单|Q还是多行运符Q范_多|。配合用子查询q回的结果必ȝ合运符的用法?/div>
?
select first_name,title from s_emp where title=any(select title from s_emp where last_name='Smith') and upper(last_name)!='SMITH';
 
select first_name,title from s_emp where title in (select title from s_emp where last_name='Smith') and upper(last_name)!='SMITH';
 
数据库设?/strong>
 
数据库表设计Q把业务需求{换成可操作的表?/div>
1Q需求分析,了解客户的业务需求(业务技能)?/div>
2Q设计,通过ER图(实体关系图)
3Q徏?/div>
4Q测?/div>
5QŞ成?/div>
 
ER ?/strong>
一cM物的共性抽象处来成Z个实体,q且表现出来实体间的关系?/div>
unique identifier 唯一的?/div>
primary with     '#*' 唯一且非I?/div>
indispensable 必要的(也就是要求必非I)
 
实体关系
one to one 一对一兌Qone to many 一对多兌Qmany to many 多对多关?/div>
反射兌Q自w的属性之间的兌
 
ER 图{换成?/strong>
 
 
W一范式Q所有的属性都必须是单|也就是属性只表示单一的意义。(记录可以重复Q没有Q何限Ӟ
W二范式Q属性要求唯一且非I,Q记录不可重复,但是数据可能会出现冗余)?/div>
W三范式Q非d性只能依赖于d性,不能依赖于其他非d性。(解决数据冗余问题Q?/div>
 
U束
U束是针对表中的字段q行定义的?/div>
 
primary key Q主键约?PKQ保证实体的完整性,保证记录的唯一
主键U束Q唯一且非I,q且每一个表中只能有一个主键,有两个字D联合作Z键,只有两个字段攑֜一起唯一标识记录Q叫做联合主键?/div>
 
foreign key Q外建约?FKQ保证引用的完整性,
外键U束Q外键的取值是受另外一张表中的主键或唯一值得U束Q不能够取其他|只能够引用主键会唯一键的|被引用的表,叫做parent tableQ父表)Q引用方的表叫做child tableQ子表)Q要惛_建子表,p先创建父表,后创建子表,记录的插入也是如此,先父表后子表Q删除记录,要先删除子表记录Q后删除父表记录Q要修改记录Q如果要修改父表的记录要保证没有被子表引用。要删表Ӟ要先删子表,后删除父表?/div>
 
unuque keyQ唯一键)Qgؓ唯一
 
indexQ烦引)是数据库Ҏ的一cd象,viewQ视图)
典型的一对多 class 对应多个学生?/div>
student table                      class table
 ______________________________     _________________________
| id | name | address| class_id|   | id |class_desc|class_num|
|(PK)|______|________|___(FK)__|   |(pk)|__________|_________|
|    |      |        |         |   |    |          |         |
 
一对一
 
student tabel             shenfenzheng table
 ____________________     _________________________________
| id | name | address|   | s_id |shenfen_desc|shenfen_num|
|(PK)|______|________|   |(PKQFK)|____________|___________|
|    |      |        |   |        |            |           |
 
多对?/strong>
 
student tabel             zhongjian table                      kecheng table
 ____________________     _________________________________    __________________
| id | name | address|   | s_id |shenfen_desc|shenfen_num| | kid | kechengname|
|(PK)|______|________|   |(FKQFK)|____________|___________| | (PK)|____________|
|    |      |        |   |联合主键|            |           | |     |            |
 
引用Ҏ表的主键,当作本n的主?所以这个表的主?既是主键又是外徏
 
和其他相x?/div>
 
DDL 语句
 
创徏表:
   create    table 表名   (    字段?    cd(数据长度)(default ...)   U束条gQ?span>   字段?    cd(数据长度)    U束条g );
 
Oracle 数据库中的数据类?/strong>
varchar(长度)Q可变长字符Ԍchar(长度) 定长
number(..,..),number 表示点敎ͼ或者是整数
long 大对象,clog 字符的大对象Q相当于文本文g在表中只存放一个相当于只针对?
             blog 二进制的大对象,也是以相当于指针的Ş式存攄?/div>
primary keyU束Q?/div>
主键U束的定义:
W一U定义Ş式:
create table   test(c number primary key );     列U束
W二U定义Ş式:
create table test(c number , primary key(c) ) ; 表U束
create table   test( c1 number constraints   pkc1 primary key );   此约束有名字: pkc1
create table   test(c number , c2 number , primary key (c ,c1) ); 用表U约束可以实现联合主?/div>
 
foregin key   (fk)   外键U束:
(先定义父表,再定义子表)
carete   table     parent(c1 number primary key );
create   table    child (c number primary key ,   c2 number references parent(c1));
或表U约束定?
create   table child( c number primary key , c2 number , foreign key(c2) references parent(c1));
 
U束
 
非空U束Qnot nullQ这是一个列U约?/div>
在徏表时,在数据类型的后面加上 not null Q也是在插入时不允许插入空倹{?/div>
 
例:create table student(id number primary key,name varchar2(32) not null,address varchar2(32));
 
unique 唯一U束
 
唯一U束Q是会忽略空值的Q唯一U束Q要求插入的记录中的值是Z的?/div>
 
例:create table student(id numberQname varchar2(32),address varchar2(32),primary key (id),unique (address));
 
checkU束
 
查约束,可以按照指定条gQ检查记录的插入。check中不能用尾列,不能使用函数Q不能引用其他字Dc?/div>
例:create table sal (a1 number , check(a1>1000));
 
创徏脚本   例:见课本相应章?/div>
 
 
 
一对一语句
 
student table
 
create table student(
       id number,
       name varchar2(32),
       address varchar2(32)
       primary key(id)
);
 
shenfenzheng table
 
create tabel shenfenzheng(
       sid number primary key,
       num number unique not null,
       foreign key (sid) references student(id)
);
 
一对多
 
class table
create table class(
        cid number,
        class_num number,
        desc varchar2(32),
        primary key(cid)
);
 
student table
?/div>
create table student(
       id number,
       name varchar2(32),
       address varchar2(32)
       class_id number,
       primary key(id),foreign key (class_id) references class(cid)
);
 
 
 
 
 
数据字典
 
数据字典是由pȝl护的,包含的数据库的信?/div>
数据字典视图
user_XXXXX 用户视图
all_XXXXX 所有视?/div>
dba_XXXXX 数据库中所有视?/div>
v$_XXXXX   动态性能视图
 
dist?distionary 表示数据字典的数据字典?/div>
 
user_constraints 用户的表中约束的?/div>
其中有constraints_name字段存放的是U束名,r_constraints_name字段表示外键引用子何?/div>
q两个字D之间有自连接的关系Q也是U束名和外键U束名之间的自连接?/div>
 
user_cons_column表,是用L列U束?/div>
 
DML 操作
 
insert 操作Q插入记?/strong>
 
insert into 表名 values(?Q?Q?.....);
注意q种Ҏ插入记录Ӟ要对所有字D进行插入,没有非空U束Ӟ又不x入值时Q要用空值替代,q且要按照字D늚序插|要清楚表l构Q,且要注意数据cd一致?/div>
 
insert into 表名(字段?Q字D名2Q?....) values(?Q?Q?.....);
q种Ҏ可以Ҏ定的字段q行插入Q不x值的可以不写,前提是该字段没有非空U束?/div>
 
例:insert into student values(1,'xxx','xxx');
    insert into student(id,name,address) values(1,'xxx','xxx');
 
update 修改操作
 
update table 表名 set 字段?=数据1或表辑ּ1Q?字段?=数据2或表辑ּ2
[where ....=....];
例:update shenfenzhen set num=99 where sid=2;
 
delete 删除操作
 
delete from 表名 [where ...=...];
例:update shenfenzhen set num=99 where sid=2;
用delete操作删除的记录可以通过 rollback命o回滚操作Q会恢复delete操作删除的数据?/div>
delete操作不会释放表所占用的空_delete不是和删除记录多的大表。delete操作会占用大量的pȝ资源?/div>
事务transaction
 
OLTPQ?strong>联机事务处理 OnLine Transaction ProcessQ?/div>
原子操作Q也是不可分割的操作,必须一h功一起失败?/div>
要是实现一个原子操作,p把这个原子操作(操作数据库数?DML操作)Q放在事务中?/div>
事务的结束动?是commit;语句 rollback;语句QDDLQDCL语句执行会自动提交commit;?/div>
sqlplus正常退出是会做提交动作的commit;Q当pȝ异常推出是,会执行回滚操作rollback;?/div>
事务的开始,一个事务的开始就是上一个事务的l束?/div>
一个没有结束的事务Q叫做活动的事务 (active transaction),zd的事务中修改的数据,只有本会话才能看见?/div>
readcommitedQ只可以d已经作提交操作的数据Q本会话可以看到自己的所作的没有提交的操作?/div>
在活动事务中Q当多个用户同时对同一张表q行操作Ӟ会对表加上表U共享锁Q当用户Ҏ作该表某一条记录进行操作时会对该条记录加上行排它锁,只允怸个用户对该条记录q行DML操作Q只有提交操作commit;或回滚操作rollback;Ӟ才可让其他用h作对该记录进行DML操作Q也是释放了该条记录的行排它锁。如果没有提交操作或回滚操作Q那么该用户׃能对该条记录加锁Q该用户的DML操作׃q入{待状态,但是在对表作drop操作QDDL操作Q时Q如果还有用户在操作该表Q也是没有释放表׃n锁,׃直接报错?/div>
 
事务大Q就会消耗更多的资源Qƈ长时间持有事务会造成无法q行其他的操作,事物提交太频J的话,会对I/O造成很大的负担,所以要合理定事务的大?/div>
 
commit;提交操作Q事物的l束
 
rollback;回滚操作Q会先前的zd事务中的操作QDML操作Q的l果q行回滚Q撤销全部操作Q恢复成事务开始时的数据,也就是恢复成事务开始时的状态?/div>
 
alter table 命o
alter table 命o用于修改表的l构(q些命o不会l常?Q?/div>
 
增加字段Q?/div>
alter table 表名 add(字段字,字段cd)
 
删除字段Q?/strong>
alter tbale 表名 drop column 字段; (8i 以后才支?
 
l列改名:9.2.0才支?/div>
alter table 表名 rename column 旧字D名 to 新字D名;
 
修改字段
alter table 表名 modify( 字段Q类?
(此时应注意的问题Q更Ҏ要看具体值情况之间的转达换, 改ؓ字符cdӞ必须要ؓI?
not nullU束是用alter table .. modify (..,not null)Q来加上的?/div>
增加U束Q?/div>
alter table 表名 add constraint [U束名] U束(字段);
只能够增加表U约束?/div>
 
解除U束Q?删除U束)
 
alter table 表名 drop U束;
Q对于主键约束可以直接用此方法,因ؓ一张表中只有一个主键约束名, 注意如果主键此时q有其它表引用时删除主键时会出错Q?/div>
 
alter table father drop primary key cascade; 
(如果有子表引用主键时Q要用此语法来删除主?q时子表q存在只是子表中的外键约束被及联删除了)
 
alter table 表名 drop constraint U束?
(怎样取一个约束名Q?/div>
a、h为的q反U束规定Ҏ错误信息获取!
b、查询视图获取约束名!)
 
使约束失效或者生?/div>
 
alter table 表名 disable from primary key; (相当于把一个表的主键禁?
 
alter table 表名 enable primary key;
Qenable 时会自动L查表的记录是不是W合要求,如果有脏数据时必要先删除脏数据才可?enableQ?/div>
 
更改表名
rename 旧表?to 新表?
 
删除?/strong>Q?/div>
trucate table 表名;
(表结构还在,数据全部删除Q释放表所占的I间Q不支持回退,常用删除大表)
 
关于oralce中生序?sequence)
create sequence 序列?
 
(不带参数旉认ؓ? 开始每ơ递增 1Qoracle中ؓ了提高生序列的效率一般一ơ性?0个序列放入当前会话的序列池中备用以加快效率,序列会出Cq箋的动作回退操作不会影响序列取?
 
 
 
sequence 的参敎ͼ
increment by n   起始?/div>
start with n     递增?
maxvalue n       最大值?/div>
minvalue n       最?/div>
cycle|no cycle   轮回 
cache n          ~存(W一ơ取时会一ơ取多少个id存v?
 
查看sequence 视图Q?/div>
desc    user_sequences ;
select   sequence_name , cache_size , last_number from user_sequences   where   sequence_name like 's_';
select 序列?currval from   dual    查看当前的序列数
select 序列?nextval  from   dual    查看下一个序列数Q它会自动给当前的序列加Q?/div>
为列Qnextval          currval
(开另一个session时取当前g成功Ӟ应该先取下一个|再取当前?
 
清空当前会话的内存:
alter system flush   shared_pool;Q执行此命o要有DBA权限Q一般用h行出错)
 
修改序列Q?此命令不常用Q只需了解p不必q)
alter sequence 序列名 修攚wQ?/div>
删除序列sequence
drop sequence 序列?
 
视图
 
创徏视图Q?
creating views 视图?
 
视图q当于一条select 语句,定义了一个视囑ְ是定义了一个sql语句,视图不占I间,使用view 不会提高性能Q但是能单化sql语句
Q扩展知识: oracle 8i 以后的新视图Q?/div>
MV 物化视图(占存储空_把select l果存在一个空_会提高查询视?增强实时性,但是存在h问题Q物化视图中的数据存在gq问题,主要应用在数据仓库中用要用于聚合?
 
使用视图的好处:控制数据讉K权限?/div>
 
如何创徏一个视囄例子Q?/div>
create or replace views test_vi as select * from test1 where c1=1;
 
or replace的意义,如果view存在p盖,不存在才创徏?/div>
force|no force Q基表存在是使用Q不存在是则创徏该表?/div>
此时往表test1Qbase table Q中插入数据Ӟ表中没能变化Q视图中的数据发生改?/div>
从视图中插数据时相对应的表会发生改变:
往视图中插数据Ӟ会直接插q基表中Q查看视图中的数据时Q相当于是执行创徏时的select语句?/div>
 
限制Ҏ据库的访问,化查询?/div>
单视图:来自于单表,且select语句中不能包括函敎ͼ能进行DML操作?/div>
复杂视图Q来源于多张表,不能执行DML操作?/div>
 
视图的约?/div>
with read only 视图只读U束(O)
with check option 不允许插入与where条g不符的记录,cM于checkU束的功?V)
 
在select from 后也可以使用子查寻,q个写法也叫做内嵌视?/div>
例:
select first_name,salary,avgsal from s_emp e,(select dept_id,avg(salary) avgsal from s_emp group by dept_id) s where e.dept_id=s.dept_id and e.salary>s.avgsal;
 
删除视图 drop views 视图?
 
行号Qrownum Q?/strong>
关于rownumQ?/div>
rownum 有个特点要么{于1 要么于某个| 不能直接{于某个? 不能大于某个倹{?/div>
rownum常用于分|C?/div>
rownum只用于读入内存的数据?/div>
 
关于同义?/strong>Q?/div>
 
同义?相当于别名的作用(***只需了解***Q系l自建的同义?
user_tables
 
create synonym asd_s_emp for asd_0606.s_emp ;
目的是Zlasd_0606_s_emp表v另一个代替的名称asd.s_emp;注意q个同义词只能自׃?
create public synonym p_s_emp fro asd_0606.s_emp; 创徏公共的同义词Q但是要权限.
删除同义词:
drop synonym    同义词名U?/div>
 
索引Qindex Q?/strong>
 
创徏索引QCreating indexes(概念很重要对pȝ的性能影响非常大)
 
建烦引的目的是Z加快查询速度?/div>
 
索引q于一本的书的目录。烦引点pȝI间Q属于表的附属物。删除一个表Ӟ相对应的索引也会删除。烦引是会进行排序?/div>
 
truncate 表时索引l构在,但是数据不存在?/div>
 
full table scan 全表扫描
用烦引就是ؓ了快速定位数据:(理解时就以字典的目录Z)
创徏索引是创徏key和记录的物理位置QrowidQ组成的键值对。烦引是有独立的存储I间,但是和表是逻辑兌?索引和表的关pL依附关系,表被删除?索引也没有存在的意义也就被删除了
 
在徏表时会根据表中的PK或UK自动的徏立唯一性烦引?/div>
 
查看表的rowidQ?/div>
select rowid,first_name from s_emp;
rowid 定义的信息有Qobject block table
 
每条记录都有自己的rowid
 
索引p创徏Q用?建烦引后会DML操作效率慢,但是对用h询会提高效率,q就是我们徏索引的最l目的?/div>
 
创徏一个烦引:
create index 索引?on 表名 (字段?;
create insex testindex on test(c1, c2);
 
索引分ؓ唯一性烦引,联合索引。烦引中是不会维护空值的?/div>
 
哪些字段应该建烦引:创徏索引是Z减少物理读,索引会减扫描的旉?/div>
l常要用where的子句的地方Q所以要用烦?用不用烦引,关键要看所查询的数据与所有数据的癑ֈ比,表越大,查询的记录越,索引的效率就高.
 
替换变量Q用&W号来定义替换变量支持交互性提C?对于字符性的数字Q一定要写在单引号之?/div>
 
更改交互的提CZ息:
accept p_dname prompt ' 提示信息';
定义变量Q?/div>
define p_dname='abc';
 
set    verify on
set    verify off;
相当于开兛_量,用于控制是否昄新旧的sql语句
select id,last_name,salary from s_emp where title='&job_title';


]]>关ORACLE Cursor的问题ORA-01000: maximum open cursors exceededhttp://www.tkk7.com/hua/archive/2007/01/09/92642.html?/dc:creator>?/author>Tue, 09 Jan 2007 08:46:00 GMThttp://www.tkk7.com/hua/archive/2007/01/09/92642.htmlhttp://www.tkk7.com/hua/comments/92642.htmlhttp://www.tkk7.com/hua/archive/2007/01/09/92642.html#Feedback0http://www.tkk7.com/hua/comments/commentRss/92642.htmlhttp://www.tkk7.com/hua/services/trackbacks/92642.html java.sql.SQLException: ORA-01000: maximum open cursors exceeded at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134) at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289) at oracle.jdbc.ttc7.Oopen.receive(Oopen.java:120) at oracle.jdbc.ttc7.TTC7Protocol.open(TTC7Protocol.java:614) at oracle.jdbc.driver.OracleStatement.open(OracleStatement........
 

Cause: A host language program attempted to open too many cursors. The initialization parameter OPEN_CURSORS determines the maximum number of cursors per user.

Action: Modify the program to use fewer cursors. If this error occurs often, shut down Oracle, increase the value of OPEN_CURSORS, and then restart Oracle.

 
 
关于cursor 的参数有q么几个Q?/div>
SQL> show parameter cursor
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
cursor_sharing                       string      EXACT
cursor_space_for_time                boolean     FALSE
open_cursors                         integer     800
session_cached_cursors               integer     0
 
q里Qcursor_sharing跟open_cursors的数量没有关pRopen_cursors的数量,它包括了oracle服务器端session_cached_cursors的数量,以及应用服务器端cursor cache size的数量?/div>
 
关于session_cached_cursorsq个参数Q可以看 汪v 写的2文章:
 
 
q个问题的根源,除了上面3个参敎ͼ主要在于E序的问题,在itpub 上我们可以看刎ͼ
  
很多朋友在Java开发中Q用Oracle数据库的时候,l常会碰到有ORA-01000: maximum open cursors exceeded.的错误?br />
实际上,q个错误的原因,主要q是代码问题引v的?
ora-01000: maximum open cursors exceeded.
表示已经辑ֈ一个进E打开的最大游标数?

q样的错误很Ҏ出现在Java代码中的主要原因是:Java代码在执行conn.createStatement()和conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor。尤其是Q如果你的createStatement和prepareStatement是在一个@环里面的话,׃非常Ҏ出现q个问题。因为游标一直在不停的打开Q而且没有关闭?br />
一般来_我们在写Java代码的时候,createStatement和prepareStatement都应该要攑֜循环外面Q而且使用了这些Statment后,及时关闭。最好是在执行了一ơexecuteQuery、executeUpdate{之后,如果不需要用结果集QResultSetQ的数据Q就马上Statment关闭?br />
对于出现ORA-01000错误q种情况Q单U的加大open_cursorsq不是好办法Q那只是L不治本。实际上Q代码中的隐患ƈ没有解除?
而且Q绝大部分情况下Qopen_cursors只需要设|一个比较小的|p够用了Q除非有非常特别的要求?/span>
 

如果你不使用q接池,那么没有什么问题,一旦Connection关闭Q数据库物理q接p释放Q所有相关Java资源也可以被GC回收了?

但是如果你用连接池Q那么请注意QConnection关闭q不是物理关闭,只是归还q接池,所以PreparedStatement和ResultSet都被持有Qƈ且实际占用相关的数据库的游标资源Q在q种情况下,只要长期q行Q往往׃报“游标超出数据库允许的最大值”的错误Q导致程序无法正常访问数据库?


---


q个关不兛_使用不用conn pool没有关系Q一般操作是会是q样Q线E从外界获取一个connQ然后创己地stmt,rs,然后执行逻辑操作Q然后将connq回lpool?如果E序员忘记手动关地话。当q个U程执行完以后,stmtQrs都成垃圾Q当他们被垃圾搜集地时候,gc会替我们把它们给关闭地。这是很多代码没有关闭Q仍然正常运行?
但是q样会有一个潜在地问题。就是gc无法定什么时候运行。如果free地内存很多,很可能有些gc׃会被启动Q这样stmtq迟没有被关闭,执行一D|间会报错?
所以健壮地代码应该手工把rs,stmt都关?/p>

---


Javaq结Oracle常犯错误
1。只?createStatement,不懂关闭statement

2.。只?createStatement,不懂preparedStatement.

3 。只懂在sql里用to_date,甚至直接用StringQ不懂用 setDate()

---

我记?我的E序中也出现q这U问?
主要原因是我get Connection 对象?q个connectin没有被进行关?
同时q行出来?preparedStatement 对象,不关闭也会出现这U问?
而且,推荐q些数据库操作的变量量用局部变?现用现取,随时关闭,而且攑֜finally{}中进行关?比较保险

---

通常這樣的情形是你用了過DBa定同時可用的connection敔R
你可以試試看下列方式:
1. 若你使用connection pool, 你可以將connection pool的max connection
敔R降低看看, 同時檢查有無歔Rconnection
2. 若未使用conneciton pool, 你就該檢查一? 你的connection在用過?
有沒有關閉囉

另外一E情形是: 你的pȝ使用量真的很? 所以同?50的DB connection
session是不夠的, 你就需要調整Oracle DB?

通常的jdbc代码:
...
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement();
rs = stmt.executeQuery('select xx from yy');
...
} catch (SQLExeption e) {
e.printlStackTrace();
} finally {
if (stmt != null) {
try {stmt.close();} catch (SQLException e) { }
}
}



]]>Oracle数据库字W集问题ȝhttp://www.tkk7.com/hua/archive/2006/09/22/71265.html?/dc:creator>?/author>Fri, 22 Sep 2006 02:54:00 GMThttp://www.tkk7.com/hua/archive/2006/09/22/71265.htmlhttp://www.tkk7.com/hua/comments/71265.htmlhttp://www.tkk7.com/hua/archive/2006/09/22/71265.html#Feedback0http://www.tkk7.com/hua/comments/commentRss/71265.htmlhttp://www.tkk7.com/hua/services/trackbacks/71265.html在不同数据库做数据迁UR同其它pȝ交换数据{,常常因ؓ字符集不同而导致迁Ud败或数据库内数据变成q。现在我oracle字符集相关的一些知识做个简单ȝ

一、什么是oracle字符?/b>

Oracle字符集是一个字节数据的解释的符号集?有大之?有相互的包容关系。ORACLE 支持国家语言的体pȝ构允怽使用本地化语a来存储,处理Q检索数据。它使数据库工具Q错误消息,排序ơ序Q日期,旉Q货币,数字Q和日历自动适应本地化语a和^台?

影响oracle数据库字W集最重要的参数是NLS_LANG参数。它的格式如?

    NLS_LANG = language_territory.charset	                              

它有三个l成部分(语言、地域和字符?Q每个成分控制了NLS子集的特性。其?

Language 指定服务器消息的语言Qterritory 指定服务器的日期和数字格式,charset 指定字符集。如:AMERICAN _ AMERICA. ZHS16GBK

从NLS_LANG的组成我们可以看出,真正影响数据库字W集的其实是W三部分。所以两个数据库之间的字W集只要W三部分一样就可以怺导入导出数据Q前面媄响的只是提示信息是中文还是英文?

二、如何查询Oracle的字W集

很多人都到q因为字W集不同而数据导入p|的情c这涉及三方面的字符集,一是oracel server端的字符集,二是oracle client端的字符?三是dmp文g的字W集。在做数据导入的时候,需要这三个字符集都一致才能正导入?

1、查询oracle server端的字符?/b>

有很多种Ҏ可以查出oracle server端的字符集,比较直观的查询方法是以下q种:

   SQL>select userenv(‘language? from dual

l果cM如下:AMERICAN _ AMERICA. ZHS16GBK

2、如何查询dmp文g的字W集

用oracle的exp工具导出的dmp文g也包含了字符集信息,dmp文g的第2和第3个字节记录了dmp文g的字W集。如果dmp文g不大Q比如只有几M或几十MQ可以用UltraEdit打开(16q制方式)Q看W?W?个字节的内容Q如0354Q然后用以下SQL查出它对应的字符?

   SQL> select nls_charset_name(to_number('0354','xxxx')) from dual;    
   ZHS16GBK

如果dmp文g很大Q比如有2G以上(q也是最常见的情?Q用文本~辑器打开很慢或者完全打不开Q可以用以下命o(在unixL?:

   cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6          	

然后用上qSQL也可以得到它对应的字W集?

3、查询oracle client端的字符?/b>

q个比较单。在windowsq_下,是注册表里面相应OracleHome的NLS_LANG。还可以在dosH口里面自己讄Q比?

   set nls_lang=AMERICAN_AMERICA.ZHS16GBK						

q样只影响q个H口里面的环境变量?

在unixq_下,是环境变量NLS_LANG?

																   $echo $NLS_LANG
   AMERICAN_AMERICA.ZHS16GBK    							
														

如果查的l果发现server端与client端字W集不一_L一修改为同server端相同的字符集?

三、修改oracle的字W集

上文说过Qoracle的字W集有互相的包容关系。如us7ascii是zhs16gbk的子?从us7ascii到zhs16gbk不会有数据解释上的问?不会有数据丢失。在所有的字符集中utf8应该是最?因ؓ它基于unicode,双字节保存字W?也因此在存储I间上占用更??

一旦数据库创徏后,数据库的字符集理Z讲是不能改变的。因此,在设计和安装之初考虑使用哪一U字W集十分重要。根据Oracle的官方说明,字符集的转换是从子集到超集受支持,反之不行。如果两U字W集之间Ҏ没有子集和超集的关系Q那么字W集的{换是不受oracle支持的。对数据库server而言Q错误的修改字符集将会导致很多不可测的后果,可能会严重媄响数据库的正常运行,所以在修改之前一定要认两种字符集是否存在子集和集的关pR一般来_除非万不得已Q我们不修改oracle数据库server端的字符集。特别说明,我们最常用的两U字W集ZHS16GBK和ZHS16CGB231280之间不存在子集和集关系Q因此理Z讲这两种字符集之间的怺转换不受支持?

1、修改server端字W集(不徏议?

在oracle 8之前Q可以用直接修改数据字典表props$来改变数据库的字W集。但oracle8之后Q至有三张pȝ表记录了数据库字W集的信息,只改props$表ƈ不完全,可能引v严重的后果。正的修改Ҏ如下:

   $sqlplus /nolog
   SQL>conn / as sysdba                                                         

若此时数据库服务器已启动Q则先执行SHUTDOWN IMMEDIATE命o关闭数据库服务器Q然后执行以下命?

    SQL>STARTUP MOUNT;
    SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
    SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
    SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
    SQL>ALTER DATABASE OPEN;
    SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;
    SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK;
    SQL>SHUTDOWN IMMEDIATE;
    SQL>STARTUP

2、修改dmp文g字符?/b>

上文说过Qdmp文g的第2W?字节记录了字W集信息Q因此直接修改dmp文g的第2W?字节的内容就可以‘骗’过oracle的检查。这样做理论上也仅是从子集到集可以修改Q但很多情况下在没有子集和超集关pȝ情况下也可以修改Q我们常用的一些字W集Q如US7ASCIIQWE8ISO8859P1QZHS16CGB231280QZHS16GBK基本都可以改。因为改的只是dmp文gQ所以媄响不大?

具体的修Ҏ法比较多Q最单的是直接用UltraEdit修改dmp文g的第2和第3个字节。比如想dmp文g的字W集改ؓZHS16GBKQ可以用以下SQL查出该种字符集对应的16q制代码:

   SQL> select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;
   0354                                                 			

然后dmp文g??字节修改?354卛_?

如果dmp文g很大Q用ue无法打开Q就需要用E序的方法了。网上有人用java存储q程写了转换的程?用java存储q程的好处是通用性教好,~点是比较麻?。我在windows下测试通过。但要求oracle数据库一定要安装JVM选项。有兴趣的朋友可以研I一下程序代?



]]>
MySQL入门学习 http://www.tkk7.com/hua/archive/2006/08/25/65734.html?/dc:creator>?/author>Fri, 25 Aug 2006 03:51:00 GMThttp://www.tkk7.com/hua/archive/2006/08/25/65734.htmlhttp://www.tkk7.com/hua/comments/65734.htmlhttp://www.tkk7.com/hua/archive/2006/08/25/65734.html#Feedback0http://www.tkk7.com/hua/comments/commentRss/65734.htmlhttp://www.tkk7.com/hua/services/trackbacks/65734.html 

安装?

PHP+MySQL+Linux目前已逐渐成ؓ型web服务器的一U经典组合。在indows环境下构{和调试MySQL数据库是许多|站开发者的一U首选。本人在Windows98环境下初学MySQLQ现学习过E与l验ȝ出来供大家参考?

1、下载mysql-3.23.35-win.zipq解压;

2、运行setup.exe;选择d:\mysql,"tyical install"

3、启动mysqlQ有如下ҎQ?

Ҏ一Q用winmysqladmin
1)、进入d::\mysql\bin目录Q运行winmysqladmin.exeQ在屏幕右下角的d栏内会有一个带U色的图W?
2)、鼠标左键点击该囄Q选择“show me”,出现“WinMySQLAdmin”操作界面;首次q行时会中间会出C个对话框要求输入q设|你的用户名和口?
3)、选择“My.INI setup?
4)、在“mysqld file”中选择“mysqld-opt?win9x)或“mysqld-nt?winNT)
5)、选择“Pick-up or Edit my.ini values”可以在双H口内对你的my.ini文gq行~辑
6)、选择“Save Modification”保存你的my.ini文g
7)、如果你惛_速用winmysqladmin(开机时自动q行Q,选择“Create ShortCut on Start Menu?
8)、测试:
q入DOS界面Q?
在d:\mysql\bin目录下运行mysqlQ进入mysql交互操作界面
输入show databasesq回车,屏幕昄出当前已有的两个数据库mysql和test

Ҏ二:不用winmysqladmin
1)、在DOSH口下,q入d:/mysql/bin目录
2)、win9X?q行:
mysqld
在NT下运?
mysqld-nt --standalone
3)、此后,mysql在后台运?
4)、测试mysql:Q在d:/mysql/bin目录下)
a)、mysqlshow
正常时显C已有的两个数据库mysql和test
b)、mysqlshow -u root mysql
正常时显C数据库mysql里的五个表:
columns_priv
db
host
tables_priv
user
c)、mysqladmin version status proc
昄版本受状态、进E信息等
d)、mysql test
q入mysql操作界面Q当前数据库为test
5)、mysql关闭ҎQ?
mysqladmin -u root shutdown

4、至此,MySQL已成功安装,接着可以熟悉MySQL的常用命令ƈ创徏自己的数据库了?

入门?

上篇讲了如何安装q测试MySQLQ环境徏好后可以l我们的学习了。本主要熟悉一写常用命令?

1、启动MySQL服务?
实际上上已讲到如何启动MySQL。两U方法:
一是用winmysqladminQ如果机器启动时已自动运行,则可直接q入下一步操作?
二是在DOS方式下运?
d:mysqlbinmysqld

2、进入mysql交互操作界面
在DOS方式下,q行Q?
d:mysqlbinmysql
出现:
mysql
的提C符Q此时已q入mysql的交互操作方式?
如果出现 "ERROR 2003: Can´t connect to MySQL server on ´localhost´ (10061)“,
说明你的MySQLq没有启动?

3、退出MySQL操作界面
在mysql>提示W下输入quit可以随时退Z互操作界面:
mysql> quit
Bye
你也可以用control-D退出?

4、第一条命?
mysql> select version(),current_date();
+----------------+-----------------+
| version() | current_date() |
+----------------+-----------------+
| 3.23.25a-debug | 2001-05-17 |
+----------------+-----------------+
1 row in set (0.01 sec)
mysql>

此命令要求mysql服务器告诉你它的版本号和当前日期。尝试用不同大小写操作上q命令,看结果如何?
l果说明mysql命o的大写l果是一致的?
l习如下操作Q?
mysql>Select (20+5)*4;
mysql>Select (20+5)*4,sin(pi()/3);
mysql>Select (20+5)*4 AS Result,sin(pi()/3); (AS: 指定假名为Result)

5、多行语?
一条命令可以分成多行输入,直到出现分号“;”ؓ止:
mysql> select
-> USER()
-> ,
-> now()
->;
+--------------------+---------------------+
| USER() | now() |
+--------------------+---------------------+
| ODBC@localhost | 2001-05-17 22:59:15 |
+--------------------+---------------------+
1 row in set (0.06 sec)
mysql>
注意中间的逗号和最后的分号的用方法?

6、一行多命o
输入如下命oQ?
mysql> SELECT USER(); SELECT NOW();
+------------------+
| USER() |
+------------------+
| ODBC@localhost |
+------------------+
1 row in set (0.00 sec)

+---------------------+
| NOW() |
+---------------------+
| 2001-05-17 23:06:15 |
+---------------------+
1 row in set (0.00 sec)
mysql>
注意中间的分P命o之间用分号隔开?

7、显C当前存在的数据?
mysql> show databases;
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 row in set (0.06 sec)
mysql>

8、选择数据库ƈ昄当前选择的数据库
mysql> USE mysql
Database changed
mysql>
(USE ?QUIT 命o不需要分L束。)
mysql> select database();
+---------------+
| database() |
+---------------+
| mysql |
+---------------+
1 row in set (0.00 sec)

9、显C当前数据库中存在的?
mysql> SHOW TABLES;

10、显C(db)的内?
mysql>select * from db;

11、命令的取消
当命令输入错误而又无法改变Q多行语句情形)Ӟ只要在分号出现前可以用 c来取消该条命?
mysql> select
-> user()
-> c
mysql>

q是一些最常用的最基本的操作命令,通过多次l习可以牢牢掌捂了?

学习?

了解了一些最基本的操作命令后Q我们再来学习如何创Z个数据库和数据库表?

1、用SHOW语句扑և在服务器上当前存在什么数据库Q?

mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
3 rows in set (0.00 sec)

2、创Z个数据库abccs
mysql> CREATE DATABASE abccs;
注意不同操作pȝ对大写的敏感?

3、选择你所创徏的数据库
mysql> USE abccs
Database changed
此时你已l进入你刚才所建立的数据库abccs.

4?创徏一个数据库?
首先看现在你的数据库中存在什么表Q?
mysql> SHOW TABLES;
Empty set (0.00 sec)
说明刚才建立的数据库中还没有数据库表。下面来创徏一个数据库表mytable:

我们要徏立一个你公司员工的生日表Q表的内容包含员工姓名、性别、出生日期、出生城市?
mysql> CREATE TABLE mytable (name VARCHAR(20), sex CHAR(1),
-> birth DATE, birthaddr VARCHAR(20));
Query OK, 0 rows affected (0.00 sec)

׃name、birthadd的列值是变化的,因此选择VARCHARQ其长度不一定是20。可以选择?
1?55的Q何长度,如果以后需要改变它的字长,可以使用ALTER TABLE语句。);
性别只需一个字W就可以表示Q?m"?f"Q因此选用CHAR(1);
birth列则使用DATE数据cd?

创徏了一个表后,我们可以看看刚才做的l果Q用SHOW TABLES昄数据库中有哪些表Q?
mysql> SHOW TABLES;
+---------------------+
| Tables in menagerie |
+---------------------+
| mytables |
+---------------------+

5、显C的结构:
mysql> DESCRIBE mytable;
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| birth | date | YES | | NULL | |
| deathaddr | varchar(20) | YES | | NULL | |
+-------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

6?往表中加入记录
我们先用SELECT命o来查看表中的数据Q?
mysql> select * from mytable;
Empty set (0.00 sec)
q说明刚才创建的表还没有记录?

加入一条新记录Q?
mysql> insert into mytable
-> values (´abccs´,´f´,´1977-07-07´,´china´);
Query OK, 1 row affected (0.05 sec)
再用上面的SELECT命o看看发生了什么变化?

我们可以按此Ҏ一条一条地所有员工的记录加入到表中?

7、用文本方式数据装入一个数据库?
如果一条一条地输入Q很ȝ。我们可以用文本文g的方式将所有记录加入你的数据库表中?
创徏一个文本文件“mysql.txt”,每行包含一个记录,用定位符(tab)把值分开Qƈ且以?
CREATE TABLE语句中列出的列次序给出,例如Q?

abccs f 1977-07-07 china  
mary f 1978-12-12 usa
tom m 1970-09-02 usa

使用下面命o文本文件“mytable.txt”装载到mytable表中:
mysql> LOAD DATA LOCAL INFILE "mytable.txt" INTO TABLE pet;

再用如下命令看看是否已数据输入到数据库表中:
mysql> select * from mytable;

学习?

上篇我们学会了如何创Z个数据库和数据库表,q知道如何向数据库表中添加记录?
那么我们如何从数据库表中索数据呢Q?

1、从数据库表中检索信?
实际上,前面我们已经用到了SELECT语句Q它用来从数据库表中索信息?
select语句格式一般ؓQ?

SELECT 索关键词 FROM 被检索的?WHERE 索条?可?

以前所使用的?* ”表C选择所有的列?
下面l箋使用我们在上文章中创徏的表mytableQ?

2、查询所有数据:
mysql> select * from mytable;
+----------+------+------------+----------+
| name | sex | birth | birthaddr |
+----------+------+------------+--------+
| abccs |f | 1977-07-07 | china |
| mary |f | 1978-12-12 | usa |
| tom |m | 1970-09-02 | usa |
+----------+------+------------+----------+
3 row in set (0.00 sec)

3、修正错误记录:
假如tom的出生日期有错误Q应该是1973Q?9Q?2Q则可以用update语句来修正:
mysql> update mytable set birth = "1973-09-02" where name = "tom";
再用2中的语句看看是否已更正过来?

4、选择特定?
上面修改了tom的出生日期,我们可以选择tomq一行来看看是否已经有了变化Q?
mysql> select * from mytable where name = "tom";
+--------+------+------------+------------+
| name |sex | birth | birthaddr |
+--------+------+------------+------------+
| tom |m | 1973-09-02 | usa |
+--------+------+------------+------------+
1 row in set (0.06 sec)

上面WHERE的参数指定了索条件。我们还可以用组合条件来q行查询Q?
mysql> SELECT * FROM mytable WHERE sex = "f" AND birthaddr = "china";
+--------+------+------------+------------+
| name |sex | birth | birthaddr |
+--------+------+------------+------------+
| abccs |f | 1977-07-07 | china |
+--------+------+------------+------------+
1 row in set (0.06 sec)

5?选择特定?
假如你想查看表中的所有h的姓名,则可以这h作:
mysql> SELECT name FROM mytable;
+----------+
| name |
+----------+
| abccs |
| mary |
| tom |
+----------+
3 row in set (0.00 sec)
如果惛_出姓名和性别两列Q则可以用逗号关键词name和birth分开Q?
myaql> select name,birth from mytable;

6、对行进行排?
我们可以对表中的记录按生日大进行排序:
mysql> SELECT name, birth FROM mytable ORDER BY birth;
+----------+------------+
| name | birth |
+----------+------------+
| tom | 1973-09-02 |
| abccs | 1977-07-07 |
| mary | 1978-12-12 |
+----------+------------+
3 row in set (0.00 sec)

我们可以用DESC来进行逆序排序Q?
mysql> SELECT name, birth FROM mytable ORDER BY birth DESC;
+----------+------------+
| name | birth |
+----------+------------+
| mary | 1978-12-12 |
| abccs | 1977-07-07 |
| tom | 1973-09-02 |
+----------+------------+
3 row in set (0.00 sec)

7?行计?
数据库经常要l计一些数据,如表中员工的数目Q我们就要用到行计数函数COUNT()?
COUNT()函数用于寚wNULLl果的记录进行计敎ͼ
mysql> SELECT COUNT(*) FROM mytable;
+----------+
| COUNT(*) |
+----------+
| 3 |
+----------+
1 row in set (0.06 sec)

员工中男x量:
mysql> SELECT sex, COUNT(*) FROM mytable GROUP BY sex;
+------+----------+
| sex | COUNT(*) |
+------+----------+
| f | 2 |
| m | 1 |
+------+----------+
2 row in set (0.00 sec)

注意我们使用了GROUP BY对SEXq行了分l?

多表操作

前面我们熟悉了数据库和数据库表的基本操作Q现在我们再来看看如何操作多个表?

在一个数据库中,可能存在多个表,q些表都是相互关联的。我们l用前面的例子。前面徏立的表中包含了员工的一些基本信息,如姓名、性别、出生日期、出生地。我们再创徏一个表Q该表用于描q员工所发表的文章,内容包括作者姓名、文章标题、发表日期?

1、查看第一个表mytable的内容:
mysql> select * from mytable;
+----------+------+------------+-----------+
| name | sex | birth | birthaddr |
+----------+------+------------+-----------+
| abccs |f | 1977-07-07 | china |
| mary |f | 1978-12-12 | usa |
| tom |m | 1970-09-02 | usa |
+----------+------+------------+-----------+

2、创建第二个表titleQ包括作者、文章标题、发表日期):
mysql> create table title(writer varchar(20) not null,
-> title varchar(40) not null,
-> senddate date);

向该表中填加记录Q最后表的内容如下:
mysql> select * from title;
+--------+-------+------------+
| writer | title | senddate |
+--------+-------+------------+
| abccs | a1 | 2000-01-23 |
| mary | b1 | 1998-03-21 |
| abccs | a2 | 2000-12-04 |
| tom | c1 | 1992-05-16 |
| tom | c2 | 1999-12-12 |
+--------+-------+------------+
5 rows in set (0.00sec)

3、多表查?
现在我们有了两个? mytable ?title。利用这两个表我们可以进行组合查询:
例如我们要查询作者abccs的姓名、性别、文章:
mysql> SELECT name,sex,title FROM mytable,title
-> WHERE name=writer AND name=´abccs´;
+-------+------+-------+
| name | sex | title |
+-------+------+-------+
| abccs | f | a1 |
| abccs | f | a2 |
+-------+------+-------+

上面例子中,׃作者姓名、性别、文章记录在两个不同表内Q因此必M用组合来q行查询。必要指定一个表中的记录如何与其它表中的记录q行匚w?
注意Q如果第二个表title中的writer列也取名为nameQ与mytable表中的name列相同)而不是writerӞ必ȝmytable.name和title.name表示Q以C区别?

再D一个例子,用于查询文章a2的作者、出生地和出生日期:
mysql> select title,writer,birthaddr,birth from mytable,title
-> where mytable.name=title.writer and title=´a2´;
+-------+--------+-----------+------------+
| title | writer | birthaddr | birth |
+-------+--------+-----------+------------+
| a2 | abccs | china | 1977-07-07 |
+-------+--------+-----------+------------+

修改和备份、批处理

有时我们要对数据库表和数据库q行修改和删除,可以用如下方法实玎ͼ

1、增加一列:
如在前面例子中的mytable表中增加一列表C是否单wsingle:
mysql> alter table mytable add column single char(1);

2、修改记?
abccs的single记录修改为“y”:
mysql> update mytable set single=´y´ where name=´abccs´;

现在来看看发生了什么:
mysql> select * from mytable;
+----------+------+------------+-----------+--------+
| name | sex | birth | birthaddr | single |
+----------+------+------------+-----------+--------+
| abccs |f | 1977-07-07 | china | y |
| mary |f | 1978-12-12 | usa | NULL |
| tom |m | 1970-09-02 | usa | NULL |
+----------+------+------------+-----------+--------+

3、增加记?
前面已经讲过如何增加一条记录,Z于查看,重复与此Q?
mysql> insert into mytable
-> values (´abc´,´f´,´1966-08-17´,´china´,´n´);
Query OK, 1 row affected (0.05 sec)
查看一下:
mysql> select * from mytable;
+----------+------+------------+-----------+--------+
| name | sex | birth | birthaddr | single |
+----------+------+------------+-----------+--------+
| abccs |f | 1977-07-07 | china | y |
| mary |f | 1978-12-12 | usa | NULL |
| tom |m | 1970-09-02 | usa | NULL |
| abc |f | 1966-08-17 | china | n |
+----------+------+------------+-----------+--------+


3、删除记?
用如下命令删除表中的一条记录:
mysql> delete from mytable where name=´abc´;
DELETE从表中删除满由wherel出的条件的一条记录?

再显CZ下结果:
mysql> select * from mytable;
+----------+------+------------+-----------+--------+
| name | sex | birth | birthaddr | single |
+----------+------+------------+-----------+--------+
| abccs |f | 1977-07-07 | china | y |
| mary |f | 1978-12-12 | usa | NULL |
| tom |m | 1970-09-02 | usa | NULL |
+----------+------+------------+-----------+--------+

4、删除表Q?
mysql> drop table ****(?的名?Q?**?的名?
可以删除一个或多个表,心使用?

5、数据库的删除:
mysql> drop database 数据库名;
心使用?

6、数据库的备份:
退回到DOSQ?
mysql> quit
d:mysqlbin
使用如下命oҎ据库abccsq行备䆾Q?
mysqldump --opt abccs>abccs.dbb
abccs.dbb是你的数据库abccs的备份文件?

7、用批处理方式用MySQL:

首先建立一个批处理文gmytest.sql,内容如下Q?
use abccs;
select * from mytable;
select name,sex from mytable where name=´abccs´;

在DOS下运行如下命令:
d:mysqlbin mysql < mytest.sql
在屏q上会显C执行结果?

如果想看l果Q而输出结果很多,则可以用q样的命令:
mysql < mytest.sql | more

我们q可以将l果输出C个文件中Q?
mysql < mytest.sql > mytest.out



]]>
JSPq接各类数据库大?/title><link>http://www.tkk7.com/hua/archive/2006/05/29/48721.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Mon, 29 May 2006 04:46:00 GMT</pubDate><guid>http://www.tkk7.com/hua/archive/2006/05/29/48721.html</guid><wfw:comment>http://www.tkk7.com/hua/comments/48721.html</wfw:comment><comments>http://www.tkk7.com/hua/archive/2006/05/29/48721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/hua/comments/commentRss/48721.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/hua/services/trackbacks/48721.html</trackback:ping><description><![CDATA[ <font face="Courier New">现在有好多初学jsp的网友经怼问数据库怎么q接啊,怎么老出错啊Q所以我集中的在q写文章供大家参考,其实q种把数据库逻辑全部攑֜jsp里未必是好的做法Q但是有利于初学者学习,所以我p样做了,当大家学C定程度的时候,可以考虑用MVC的模式开发。在l习q些代码的时候,你一定将jdbc的驱动程序放到服务器的类路径里,然后要在数据库里Z个表test,有两个字D|如ؓtest1Qtest2Q可以用下面SQL?br /><br />  create table test(test1 varchar(20),test2 varchar(20)<br /><br />  然后向这个表写入一条测试纪录,那么现在开始我们的jsp和数据库之旅吧?br /><br />  一、jspq接Oracle8/8i/9i数据库(用thin模式Q?br />  testoracle.jsp如下Q?br />  <%@ page contentType="text/html;charset=gb2312"%> <br />  <%@ page import="java.sql.*"%> <br />  <html> <br />  <body> <br />  <%Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); <br />  String url="jdbc:oracle:thin:@localhost:1521:orcl"; <br />  //orclZ的数据库的SID <br />  String user="scott"; <br />  String password="tiger"; <br />  Connection conn= DriverManager.getConnection(url,user,password); <br />  Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />  String sql="select * from test"; <br />  ResultSet rs=stmt.executeQuery(sql); <br />  while(rs.next()) {%> <br />  您的W一个字D内容ؓQ?lt;%=rs.getString(1)%> <br />  您的W二个字D内容ؓQ?lt;%=rs.getString(2)%> <br />  <%}%> <br />  <%out.print("数据库操作成功,恭喜?);%> <br />  <%rs.close(); <br />  stmt.close(); <br />  conn.close(); <br />  %> <br />  </body> <br />  </html> <br /><br />二、jspq接Sql Server7.0/2000数据库?br /><br />  testsqlserver.jsp如下Q?br />  <%@ page contentType="text/html;charset=gb2312"%> <br />  <%@ page import="java.sql.*"%> <br />  <html> <br />  <body> <br />  <%Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); <br />  String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"; <br />  //pubsZ的数据库的?br />  String user="sa"; <br />  String password="";   <br />  Connection conn= DriverManager.getConnection(url,user,password); <br />  Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />  String sql="select * from test"; <br />  ResultSet rs=stmt.executeQuery(sql); <br />  while(rs.next()) {%> <br />  您的W一个字D内容ؓQ?lt;%=rs.getString(1)%> <br />  您的W二个字D内容ؓQ?lt;%=rs.getString(2)%> <br />  <%}%> <br />  <%out.print("数据库操作成功,恭喜?);%> <br />  <%rs.close(); <br />  stmt.close(); <br />  conn.close();   <br />  %> <br />  </body> <br />  </html> <br /><br />三、jspq接DB2数据库?br /><br />  testdb2.jsp如下Q?br />  <%@ page contentType="text/html;charset=gb2312"%> <br />  <%@ page import="java.sql.*"%> <br />  <html> <br />  <body> <br />  <%Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); <br />  String url="jdbc:db2://localhost:5000/sample"; <br />  //sampleZ的数据库名?br />  String user="admin"; <br />  String password=""; <br />  Connection conn= DriverManager.getConnection(url,user,password); <br />  Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />  String sql="select * from test"; <br />  ResultSet rs=stmt.executeQuery(sql); <br />  while(rs.next()) {%> <br />  您的W一个字D内容ؓQ?lt;%=rs.getString(1)%> <br />  您的W二个字D内容ؓQ?lt;%=rs.getString(2)%> <br />  <%}%> <br />  <%out.print("数据库操作成功,恭喜?);%> <br />  <%rs.close(); <br />  stmt.close(); <br />  conn.close(); <br />  %> <br />  </body> <br />  </html><br /><br />四、jspq接Informix数据库?br /><br />  testinformix.jsp如下Q?br />  <%@ page contentType="text/html;charset=gb2312"%> <br />  <%@ page import="java.sql.*"%> <br />  <html> <br />  <body> <br />  <%Class.forName("com.informix.jdbc.IfxDriver").newInstance(); <br />  String url = <br />  "jdbc:informix-sqli://123.45.67.89:1533/testDB:INFORMIXSERVER=myserver; <br />  user=testuser;password=testpassword"; <br />  //testDBZ的数据库名?br />  Connection conn= DriverManager.getConnection(url); <br />  Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />  String sql="select * from test"; <br />  ResultSet rs=stmt.executeQuery(sql); <br />  while(rs.next()) {%> <br />  您的W一个字D内容ؓQ?lt;%=rs.getString(1)%> <br />  您的W二个字D内容ؓQ?lt;%=rs.getString(2)%> <br />  <%}%> <br />  <%out.print("数据库操作成功,恭喜?);%> <br />  <%rs.close(); <br />  stmt.close(); <br />  conn.close(); <br />  %> <br />  </body> <br />  </html> <br /><br />五、jspq接Sybase数据库?br /><br />  testmysql.jsp如下Q?br />  <%@ page contentType="text/html;charset=gb2312"%> <br />  <%@ page import="java.sql.*"%> <br />  <html> <br />  <body> <br />  <%Class.forName("com.sybase.jdbc.SybDriver").newInstance(); <br />  String url =" jdbc:sybase:Tds:localhost:5007/tsdata"; <br />  //tsdataZ的数据库名?br />  Properties sysProps = System.getProperties(); <br />  SysProps.put("user","userid"); <br />  SysProps.put("password","user_password"); <br />  Connection conn= DriverManager.getConnection(url, SysProps); <br />  Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />  String sql="select * from test"; <br />  ResultSet rs=stmt.executeQuery(sql); <br />  while(rs.next()) {%> <br />  您的W一个字D内容ؓQ?lt;%=rs.getString(1)%> <br />  您的W二个字D内容ؓQ?lt;%=rs.getString(2)%> <br />  <%}%> <br />  <%out.print("数据库操作成功,恭喜?);%> <br />  <%rs.close(); <br />  stmt.close(); <br />  conn.close(); <br />  %> <br />  </body> <br />  </html> <br /><br />六、jspq接MySQL数据库?br /><br />  testmysql.jsp如下Q?br />  <%@ page contentType="text/html;charset=gb2312"%> <br />  <%@ page import="java.sql.*"%> <br />  <html> <br />  <body> <br />  <%Class.forName("org.gjt.mm.mysql.Driver").newInstance(); <br />  String url="jdbc:mysql://localhost/softforum?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1" <br />  //testDBZ的数据库名?br />  Connection conn= DriverManager.getConnection(url); <br />  Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />  String sql="select * from test"; <br />  ResultSet rs=stmt.executeQuery(sql); <br />  while(rs.next()) {%> <br />  您的W一个字D内容ؓQ?lt;%=rs.getString(1)%> <br />  您的W二个字D内容ؓQ?lt;%=rs.getString(2)%> <br />  <%}%> <br />  <%out.print("数据库操作成功,恭喜?);%> <br />  <%rs.close(); <br />  stmt.close(); <br />  conn.close(); <br />  %> <br />  </body> <br />  </html><br /><br />七、jspq接PostgreSQL数据库?br /><br />  testmysql.jsp如下Q?br />  <%@ page contentType="text/html;charset=gb2312"%> <br />  <%@ page import="java.sql.*"%> <br />  <html> <br />  <body> <br />  <%Class.forName("org.postgresql.Driver").newInstance(); <br />  String url ="jdbc:postgresql://localhost/soft" <br />  //softZ的数据库名?br />  String user="myuser"; <br />  String password="mypassword"; <br />  Connection conn= DriverManager.getConnection(url,user,password); <br />  Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />  String sql="select * from test"; <br />  ResultSet rs=stmt.executeQuery(sql); <br />  while(rs.next()) {%> <br />  您的W一个字D内容ؓQ?lt;%=rs.getString(1)%> <br />  您的W二个字D内容ؓQ?lt;%=rs.getString(2)%> <br />  <%}%> <br />  <%out.print("数据库操作成功,恭喜?);%> <br />  <%rs.close(); <br />  stmt.close(); <br />  conn.close(); <br />  %> <br />  </body> <br />  </html><br /></font> <img src ="http://www.tkk7.com/hua/aggbug/48721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/hua/" target="_blank">?/a> 2006-05-29 12:46 <a href="http://www.tkk7.com/hua/archive/2006/05/29/48721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于ORACLEq接?http://www.tkk7.com/hua/archive/2006/05/26/48339.html?/dc:creator>?/author>Fri, 26 May 2006 07:29:00 GMThttp://www.tkk7.com/hua/archive/2006/05/26/48339.htmlhttp://www.tkk7.com/hua/comments/48339.htmlhttp://www.tkk7.com/hua/archive/2006/05/26/48339.html#Feedback0http://www.tkk7.com/hua/comments/commentRss/48339.htmlhttp://www.tkk7.com/hua/services/trackbacks/48339.html
Oracle应用 关于ORACLEq接?/strong> 字体Q?a href="javascript:fontZoomA();">?/a>?/a>
关于ORACLEq接?/td>

172 *
173 * @param props 属?
174 */
175 private void loadDrivers(Properties props) {
176 String driverClasses = props.getProperty("drivers");
177 StringTokenizer st = new StringTokenizer(driverClasses);
178 while (st.hasMoreElements()) {
179 String driverClassName = st.nextToken().trim();
180 try {
181 Driver driver = (Driver)
182 Class.forName(driverClassName).newInstance();
183 DriverManager.registerDr

iver(driver);
184 drivers.addElement(driver);
185 log("成功注册JDBC驱动E序\\\" + driverClassName);
186 }
187 catch (Exception e) {
188 log("无法注册JDBC驱动E序: " +
189 driverClassName + ", 错误: " + e);
190 }
191 }
192 }
193
194 /**
195 * 文本信息写入日志文?
196 */
197 private void log(String msg) {
198 log.println(new Date() + ": " + msg);
199 }
200
201 /**
202 * 文本信息与异常写入日志文g
203 */
204 private void log(Throwable e, String msg) {
205 log.println(new Date() + ": " + msg);
206 e.printStackTrace(log);
207 }
208
209 /**
210 * 此内部类定义了一个连接池.它能够根据要求创建新q接,直到预定的最\\r

 

 

 



]]>
关于ORACLEq接?/title><link>http://www.tkk7.com/hua/archive/2006/05/26/48283.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Fri, 26 May 2006 03:24:00 GMT</pubDate><guid>http://www.tkk7.com/hua/archive/2006/05/26/48283.html</guid><wfw:comment>http://www.tkk7.com/hua/comments/48283.html</wfw:comment><comments>http://www.tkk7.com/hua/archive/2006/05/26/48283.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/hua/comments/commentRss/48283.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/hua/services/trackbacks/48283.html</trackback:ping><description><![CDATA[ <p>到目前ؓ?JDBC2的连l池只是一个接?没有真正的实?JDBC3正在开发中,据报已经支持q结?但JDBC3用了JNDI技?q结池的配置可以让一个高手都烦死. </p> <p>目前W三方已l实现的q结池当然是poolman,1.0版对一般用h说已l够用?配置也简?2.0版虽然增加了一些功?但配|也是采用JNDI,对RMI和EJB不懂的朋友可能很??.0的了. </p> <p>如果有兴?自己也可以实现连l池,最关键的技术也是把连l作为参Cl一个BEAN,用完后返回这个参数连l而不是关? <br />下面是一个简单的实现: <br />DBConnectionManager.javaE序清单如下Q?</p> <p>001 import java.io.*; <br />002 import java.sql.*; <br />003 import java.util.*; <br />004 import java.util.Date; <br />005 <br />006 /** <br />007 * 理cDBConnectionManager支持对一个或多个由属性文件定义的数据库连?<br />008 * 池的讉K.客户E序可以调用getInstance()Ҏ讉K本类的唯一实例. <br />009 */ <br />010 public class DBConnectionManager { <br />011 static private DBConnectionManager instance; // 唯一实例 <br />012 static private int clients; <br />013 <br />014 private Vector drivers = new Vector(); <br />015 private PrintWriter log; <br />016 private Hashtable pools = new Hashtable(); <br />017 <br />018 /** <br />019 * q回唯一实例.如果是第一ơ调用此Ҏ,则创建实?<br />020 * <br />021 * @return DBConnectionManager 唯一实例 <br />022 */ <br />023 static synchronized public DBConnectionManager getInstance() { <br />024 if (instance == null) { <br />025 instance = new DBConnectionManager(); <br />026 } <br />027 clients++; <br />028 return instance; <br />029 } <br />030 <br />031 /** <br />032 * 建构函数U有以防止其它对象创建本cd?<br />033 */ <br />034 private DBConnectionManager() { <br />035 init(); <br />036 } <br />037 <br />038 /** <br />039 * 连接对象返回给由名字指定的q接?<br />040 * <br />041 * @param name 在属性文件中定义的连接池名字 <br />042 * @param con q接对象\\r </p> <p>043 */ <br />044 public void freeConnection(String name, Connection con) { <br />045 DBConnectionPool pool = (DBConnectionPool) pools.get(name); <br />046 if (pool != null) { <br />047 pool.freeConnection(con); <br />048 } <br />049 } <br />050 <br />051 /** <br />052 * 获得一个可用的(I闲?q接.如果没有可用q接,且已有连接数于最大连接数 <br />053 * 限制,则创建ƈq回新连?<br />054 * <br />055 * @param name 在属性文件中定义的连接池名字 <br />056 * @return Connection 可用q接或null <br />057 */ <br />058 public Connection getConnection(String name) { <br />059 DBConnectionPool pool = (DBConnectionPool) pools.get(name); <br />060 if (pool != null) { <br />061 return pool.getConnection(); <br />062 } <br />063 return null; <br />064 } <br />065 <br />066 /** <br />067 * 获得一个可用连?若没有可用连?且已有连接数于最大连接数限制, <br />068 * 则创建ƈq回新连?否则,在指定的旉内等待其它线E释放连? <br />069 * <br />070 * @param name q接池名?<br />071 * @param time 以毫U计的等待时间\\r </p> <p> </p> <p> </p> <p>072 * @return Connection 可用q接或null <br />073 */ <br />074 public Connection getConnection(String name, long time) { <br />075 DBConnectionPool pool = (DBConnectionPool) pools.get(name); <br />076 if (pool != null) { <br />077 return pool.getConnection(time); <br />078 } <br />079 return null; <br />080 } <br />081 <br />082 /** <br />083 * 关闭所有连?撤销驱动E序的注册\\r </p> <p>084 */ <br />085 public synchronized void release() { <br />086 // {待直到最后一个客L序调?<br />087 if (--clients != 0) { <br />088 return; <br />089 } <br />090 <br />091 Enumeration allPools = pools.elements(); <br />092 while (allPools.hasMoreElements()) { <br />093 DBConnectionPool pool = (DBConnectionPool</p> <p>) allPools.nextElement(); <br />094 pool.release(); <br />095 } <br />096 Enumeration allDrivers = drivers.elements(); <br />097 while (allDrivers.hasMoreElements()) { <br />098 Driver driver = (Driver) allDrivers.nextElement(); <br />099 try { <br />100 DriverManager.deregisterDriver(driver); <br />101 log("撤销JDBC驱动E序 " + driver.getClass().getName()+"的注册\\\"); <br />102 } <br />103 catch (SQLException e) { <br />104 log(e, "无法撤销下列JDBC驱动E序的注? " + driver.getClass().getName()); <br />105 } <br />106 } <br />107 } <br />108 <br />109 /** <br />110 * Ҏ指定属性创接池实例. <br />111 * <br />112 * @param props q接池属?<br />113 */ <br />114 private void createPools(Properties props) { <br />115 Enumeration propNames = props.propertyNames(); <br />116 while (propNames.hasMoreElements()) { <br />117 String name = (String) propNames.nextElement(); <br />118 if (name.endsWith(".url")) { <br />119 String poolName = name.substring(0, name.lastIndexOf(".")); <br />120 String url = props.getProperty(poolName + ".url"); <br />121 if (url == null) { <br />122 log("没有接池" + poolName + "指定URL"); <br />123 continue; <br />124 } <br />125 String user = props.getProperty(poolName + ".user"); <br />126 String password = props.getProperty(poolName + ".password"); <br />127 String maxconn = props.getProperty(poolName + ".maxconn", "0"); <br />128 int max; <br />129 try { <br />130 max = Integer.valueOf(maxconn).intValue(); <br />131 } <br />132 catch (NumberFormatException e) { <br />133 log("错误的最大连接数限制: " + maxconn + " .q接? " + poolName); <br />134 max = 0; <br />135 } <br />136 DBConnectionPool pool = <br />137 new DBConnectionPool(poolName, url, user, password, max); <br />138 pools.put(poolName, pool); <br />139 log("成功创徏q接? + poolName); <br />140 } <br />141 } <br />142 } <br />143 <br />144 /** <br />145 * d属性完成初始化 <br />146 */ <br />147 private void init() { <br />148 InputStream is = getClass().getResourceAsStream("/db.properties"); <br />149 Properties dbProps = new Properties(); <br />150 try { <br />151 dbProps.load(is); <br />152 } <br />153 catch (Exception e) { <br />154 System.err.println("不能d属性文? " + <br />155 "L保db.properties在CLASSPATH指定的\径中"); <br />156 return; <br />157 } <br />158 String logFile = dbProps.getProperty("logfile", "DBConnectionManager.log"); <br />159 try { <br />160 log = new PrintWriter(new FileWriter(logFile, true), true); <br />161 } <br />162 catch (IOException e) { <br />163 System.err.println("无法打开日志文g: " + logFile); <br />164 log = new PrintWriter(System.err); <br />165 } <br />166 loadDrivers(dbProps); <br />167 createPools(dbProps); <br />168 } <br />169 <br />170 /** <br />171 * 装蝲和注册所有JDBC驱动E序\\r </p> <img src ="http://www.tkk7.com/hua/aggbug/48283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/hua/" target="_blank">?/a> 2006-05-26 11:24 <a href="http://www.tkk7.com/hua/archive/2006/05/26/48283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于在ORACLE下开发JAVA的几个问?/title><link>http://www.tkk7.com/hua/archive/2006/05/23/47660.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Tue, 23 May 2006 07:49:00 GMT</pubDate><guid>http://www.tkk7.com/hua/archive/2006/05/23/47660.html</guid><wfw:comment>http://www.tkk7.com/hua/comments/47660.html</wfw:comment><comments>http://www.tkk7.com/hua/archive/2006/05/23/47660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/hua/comments/commentRss/47660.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/hua/services/trackbacks/47660.html</trackback:ping><description><![CDATA[ <font face="Courier New">我本来不再想写一些类似教E的文章,因ؓ既然叫教E就要能历经历史的考验,而对于我q种菜鸟U的E序设计者来说仅喜欢随心所Ʋ地交流一些自ql验。可以不成方法,无关条理地想到哪说到哪。但是有些问题我又不能不出来说明白,因ؓ目前|上的很多“教E”都在把初学者引向错误,有些是作者个人理解的错误Q有些作者自׃来没有做q开发却能写ZY件开发的文章。他们只会做TRANSLATEQCOPYQCUTq些操作Q最单的例子是sun的JDK开发文档中到目前ؓ止介l大对象Q文Ӟ存储的方法都是错误的Q可是说l过NQN >100Q次的重写都没有人纠正,因ؓ后来的h都只是COPY了一下,Ҏ没有真的dQ只是把原作者换成自q名字而已。?br />Q尊重声明:凡以AXMANQ超U菜鸟,诗剑书生{֐的文章除在CNJSP|站发布谢绝M|站转脓Q?br /><br />问题一Q如保加载JDBC驱动E序Q?br />正常我们加蝲驱动E序有三个途径Q?br />1QClass.forName(String)q想当于classLoader一个String指定的类Q在装蝲时把该驱动程序的静态内定w初始化,其实q时驱动E序c调用了DriverManager.registerDriver(driver);Ҏ <br />2Q用系l属性:System.getProperty().load(new FileInputStream("属性文?)); <br />在属性文件中指定jdbc.driver=drivername q样的好处是可以同时加蝲多个JDBCQ换数据库时不用讉KJAVA源代码,只是修改属性文件?br />3Q直接registerDriver(driverQ这U方法最可靠Q可以在M环境下用。?br /><br />1Q方法简单,但MS的JVM不能正确初始化。比如用IE时在APPLET中就不能使用Q应该用3Q的Ҏ。但3Q方法在灉|性方面不?Q,可以Ҏ环境l合考虑。?br /><br /><br />问题二:大对象存储?br />    一般来_大对象存储是把文件存到数据库中,当然也可以内存中的超大字W串。对于象囄q样的文件当然是用二q制存储Q这里有很多误区Q网l上的教E?9%都是行不通的Q连SUN自己的文档都一直错误,虽然错误很小。按说二q制文g应该存ؓBLOBcdQ但JBDC2q不能直接对BLOB存入二进制文Ӟ如果你这样做Q会得到一个IO而不是SQL异常Qؓ此花了我q两个小时才弄清楚?br />    如果要把一个二制文件存入ORACLEQ用标准的JDBC你就要用LONG ROWcdQ?br />create table tb_file(name varchar(20),detail long row); <br />然后 <br />File file = new File("aaa.gif"); <br />int fileLength =(int) file.length(); <br />InputStream fin = new FileInputStream(file); <br />PreparedStatement pstmt = con.prepareStatement("insert into tb_file values('aaa.gif',?)"); <br />pstmt.setBinaryStream (1, fin, fileLength); <br />pstmt.executeUpdate(); <br /><br />如果你一定要用BLOB存储Q你必ȝORACLE自己的方法: <br />create table tb_file(name varchar(20),detail BLOB); <br />con.setAutoCommit(false); <br />stmt.executeUpdate("insert into tb_file values('aaa.gif',empty_blob())"); <br />下面必须SELECT得到BLOB的对象再向里写: <br />rs = stmt.executeQuery("select detail from tb_file where name='aaa.gif' for upfdate" ); <br />if(rs.next()) <br />{ <br />Blob blob = rs.getBlob(1); <br />BinaryOutputStream out = ((oracle.sql.BLOB)blob).getBinaryOutputStream(); <br />byte[] b = new byte[((oracle.sql.BLOB)blob).getBufferSize]; <br />InputStream fin = new FileInputStream(file); <br />int len = 0; <br />while( (len = fin.read(b)) != -1) <br />out.write(b,0,len); <br />fin.close(); <br />out.close(); <br />con.commit(); <br />} <br /><br />同样d数据你ƈ不能象LONG ROW那样 <br />InputStream in = rs.getBinaryInputStream("detail"); <br />而要 <br />Blob blob = rs.getBlob("detail"); <br />in = blob.getBinaryStream(); <br /><br />问题三:可滚动结果集 <br />    ORACLE 明确说明不支持结果集滚动Q那么我们用JDBC2得到一个可滚动的结果集是同JDBC自己支持的,是说结果集要在内存中高度缓存,很多很多的开发者都错误地认为是数据库支持的。只是他们没有真正查询大量行Q如果真的查询大量行的话肯定是死定了Q!Q!Q!对于大量行的数据,情愿q回到它的笨Ҏ也不要用可滚动l果集?br /><br /></font> <img src ="http://www.tkk7.com/hua/aggbug/47660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/hua/" target="_blank">?/a> 2006-05-23 15:49 <a href="http://www.tkk7.com/hua/archive/2006/05/23/47660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jsp中调用Oracle存储q程的小例子http://www.tkk7.com/hua/archive/2006/05/23/47653.html?/dc:creator>?/author>Tue, 23 May 2006 07:32:00 GMThttp://www.tkk7.com/hua/archive/2006/05/23/47653.htmlhttp://www.tkk7.com/hua/comments/47653.htmlhttp://www.tkk7.com/hua/archive/2006/05/23/47653.html#Feedback0http://www.tkk7.com/hua/comments/commentRss/47653.htmlhttp://www.tkk7.com/hua/services/trackbacks/47653.html
*执行一条insert语句q传参数*/
create or replace procedure p_test2(i in number) as
begin
insert into t values (i,'x'||to_char(i));
commit;
end;
/

<%@ page language="java" contentType="text/html;charset=gb2312"%>
<%@page import="java.sql.*"%>
<html>
<body>
<table>
<tr><td>aaa</td><td>bbb</td></tr>
<%
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@192.168.1.6:1521:db";
    
    Class.forName(driver);
    Connection conn = DriverManager.getConnection(strUrl, "scott", "tiger");

    String procedure = "{call p_test2 (?) }";
    CallableStatement cstmt = conn.prepareCall(procedure);
    cstmt.setInt(1,33);
    cstmt.executeUpdate();

    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("select * from t");

    while(rs.next())
    {
        out.println("<tr><td>" + rs.getString(1) + "</td><td>" + rs.getString(2) + "</td></tr>");
    }

    rs.close();
    stmt.close();
    conn.close();
%>
</table>
<p>
<%
out.print(conn.isClosed());
%>

</body>
</html>
</body> 
</html>

]]>
վ֩ģ壺 ƷѲ| ѿһëƬ߹ۿƷƵ| һëƬѲ| ѹƵ߹ۿ| 91ۺ| 1024Ѹùۿվ| ޳77777| þþþóƬѹۿѿ| AV| AVۺɫһ| žѾƷƵ| ҹ˾ƷӰ߹ۿ | 91԰Ƶ| ëƬƵ| ѲŴɫaƵ| ޾ƷƵ| ȫƵѹۿӾ| jjizzȫѿƬ| һëƬѹۿ| ߳ëƬڵƵ| vƬ߹ۿ| 97Ƶ| ޾Ʒþþþþþ| ůůձ| ްɫɫ߲| պӰ| ޾Ʒһ| ѴƬ߹ۿ| ŷպ| þþƷѹۿͬ| ۺУ԰ɫ| 91ֻƬ| ˳ɵӰվɫwww| ߲| Ļ߾Ʒ| ˳ɫ4444߹ۿ| ޾ƷþþþþҲ | պ޵һҳ| ҹӰԺѹۿ| 123Һ| xxxxx|