﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-花-随笔分类-DateBase Design</title><link>http://www.blogjava.net/hua/category/10657.html</link><description>即使世界明天毁灭，我也要在今天种下我的葡萄树。 </description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:26:08 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:26:08 GMT</pubDate><ttl>60</ttl><item><title>ORACLE笔记</title><link>http://www.blogjava.net/hua/archive/2007/01/16/94238.html</link><dc:creator>花</dc:creator><author>花</author><pubDate>Tue, 16 Jan 2007 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/hua/archive/2007/01/16/94238.html</guid><wfw:comment>http://www.blogjava.net/hua/comments/94238.html</wfw:comment><comments>http://www.blogjava.net/hua/archive/2007/01/16/94238.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hua/comments/commentRss/94238.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hua/services/trackbacks/94238.html</trackback:ping><description><![CDATA[
		<div>
				<strong>Oracle SQL(Oracle 9i 9.2.0.1.0)</strong>
		</div>
		<div>
				<strong>
				</strong> </div>
		<div>
				<strong>SQL(</strong>
				<strong>结构化查询语言)</strong>
				<strong>，是操作关系型数据库中的对象。</strong>
		</div>
		<div>
				<strong>DDL</strong>
				<strong>（数据定义语言），用于建表或删表操作，以及对表约束进行修改。</strong>
		</div>
		<div>
				<strong>DML</strong>
				<strong>（数据操作语言），向表中插入纪录，修改纪录。</strong>
		</div>
		<div>
				<strong>事务控制语言，commit; rollback;</strong>
		</div>
		<div>
				<strong>授权语句</strong>
		</div>
		<div> </div>
		<div>select（数据的查询），投影，过滤（选择）查寻，关联查寻（表连接）。</div>
		<div> </div>
		<div>sqlplus 访问数据库命令（本地访问/远程访问），和数据库建立连接的命令，是数据库操作的环境</div>
		<div>sqlplus 用户名/密码</div>
		<div> </div>
		<div>show user 显示当前用户的用户名</div>
		<div> </div>
		<div>在sqlplus中可以使用 ! 可以在shell和sqlplus间切换，!shell命令 可以在sqlplus中使用shell命令。实际上是sqlplus开了子进程来执行shell命令。</div>
		<div> </div>
		<div>Oracle数据库中的表分两类：用户表（用户使用操作的表），系统表（数据库系统维护的表，数据字典）</div>
		<div> </div>
		<div>
				<strong>select</strong>
				<strong>查询语句</strong>
		</div>
		<div>select table_name from user_tables;（查询系统表）</div>
		<div>以上的查询语句就是查询本用户下所拥有的所有表的表名。</div>
		<div> </div>
		<div>desc [表名] 这是一条sqlplus命令，注意他不是sql语句，这条命令用于查看表的结构。</div>
		<div>[字段名] [字段的类型]，这是使用完desc命令后显示的表结构。</div>
		<div> </div>
		<div>
				<strong>投影操作</strong>，只查看选择的字段的信息。</div>
		<div>
				<strong>选择操作</strong>，查看字段中的特定某些信息。</div>
		<div>
				<strong>多表查询</strong>，通过表间连接，查寻出多表中的信息</div>
		<div> </div>
		<div>
				<strong>!oerr ora [</strong>
				<strong>错误号] </strong>，系统可以显示错误的原因和如何修改。</div>
		<div>如果命令错误输入可以使用edit或ed来修改输入错误。实际上是在编辑缓存文件中的最后一条sql语句。也可以使用 (change) c /错误字段/正确字段，来进行替换操作进行修改。</div>
		<div> </div>
		<div>select [表的字段名1],[表的字段名2], ... from 表名;</div>
		<div>select * from 表名; 查寻表中所有字段的信息</div>
		<div> </div>
		<div>关键字不等拆分，sql语句，以及表名，字段名是大小写不敏感的。</div>
		<div>sql语句要以"；"结尾，来表示sql语句结束，如果不加"；"系统不会执行此条sql语句，并提示。</div>
		<div>sqlplus的buffer中会缓存最后一条sql语句，可以使用"/"来执行这最后一条sql语句，也可以使用</div>
		<div>edit命令来编辑最后一条sql语句。l命令（list）（sqlplus命令）可以显示buffer中最后一条命令。</div>
		<div> </div>
		<div>
				<strong>sqlplus</strong>
				<strong>设置</strong>
		</div>
		<div>set pause on 回车响应，分屏显示，只在本会话中有效</div>
		<div>set pause off 关闭分屏显示。</div>
		<div>set pause '...' 设置分屏显示的提示信息。</div>
		<div>set pause on 先输出提示信息，回车响应，分屏显示</div>
		<div>set head off 提头输出关闭</div>
		<div>set feed off 结尾输出关闭</div>
		<div>set echo off 回写关闭</div>
		<div>spool 文件名.sql 写入指定文件</div>
		<div>spool off 关闭写入。</div>
		<div> </div>
		<div>
				<strong>清屏命令</strong> !clear 或 clear screen</div>
		<div> </div>
		<div>在Oracle中字符显示是左对齐，数值右对齐。</div>
		<div> </div>
		<div>在select 语句中可以使用数学表达式。</div>
		<div> </div>
		<div>select [表达式（必须包含本表字段名）],[...],.... from 表名；</div>
		<div>运算的优先级的先乘除后加减，同级自左向右运算，括号改变优先级。</div>
		<div> </div>
		<div>select [字段名或表达式] ["别名"]，[...] ["..."],.... from 表名；</div>
		<div> </div>
		<div>可以通过在字段名或表达式后加空格"别名"，可以给列，或者表达式结果其别名。</div>
		<div>字符串拼接使用||符号</div>
		<div> </div>
		<div>select 目标字段名||" "||目标字段名 from 表名；</div>
		<div>注意：在Oracle中的字符串要用'..'包含</div>
		<div>别名中需要使用空格，或是大小写敏感时需要用".."包含。</div>
		<div> </div>
		<div>
				<strong>
						<span style="FONT-SIZE: 12pt">sql</span>
				</strong>
				<strong>脚本</strong>，也就是在文件中写有sql语句的文件，可以在sqlplus中运行,推荐为.sql。</div>
		<div>引入sql脚本: sqlplus 用户名/密码 @sql脚本(注意@前一定要有空格,否则含义就变了)</div>
		<div>Oracle中的空值 空值会当无穷大处理。</div>
		<div>Oracle中控制处理函数 NVL(字段名，值)，这个字段中的空值替换为指定值，如果不为空，则会返回其原值。</div>
		<div>例：select (salary*12)*(NVL(commission_pct,0)/100+1) salary,first_name from s_emp;</div>
		<div> </div>
		<div>
				<strong>distinct</strong>
				<strong>关键字</strong>，去掉重复行（这个关键字会处发排序操作）</div>
		<div>例： select distinct dept_id,title from s_emp;</div>
		<div>注意：distinct，关键字之后会对from之前的字段进行排重操作。</div>
		<div>
				<strong>column</strong>
				<strong>命令</strong>（这是个sqlplus命令）</div>
		<div>column命令 列格式的定义</div>
		<div> </div>
		<div>column 目标列名 查看这个类是否定义了格式</div>
		<div> </div>
		<div>column 目标列名 format a.. 设置列宽。</div>
		<div>column last_name heading 'Employee|Name'（设置题头） FORMAT A15</div>
		<div>这其中的'|'是换行符</div>
		<div> </div>
		<div>column salary justify left format $99,990.00（定义数字显示格式）</div>
		<div>注意：如果不满足显示的格式，就会把数据显示为"#"</div>
		<div> </div>
		<div>column 列名 clear （清除列格式定义）</div>
		<div> </div>
		<div>注意：只有sqlplus命令才有简写，并且在使用sqlplus命令时结尾也不能加分号。</div>
		<div> </div>
		<div>
				<strong>选择操作</strong>
		</div>
		<div> </div>
		<div>
				<strong>order by</strong> 排序子句 ASC（默认，升序） DESC（降序）</div>
		<div> </div>
		<div>order by 目标列名（别名） 排序顺序（不写排序顺序，会默认为升序排序）</div>
		<div> </div>
		<div>例：select first_name from s_emp order by first_name;</div>
		<div>
				<span>    select first_name from s_emp order by first_name desc;</span>
		</div>
		<div> </div>
		<div>注意：升序空值在结果的末尾，降序空值在结果的最前面。</div>
		<div> </div>
		<div>
				<strong>where</strong>
				<strong>子句</strong>
		</div>
		<div> </div>
		<div>where子句使用在 select ... from ... 后面，用来选择所需（符合条件的）的记录</div>
		<div> </div>
		<div>where后面跟的是表达式 也就是 XXX=XXX， XXX between X and X ，XXX in（X，X，X）</div>
		<div>like '...' 通配查询</div>
		<div> </div>
		<div>between ... and ... ,表示结果在这之间，between and是一个闭区间。</div>
		<div>!=，&lt;&gt;，^=，这三个都标识不等于，&lt;=，&gt;=，=，这些运算符都可以使用。</div>
		<div>... in (va1,val2,...) 判断结果是否在这个枚举中存在 </div>
		<div>like '...' 字符串通配查询，'%'表示多个字符，'_'，表示一个字符。</div>
		<div>... and ... 表示只有两个条件同时满足</div>
		<div>... or ... 表示条件只要满足其中只一就可以</div>
		<div>all ... 是要求都满足条件。</div>
		<div>not .....，则是可以与以上的条件产生反效果。</div>
		<div>... is null 使用来判断值是不是空。</div>
		<div>注意：Oracle中的字符串是严格区分大小写的。 </div>
		<div> </div>
		<div>1.注意数据类型</div>
		<div>2.选择合适的运算符</div>
		<div> </div>
		<div>
				<strong>Oracle</strong>
				<strong>数据库函数（单行函数）</strong>
		</div>
		<div> </div>
		<div>Oracle中的函数和C中的函数差不多，也是有函数名，参数表，和返回值类型组成的</div>
		<div> </div>
		<div>1,字符函数</div>
		<div>
				<span>   </span>字符是大小写敏感的</div>
		<div>
				<span>   </span>转小写 lower(...)</div>
		<div>
				<span>   </span>转大写 upper(...)</div>
		<div>
				<span>   </span>首字母大写 initcap(...)</div>
		<div>
				<span>   dual</span>表，是专门用于函数测试和运算的，他只有一条记录<span>      </span></div>
		<div>
				<span>   </span>字符串拼接 concat(...,....)</div>
		<div>
				<span>   </span>求指定子串 substr(...,起始位置，取字符个数)</div>
		<div>
				<span>   </span>可以使用"-"表示从右向左取，取的时候可以从左往友取。</div>
		<div>
				<span>    </span>例：select substr(first_name,-2,2) sub from s_emp;（取后两个）</div>
		<div>
				<span>       select substr(first_name,2,2) sub from s_emp;</span>（取前两个）</div>
		<div>2,数值函数</div>
		<div>
				<span>   </span>四舍五入 round(数据,保留小数点后几位)</div>
		<div>
				<span>   </span>可以用负数表示小数点前，0，表示小数点后第一位，也就是保留个位，-1表示个位（保留到十<span>   </span>位）。</div>
		<div>
				<span>   </span>例：select round(15.36,1) from dual;</div>
		<div>
				<span>   </span>截取数字函数 trunc(数据，保留的位数（小数点后位数）) 截取个位之后补0</div>
		<div>
				<span>   </span>例：select trunc(123.456,1) from dual;</div>
		<div>3，日期函数</div>
		<div>
				<span>   </span>日期格式，</div>
		<div>
				<span>   </span>全日期格式 世纪信息，年月日，时分秒。</div>
		<div>
				<span>   </span>缺省日期格式，日-月-年 dd-mon-rr</div>
		<div>
				<span>   </span>修改当前会话的日期格式，会按照指定的格式输出日期</div>
		<div>
				<span>   alter session set nls_date_format='yyyy mm dd hh24:mi:ss';</span>
		</div>
		<div>
				<span>   </span>返回当前日期 sysdate</div>
		<div>
				<span>   </span>例：select sysdate from dual;</div>
		<div>
				<span>   </span>日期是格式敏感的</div>
		<div>
				<span>   </span>求两个日期间相隔了多少个月 months_between(date1,date2)</div>
		<div>
				<span>   </span>加减指定数量的月份 add_months(date,月数)，月数可以为负，负值就是减去相应的月数。</div>
		<div>
				<span>   </span>从下周开始的日期加一天 next_day(date,天数)</div>
		<div>
				<span>   </span>例：select next_day(sysdate,2) from dual;</div>
		<div>
				<span>   </span>返回月末的日期 last_day(date)</div>
		<div>
				<span>   </span>截取日期 trunc(date,'年或月或日或时分秒')</div>
		<div>
				<span>   </span>例：select trunc(add_months(sysdate,1),'month') from dual;</div>
		<div> </div>
		<div>4，不同数据类型间转换函数</div>
		<div>
				<span>   </span>将日期转成字符 tochar(date,'日期格式') </div>
		<div>
				<span>   </span>日期格式要用有效格式，格式大小写敏感 'yyyy mm dd hh24:mi:ss','year'(全拼的年),'mm'(数字表示的月) 'month'(全拼的月)，'day'(星期的全拼)，'ddspth' (日期的全拼) 'yy mm dd'</div>
		<div>
				<span>   </span>例：select to_char(sysdate,'yyyy mm dd hh24:mi:ss')from dual;</div>
		<div>
				<span>   </span>将字符转换成数字 to_number('...')</div>
		<div>
				<span>   </span>将数字转字符to_char(number，'fmt') fmt是数字格式</div>
		<div>
				<span>   </span>将字符串转成日期 to_date('...','日期格式')</div>
		<div>
				<span>   </span>例：select to_char(to_date('2006 11 03','yyyy mm dd'),'dd-month-yy') from dual；</div>
		<div>5，函数嵌套</div>
		<div style="TEXT-INDENT: 21.75pt">例：select to_char(to_date('2006 11 03','yyyy mm dd'),'dd-month-yy') from dual；</div>
		<div style="TEXT-INDENT: 21.75pt"> </div>
		<div>
				<strong>表连接（关联查寻）</strong>
		</div>
		<div>如果多表查询时不加where子句，也就是过滤条件或者是使用了无效的条件，就会产生两表之间记录的相互逐条匹配（组合），产生很多无效的结果（笛卡尔积）。</div>
		<div>注意：在使用表连接时，要注意查询的表间的关系信息，表之间的字段所表示的信息的关系</div>
		<div>等值连接</div>
		<div> select [表别名1.字段名1]，[表别名2.字段名2],... </div>
		<div> from 表1 表别名1 ，表2 表别名2</div>
		<div> where 表别名1.字段名3=表别名2.字段名4;</div>
		<div> 表连接时，当表与表之间有同名字段时，可以加上表名或表的别名，加以区分，使用时要用</div>
		<div>表名.字段名或表别名.字段名（列名）。当表的字段名是唯一时，可以不用加上表名或表的别名。</div>
		<div>注意：当为表起了别名，就不能再使用表名.字段名</div>
		<div>例：select a.first_name,a.last_name,b.name from s_emp a,s_dept b where a.dept_id=b.id;</div>
		<div> </div>
		<div>
				<strong>非等值连接</strong>
		</div>
		<div> select [表别名1.字段名1]，[表别名2.字段名2],... </div>
		<div> from 表1 表别名1 ，表2 表别名2</div>
		<div> where 表别名1.字段名3 ..... 表别名2.字段名4</div>
		<div> ....可以使比较运算符，也可以使其他的除了'='的运算符</div>
		<div>例：select e.ename, d.grade,e.sal from emp e,salgrade d where e.sal between d.losal and d.hisal;</div>
		<div> </div>
		<div>
				<strong>自连接</strong> 用别名把一张表中的数据分成两部分，然后在使用条件过滤。</div>
		<div> select [表别名1.字段名1]，[表别名2.字段名2],... </div>
		<div> from 表1 表别名1 ，表1 表别名2</div>
		<div> where 表别名1.字段名3=表别名2.字段名4;</div>
		<div>例：select a.first_name ename,b.first_name cname from s_emp a,s_emp b where a.manager_id=b.id;</div>
		<div>以上所提到的表连接，都叫做<strong>内连接。</strong></div>
		<div>
				<strong>
				</strong> </div>
		<div> </div>
		<div>
				<strong>外连接</strong> 会使用一方表中的所有记录去和另一格表中的记录按条件匹配，空值也会匹配，这个表中的所有记录都会显示，数据库会模拟出记录去和那些不匹配的记录匹配。</div>
		<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(+);</div>
		<div>注意：要把那一方的记录全部都显示出来，还有注意条件(+)跟在要全部显示的那个表的字段后。</div>
		<div> </div>
		<div>
				<strong>组函数</strong>
		</div>
		<div>group 组 </div>
		<div>group by 分组子句，按指定的分组规则分组 ，这个group by 子句可以跟在 select 语句后或是 having后面。group by子句也会出发排序操作，会按分组字段排序。</div>
		<div> </div>
		<div>select [组函数或分组的字段名] ，... from 表名 group by [字段名1],[字段名2],.....；</div>
		<div>例：select avg(salary) from s_emp group by dept_id;</div>
		<div> </div>
		<div>注意：组函数可以处理一组数据，返回一个值。组函数会忽略空值。count()除外，他会把空记录也记录在内。</div>
		<div> </div>
		<div>avg(..),求平均值，sum(..),求和 这两个函数的参数只能是number型的。</div>
		<div> </div>
		<div>以下所提到的函数可以使用任意类型做参数。</div>
		<div>count(..)，用来统计记录数，可以使用排重命令。count(...)默认使用的是all。</div>
		<div>max(..),min(..)求最大值和最小值，</div>
		<div>count(*),统计表中记录数。</div>
		<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;</div>
		<div>注意：只要写了group by子句，select后就只能用group by后的字段或者是组函数。</div>
		<div>
				<span>      where</span>子句只能够过滤记录。</div>
		<div>having子句可以过滤组函数结果或是分组的信息，且写在group by子句后。</div>
		<div>例:</div>
		<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)&gt;4000;</div>
		<div> </div>
		<div>column 也可以定义有别名的列的格式。</div>
		<div>column "别名" 格式定义</div>
		<div>注意：要先过滤掉不需要的记录，然后再进行分组操作，提高效率。</div>
		<div> </div>
		<div>
				<strong>子查询</strong>
		</div>
		<div>子查询，就是可以嵌在任何的sql语句中的select语句。</div>
		<div> </div>
		<div>在select语句中嵌套子查询时，会先执行子查询。一般的会将子查询放在运算符的右边。</div>
		<div> </div>
		<div>注意：在使用子查询时，要注意这个运算符是单行的（也就是只能是单值），还是多行运算符（范围，多值）。配合使用子查询返回的结果必须符合运算符的用法。</div>
		<div>例:</div>
		<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';</div>
		<div> </div>
		<div>select first_name,title from s_emp where title in (select title from s_emp where last_name='Smith') and upper(last_name)!='SMITH';</div>
		<div> </div>
		<div>
				<strong>数据库设计</strong>
		</div>
		<div> </div>
		<div>数据库表设计，把业务需求转换成可操作的表。</div>
		<div>1，需求分析，了解客户的业务需求（业务技能）。</div>
		<div>2，设计，通过ER图（实体关系图）</div>
		<div>3，建表</div>
		<div>4，测试</div>
		<div>5，形成产品</div>
		<div> </div>
		<div>
				<strong>ER</strong>
				<strong>图</strong>
		</div>
		<div>将一类事物的共性抽象处来成为一个实体，并且表现出来实体间的关系。</div>
		<div>unique identifier 唯一的值</div>
		<div>primary with<span>     '#*' </span>唯一且非空</div>
		<div>indispensable 必要的（也就是要求必须非空）</div>
		<div> </div>
		<div>
				<strong>实体关系</strong>
		</div>
		<div>one to one 一对一关联，one to many 一对多关联，many to many 多对多关联</div>
		<div>反射关联，自身的属性之间的关联</div>
		<div> </div>
		<div>
				<strong>ER</strong>
				<strong>图转换成表</strong>
		</div>
		<div>
				<strong>
				</strong> </div>
		<div> </div>
		<div>
				<strong>第一范式</strong>，所有的属性都必须是单值，也就是属性只表示单一的意义。（记录可以重复，没有任何限制）</div>
		<div>
				<strong>第二范式</strong>，属性要求唯一且非空，（记录不可重复，但是数据可能会出现冗余）。</div>
		<div>
				<strong>第三范式</strong>，非主属性只能依赖于主属性，不能依赖于其他非主属性。（解决数据冗余问题）</div>
		<div> </div>
		<div>
				<strong>
						<span style="FONT-SIZE: 12pt">约束</span>
				</strong>
		</div>
		<div>约束是针对表中的字段进行定义的。</div>
		<div> </div>
		<div>
				<strong>primary key</strong> （主键约束 PK）保证实体的完整性，保证记录的唯一</div>
		<div>主键约束，唯一且非空，并且每一个表中只能有一个主键，有两个字段联合作为主键，只有两个字段放在一起唯一标识记录，叫做联合主键。</div>
		<div> </div>
		<div>
				<strong>foreign key </strong>（外建约束 FK）保证引用的完整性，</div>
		<div>外键约束，外键的取值是受另外一张表中的主键或唯一值得约束，不能够取其他值，只能够引用主键会唯一键的值，被引用的表，叫做parent table（父表），引用方的表叫做child table（子表），要想创建子表，就要先创建父表，后创建子表，记录的插入也是如此，先父表后子表，删除记录，要先删除子表记录，后删除父表记录，要修改记录，如果要修改父表的记录要保证没有被子表引用。要删表时，要先删子表，后删除父表。</div>
		<div> </div>
		<div>
				<strong>unuque key</strong>（唯一键），值为唯一</div>
		<div> </div>
		<div>index（索引）是数据库特有的一类对象，view（视图）</div>
		<div>典型的一对多 class 对应多个学生。</div>
		<div>student table<span>                      class table </span></div>
		<div> ______________________________<span>     _________________________</span></div>
		<div>| id | name | address| class_id|<span>   | id |class_desc|class_num|</span></div>
		<div>|(PK)|______|________|___(FK)__|<span>   |(pk)|__________|_________|</span></div>
		<div>|<span>    |      |        |         |   |    |          |         |</span></div>
		<div> </div>
		<div>
				<strong>一对一</strong>
		</div>
		<div> </div>
		<div>student tabel<span>             shenfenzheng table</span></div>
		<div> ____________________<span>     _________________________________</span></div>
		<div>| id | name | address|<span>   | s_id |shenfen_desc|shenfen_num|</span></div>
		<div>|(PK)|______|________|<span>   |(PK</span>，FK)|____________|___________|</div>
		<div>|<span>    |      |        |   |        |            |           |</span></div>
		<div> </div>
		<div>
				<strong>多对多</strong>
		</div>
		<div> </div>
		<div>student tabel<span>             zhongjian table                      kecheng table</span></div>
		<div> ____________________<span>     _________________________________    __________________</span></div>
		<div>| id | name | address|<span>   | s_id |shenfen_desc|shenfen_num| | kid | kechengname|</span></div>
		<div>|(PK)|______|________|<span>   |(FK</span>，FK)|____________|___________| | (PK)|____________|</div>
		<div>|<span>    |      |        |   |</span>联合主键|<span>            |           | |     |            |</span></div>
		<div> </div>
		<div>引用对方表的主键,当作本身的主键,所以这个表的主键,既是主键又是外建</div>
		<div> </div>
		<div>建表和其他相关操作</div>
		<div> </div>
		<div>
				<strong>
						<span style="FONT-SIZE: 12pt">DDL</span>
				</strong>
				<strong>
						<span style="FONT-SIZE: 12pt">语句</span>
				</strong>
		</div>
		<div>
				<strong>
				</strong> </div>
		<div>
				<strong>创建表：</strong>
		</div>
		<div>
				<span>   create    table </span>表名<span>   (    </span>字段名1<span>    </span>类型(数据长度)(default ...)<span>   </span>约束条件，<span>   </span>字段名2<span>    </span>类型(数据长度)<span>    </span>约束条件 );</div>
		<div> </div>
		<div>
				<strong>Oracle</strong>
				<strong>数据库中的数据类型</strong>
		</div>
		<div>varchar(长度)，可变长字符串，char(长度) 定长</div>
		<div>number(..,..),number 表示浮点数，或者是整数</div>
		<div>long 大对象，clog 字符的大对象，相当于文本文件在表中只存放一个相当于只针对值 </div>
		<div>
				<span>             blog </span>二进制的大对象，也是以相当于指针的形式存放的。</div>
		<div>primary key约束：</div>
		<div>主键约束的定义：</div>
		<div>第一种定义形式：</div>
		<div>create table<span>   test(c number primary key );     </span>列级约束</div>
		<div>第二种定义形式：</div>
		<div>create table test(c number , primary key(c) ) ; 表级约束</div>
		<div>create table<span>   test( c1 number constraints   pkc1 primary key );   </span>此约束有名字: pkc1</div>
		<div>create table<span>   test(c number , c2 number , primary key (c ,c1) ); </span>用表级约束可以实现联合主键</div>
		<div> </div>
		<div>foregin key<span>   (fk)   </span>外键约束:</div>
		<div>(先定义父表，再定义子表）</div>
		<div>carete<span>   table     parent(c1 number primary key );</span></div>
		<div>create<span>   table    child (c number primary key ,   c2 number references parent(c1));</span></div>
		<div>或表级约束定义:</div>
		<div>create<span>   table child( c number primary key , c2 number , foreign key(c2) references parent(c1));</span></div>
		<div> </div>
		<div>
				<strong>约束</strong>
		</div>
		<div> </div>
		<div>非空约束（not null）这是一个列级约束</div>
		<div>在建表时,在数据类型的后面加上 not null ，也就是在插入时不允许插入空值。</div>
		<div> </div>
		<div>例：create table student(id number primary key,name varchar2(32) not null,address varchar2(32));</div>
		<div> </div>
		<div>unique 唯一约束</div>
		<div> </div>
		<div>唯一约束，是会忽略空值的，唯一约束，要求插入的记录中的值是为一的。</div>
		<div> </div>
		<div>例：create table student(id number，name varchar2(32),address varchar2(32),primary key (id),unique (address));</div>
		<div> </div>
		<div>check约束</div>
		<div> </div>
		<div>检查约束，可以按照指定条件，检查记录的插入。check中不能使用尾列，不能使用函数，不能引用其他字段。</div>
		<div>例：create table sal (a1 number , check(a1&gt;1000));</div>
		<div> </div>
		<div>创建脚本<span>   </span>例：见课本相应章节</div>
		<div> </div>
		<div> </div>
		<div> </div>
		<div>
				<strong>一对一建表语句</strong>
		</div>
		<div> </div>
		<div>student table</div>
		<div> </div>
		<div>create table student(</div>
		<div>
				<span>       id number,</span>
		</div>
		<div>
				<span>       name varchar2(32),</span>
		</div>
		<div>
				<span>       address varchar2(32)</span>
		</div>
		<div>
				<span>       primary key(id)</span>
		</div>
		<div>);</div>
		<div> </div>
		<div>shenfenzheng table</div>
		<div> </div>
		<div>create tabel shenfenzheng( </div>
		<div>
				<span>       sid number primary key, </span>
		</div>
		<div>
				<span>       num number unique not null,</span>
		</div>
		<div>
				<span>       foreign key (sid) references student(id)</span>
		</div>
		<div>);</div>
		<div> </div>
		<div>
				<strong>一对多</strong>
		</div>
		<div> </div>
		<div>class table</div>
		<div>一</div>
		<div>create table class(</div>
		<div>
				<span>        cid number,</span>
		</div>
		<div>
				<span>        class_num number,</span>
		</div>
		<div>
				<span>        desc varchar2(32),</span>
		</div>
		<div>
				<span>        primary key(cid)</span>
		</div>
		<div>);</div>
		<div> </div>
		<div>student table</div>
		<div>多</div>
		<div>create table student(</div>
		<div>
				<span>       id number,</span>
		</div>
		<div>
				<span>       name varchar2(32),</span>
		</div>
		<div>
				<span>       address varchar2(32)</span>
		</div>
		<div>
				<span>       class_id number,</span>
		</div>
		<div>
				<span>       primary key(id),foreign key (class_id) references class(cid)</span>
		</div>
		<div>);</div>
		<div> </div>
		<div> </div>
		<div> </div>
		<div> </div>
		<div> </div>
		<div>
				<strong>数据字典</strong>
		</div>
		<div> </div>
		<div>数据字典是由系统维护的，包含的数据库的信息</div>
		<div>数据字典视图</div>
		<div>user_XXXXX 用户视图</div>
		<div>all_XXXXX 所有视图</div>
		<div>dba_XXXXX 数据库中所有视图</div>
		<div>v$_XXXXX<span>   </span>动态性能视图</div>
		<div> </div>
		<div>dist或 distionary 表示数据字典的数据字典。</div>
		<div> </div>
		<div>user_constraints 用户的表中约束的表</div>
		<div>其中有constraints_name字段存放的是约束名，r_constraints_name字段表示外键引用子何处</div>
		<div>这两个字段之间有自连接的关系，也就是约束名和外键约束名之间的自连接。</div>
		<div> </div>
		<div>user_cons_column表，是用户的列级约束表</div>
		<div> </div>
		<div>
				<strong>
						<span style="FONT-SIZE: 12pt">DML</span>
				</strong>
				<strong>
						<span style="FONT-SIZE: 12pt">操作</span>
				</strong>
		</div>
		<div>
				<strong>
				</strong> </div>
		<div>
				<strong>insert</strong>
				<strong>操作，插入记录</strong>
		</div>
		<div> </div>
		<div>insert into 表名 values(值1，值2，......);</div>
		<div>注意这种方法插入记录时，要对所有字段进行插入，没有非空约束时，又不想插入值时，要用空值替代，并且要按照字段的顺序插值（要清楚表结构），且要注意数据类型一致。</div>
		<div> </div>
		<div>insert into 表名(字段名1，字段名2，.....) values(值1，值2，......);</div>
		<div>这种方法可以对指定的字段进行插入，不想插值的就可以不写，前提是该字段没有非空约束。</div>
		<div> </div>
		<div>例：insert into student values(1,'xxx','xxx');</div>
		<div>
				<span>    insert into student(id,name,address) values(1,'xxx','xxx');</span>
		</div>
		<div> </div>
		<div>
				<strong>update</strong>
				<strong>修改操作</strong>
		</div>
		<div> </div>
		<div>update table 表名 set 字段名1=数据1或表达式1， 字段名2=数据2或表达式2 </div>
		<div>[where ....=....];</div>
		<div>例：update shenfenzhen set num=99 where sid=2;</div>
		<div> </div>
		<div>
				<strong>delete</strong>
				<strong>删除操作</strong>
		</div>
		<div> </div>
		<div>delete from 表名 [where ...=...];</div>
		<div>例：update shenfenzhen set num=99 where sid=2;</div>
		<div>用delete操作删除的记录可以通过 rollback命令回滚操作，会恢复delete操作删除的数据。</div>
		<div>delete操作不会释放表所占用的空间，delete不是和删除记录多的大表。delete操作会占用大量的系统资源。</div>
		<div>
				<strong>事务transaction</strong>
		</div>
		<div>
				<strong>
				</strong> </div>
		<div>
				<strong>OLTP</strong>（<strong>联机事务处理</strong> OnLine Transaction Process）</div>
		<div>原子操作，也就是不可分割的操作，必须一起成功一起失败。</div>
		<div>要是实现一个原子操作，就要把这个原子操作（操作数据库数据(DML操作)）放在事务中。</div>
		<div>事务的结束动作 就是commit;语句 rollback;语句，DDL，DCL语句执行会自动提交commit;。</div>
		<div>sqlplus正常退出是会做提交动作的commit;，当系统异常推出是，会执行回滚操作rollback;。</div>
		<div>事务的开始，一个事务的开始就是上一个事务的结束。</div>
		<div>一个没有结束的事务，叫做活动的事务 (active transaction),活动的事务中修改的数据，只有本会话才能看见。</div>
		<div>readcommited，只可以读取已经作提交操作的数据，本会话可以看到自己的所作的没有提交的操作。</div>
		<div>在活动事务中，当多个用户同时对同一张表进行操作时，会对表加上表级共享锁，当用户对操作该表某一条记录进行操作时会对该条记录加上行级排它锁，只允许一个用户对该条记录进行DML操作，只有提交操作commit;或回滚操作rollback;时，才可让其他用户操作对该记录进行DML操作，也就是释放了该条记录的行级排它锁。如果没有提交操作或回滚操作，那么该用户就不能对该条记录加锁，该用户的DML操作就会进入等待状态，但是在对表作drop操作（DDL操作）时，如果还有用户在操作该表，也就是没有释放表级共享锁，就会直接报错。</div>
		<div> </div>
		<div>事务越大，就会消耗更多的资源，并长时间持有事务会造成无法进行其他的操作，事物提交太频繁的话，会对I/O造成很大的负担，所以要合理确定事务的大小。</div>
		<div> </div>
		<div>
				<strong>commit</strong>;提交操作，事物的结束</div>
		<div> </div>
		<div>
				<strong>rollback</strong>;回滚操作，会将先前的活动事务中的操作（DML操作）的结果进行回滚，撤销全部操作，恢复成事务开始时的数据，也就是恢复成事务开始时的状态。</div>
		<div> </div>
		<div>
				<strong>alter table</strong>
				<strong>命令</strong>
		</div>
		<div>alter table 命令用于修改表的结构(这些命令不会经常用)：</div>
		<div> </div>
		<div>增加字段：</div>
		<div>alter table 表名　add(字段字，字段类型)</div>
		<div> </div>
		<div>删除字段<strong>：</strong></div>
		<div>alter tbale 表名 drop column 字段; (8i 以后才支持)</div>
		<div> </div>
		<div>给列改名:9.2.0才支持</div>
		<div>alter table 表名 rename column 旧字段名 to 新字段名;</div>
		<div> </div>
		<div>修改字段</div>
		<div>alter table 表名 modify( 字段，类型)</div>
		<div>(此时应注意的问题，更改时要看具体值情况之间的转达换，　改为字符类型时，必须要为空)</div>
		<div>not null约束是使用alter table .. modify (..,not null)，来加上的。</div>
		<div>增加约束：</div>
		<div>alter table 表名 add constraint [约束名] 约束(字段);</div>
		<div>只能够增加表级约束。</div>
		<div> </div>
		<div>解除约束：(删除约束)</div>
		<div> </div>
		<div>alter table 表名 drop 约束;</div>
		<div>（对于主键约束可以直接用此方法，因为一张表中只有一个主键约束名, 注意如果主键此时还有其它表引用时删除主键时会出错）</div>
		<div> </div>
		<div>alter table father drop primary key cascade; </div>
		<div>(如果有子表引用主键时，要用此语法来删除主键,这时子表还存在只是子表中的外键约束被及联删除了）</div>
		<div> </div>
		<div>alter table 表名 drop constraint 约束名;</div>
		<div>(怎样取一个约束名：</div>
		<div>a、人为的违反约束规定根据错误信息获取!</div>
		<div>b、查询视图获取约束名!)</div>
		<div> </div>
		<div>使约束失效或者生效</div>
		<div> </div>
		<div>alter table 表名 disable from primary key; (相当于把一个表的主键禁用)</div>
		<div> </div>
		<div>alter table 表名 enable primary key;</div>
		<div>（enable 时会自动去检查表的记录是不是符合要求,如果有脏数据时必须要先删除脏数据才可以 enable）</div>
		<div> </div>
		<div>
				<strong>更改表名</strong>
		</div>
		<div>rename 旧表名 to 新表名;</div>
		<div> </div>
		<div>
				<strong>删除表</strong>：</div>
		<div>trucate table 表名;</div>
		<div>(表结构还在，数据全部删除，释放表所占的空间，不支持回退,常用删除大表)</div>
		<div> </div>
		<div>关于oralce中产生序列(sequence)</div>
		<div>create sequence 序列名;</div>
		<div> </div>
		<div>(不带参数时默认为从1 开始每次递增 1，oracle中为了提高产生序列的效率一般一次性产生20个序列放入当前会话的序列池中备用以加快效率，序列会出现不连续的动作回退操作不会影响序列取值)</div>
		<div> </div>
		<div> </div>
		<div> </div>
		<div>
				<strong>
						<span style="FONT-SIZE: 12pt">sequence</span>
				</strong>的参数：</div>
		<div>increment by n<span>   </span>起始值</div>
		<div>start with n<span>     </span>递增量 </div>
		<div>maxvalue n<span>       </span>最大值 </div>
		<div>minvalue n<span>       </span>最小值</div>
		<div>cycle|no cycle<span>   </span>轮回 </div>
		<div>cache n<span>          </span>缓存(第一次取时会一次取多少个id存起来)</div>
		<div> </div>
		<div>查看sequence 视图：</div>
		<div>desc<span>    user_sequences ;</span></div>
		<div>select<span>   sequence_name , cache_size , last_number from user_sequences   where   sequence_name like 's_';</span></div>
		<div>select 序列名.currval from<span>   dual    </span>查看当前的序列数</div>
		<div>select 序列名.nextval  from<span>   dual    </span>查看下一个序列数，它会自动给当前的序列加１</div>
		<div>为列：nextval<span>          currval</span></div>
		<div>(开另一个session时取当前值不成功时，应该先取下一个值，再取当前值)</div>
		<div> </div>
		<div>清空当前会话的内存：</div>
		<div>alter system flush<span>   shared_pool;</span>（执行此命令要有DBA权限，一般用户执行出错）</div>
		<div> </div>
		<div>修改序列：(此命令不常用，只需了解就行不必深究)</div>
		<div>alter sequence 序列名 修改项；</div>
		<div>删除序列sequence</div>
		<div>drop sequence 序列名;</div>
		<div> </div>
		<div>
				<strong>视图</strong>
		</div>
		<div> </div>
		<div>创建视图： </div>
		<div>creating views 视图名;</div>
		<div> </div>
		<div>视图就相当于一条select 语句,定义了一个视图就是定义了一个sql语句,视图不占空间,使用view 不会提高性能，但是能简单化sql语句</div>
		<div>（扩展知识： oracle 8i 以后的新视图）</div>
		<div>MV 物化视图(占存储空间，把select 结果存在一个空间，会提高查询视图,增强实时性，但是存在刷新问题，物化视图中的数据存在延迟问题，主要应用在数据仓库中用要用于聚合表)</div>
		<div> </div>
		<div>使用视图的好处：控制数据访问权限。</div>
		<div> </div>
		<div>如何创建一个视图的例子：</div>
		<div>create or replace views test_vi as select * from test1 where c1=1;</div>
		<div> </div>
		<div>or replace的意义，如果view存在就覆盖，不存在才创建。</div>
		<div>force|no force ，基表存在是使用，不存在是则创建该表。</div>
		<div>此时往表test1（base table 基表）中插入数据时：表中没能变化，视图中的数据发生改变</div>
		<div>从视图中插数据时相对应的表会发生改变:</div>
		<div>往视图中插数据时，会直接插进基表中，查看视图中的数据时，相当于就是执行创建时的select语句。</div>
		<div> </div>
		<div>限制对数据库的访问，简化查询。</div>
		<div>简单视图：来自于单表，且select语句中不能包括函数，能进行DML操作。</div>
		<div>复杂视图：来源于多张表，不能执行DML操作。</div>
		<div> </div>
		<div>视图的约束</div>
		<div>with read only 视图只读约束(O)</div>
		<div>with check option 不允许插入与where条件不符的记录，类似于check约束的功能(V)</div>
		<div> </div>
		<div>在select from 后也可以使用子查寻，这个写法也叫做内嵌视图</div>
		<div>例：</div>
		<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&gt;s.avgsal;</div>
		<div> </div>
		<div>删除视图 drop views 视图名;</div>
		<div> </div>
		<div>
				<strong>行号（rownum</strong>
				<strong>）</strong>
		</div>
		<div>关于rownum：</div>
		<div>rownum 有个特点要么等于1 要么小于某个值， 不能直接等于某个值, 不能大于某个值。</div>
		<div>rownum常用于分页显示。</div>
		<div>rownum只用于读入内存的数据。</div>
		<div> </div>
		<div>
				<strong>关于同义词</strong>：</div>
		<div> </div>
		<div>同义词:相当于别名的作用(***只需了解***）系统自建的同义词:</div>
		<div>user_tables</div>
		<div> </div>
		<div>create synonym asd_s_emp for asd_0606.s_emp ;</div>
		<div>目的就是为了给asd_0606_s_emp表起另一个代替的名称asd.s_emp;注意这个同义词只能自己使用;</div>
		<div>create public synonym p_s_emp fro asd_0606.s_emp; 创建公共的同义词，但是要权限.</div>
		<div>删除同义词：</div>
		<div>drop synonym<span>    </span>同义词名称</div>
		<div> </div>
		<div>
				<strong>索引（index</strong>
				<strong>）</strong>
		</div>
		<div> </div>
		<div>创建索引：Creating indexes(概念很重要对系统的性能影响非常大）</div>
		<div> </div>
		<div>建索引的目的就是为了加快查询速度。</div>
		<div> </div>
		<div>索引就相于一本的书的目录。索引点系统空间，属于表的附属物。删除一个表时，相对应的索引也会删除。索引是会进行排序。</div>
		<div> </div>
		<div>truncate 表时索引结构在，但是数据不存在。</div>
		<div> </div>
		<div>full table scan 全表扫描</div>
		<div>用索引就是为了快速定位数据：(理解时就以字典的目录为例)</div>
		<div>创建索引就是创建key和记录的物理位置（rowid）组成的键值对。索引是有独立的存储空间,但是和表是逻辑关联的,索引和表的关系是依附关系,表被删除了,索引也没有存在的意义也就被删除了</div>
		<div> </div>
		<div>在建表时会根据表中的PK或UK自动的建立唯一性索引。</div>
		<div> </div>
		<div>查看表的rowid：</div>
		<div>select rowid,first_name from s_emp;</div>
		<div>rowid 定义的信息有：object block table</div>
		<div> </div>
		<div>每条记录都有自己的rowid</div>
		<div> </div>
		<div>索引由谁创建：用户,建索引后会使DML操作效率慢，但是对用户查询会提高效率,这就是我们建索引的最终目的。</div>
		<div> </div>
		<div>创建一个索引：</div>
		<div>create index 索引名 on 表名 (字段名);</div>
		<div>create insex testindex on test(c1, c2);</div>
		<div> </div>
		<div>索引分为唯一性索引，联合索引。索引中是不会维护空值的。</div>
		<div> </div>
		<div>哪些字段应该建索引：创建索引就是为了减少物理读，索引会减少扫描的时间。</div>
		<div>经常要用where的子句的地方，所以要用索引.用不用索引，关键要看所查询的数据与所有数据的百分比，表越大，查询的记录越少，索引的效率就越高.</div>
		<div> </div>
		<div>替换变量：用&amp;符号来定义替换变量支持交互性提示,对于字符性的数字，一定要写在单引号之间</div>
		<div> </div>
		<div>更改交互的提示信息：</div>
		<div>accept p_dname prompt ' 提示信息';</div>
		<div>定义变量：</div>
		<div>define p_dname='abc';</div>
		<div> </div>
		<div>set<span>    verify on</span></div>
		<div>set<span>    verify off;</span></div>
		<div>相当于开关变量，用于控制是否显示新旧的sql语句</div>
		<div>select id,last_name,salary from s_emp where title='&amp;job_title';</div>
<img src ="http://www.blogjava.net/hua/aggbug/94238.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hua/" target="_blank">花</a> 2007-01-16 16:43 <a href="http://www.blogjava.net/hua/archive/2007/01/16/94238.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关ORACLE Cursor的问题ORA-01000: maximum open cursors exceeded</title><link>http://www.blogjava.net/hua/archive/2007/01/09/92642.html</link><dc:creator>花</dc:creator><author>花</author><pubDate>Tue, 09 Jan 2007 08:46:00 GMT</pubDate><guid>http://www.blogjava.net/hua/archive/2007/01/09/92642.html</guid><wfw:comment>http://www.blogjava.net/hua/comments/92642.html</wfw:comment><comments>http://www.blogjava.net/hua/archive/2007/01/09/92642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hua/comments/commentRss/92642.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hua/services/trackbacks/92642.html</trackback:ping><description><![CDATA[
		<div>
				<span style="FONT-WEIGHT: bold; COLOR: #ff0000; FONT-FAMILY: 宋体">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........</span>
		</div>
		<div> </div>
		<div>
				<dd>
						<a>
						</a>
						<p>
								<strong>Cause:</strong> A host language program attempted to open too many cursors. The initialization parameter OPEN_CURSORS determines the maximum number of cursors per user.</p>
				</dd>
				<dd>
						<a>
						</a>
						<p>
								<strong>Action:</strong> 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.</p>
						<div>
								<span>
								</span> </div>
						<div> </div>
						<div>关于cursor 的参数有这么几个：</div>
						<div>SQL&gt; show parameter cursor</div>
						<div>NAME                                 TYPE        VALUE<br />------------------------------------ ----------- ------------------------------<br />cursor_sharing                       string      EXACT<br />cursor_space_for_time                boolean     FALSE<br />open_cursors                         integer     800<br />session_cached_cursors               integer     0<br /></div>
						<div> </div>
						<div>这里，cursor_sharing跟open_cursors的数量没有关系。open_cursors的数量，它包括了oracle服务器端session_cached_cursors的数量，以及应用服务器端cursor cache size的数量。</div>
						<div> </div>
						<div>
								<span>关于session_cached_cursors这个参数，可以看 <a href="http://spaces.msn.com/wzwanghai/"><font color="#5f40a8">汪海</font></a> 写的2篇文章：</span>
						</div>
						<div>
								<span>
										<a href="http://spaces.msn.com/wzwanghai/Blog/cns!1p6cztYuyVBgutMjvxSWkuhw!151.entry">
												<font color="#5f40a8">v$open_cursor与session_cached_cursor</font>
										</a>
								</span>
						</div>
						<div>
								<span>
										<span>
												<a href="http://spaces.msn.com/wzwanghai/blog/cns!56626E237AFBD116!187.entry">
														<font color="#5f40a8">session_cached_cursors,cursor_space_for_time,gets,pin</font>
												</a>
										</span>
								</span>
						</div>
						<div>
								<span>
								</span> </div>
						<div>
								<span>
								</span> </div>
						<div>
								<span>这个问题的根源，除了上面3个参数，主要在于程序的问题，在itpub 上我们可以看到：</span>
						</div>
						<div>
								<span>
										<font face="Verdana" color="#047400">
												<a href="http://www.itpub.net/showthread.php?s=&amp;threadid=122832&amp;perpage=40&amp;pagenumber=1">关于Java开发中使用Oracle数据库的一点注意事项</a>
										</font>
								</span>
						</div>
				</dd>
		</div>
		<div>
				<span style="FONT-WEIGHT: bold; COLOR: #ff0000; FONT-FAMILY: 宋体">
						<div>  </div>
				</span>
		</div>
		<div style="COLOR: #000000">
				<font face="verdana, arial, helvetica" size="2">
						<span class="javascript" id="text706387">很多朋友在Java开发中，使用Oracle数据库的时候，经常会碰到有ORA-01000: maximum open cursors exceeded.的错误。<br /><br />实际上，这个错误的原因，主要还是代码问题引起的。 <br />ora-01000: maximum open cursors exceeded. <br />表示已经达到一个进程打开的最大游标数。 <br /><br />这样的错误很容易出现在Java代码中的主要原因是：Java代码在执行conn.createStatement()和conn.prepareStatement()的时候，实际上都是相当与在数据库中打开了一个cursor。尤其是，如果你的createStatement和prepareStatement是在一个循环里面的话，就会非常容易出现这个问题。因为游标一直在不停的打开，而且没有关闭。<br /><br />一般来说，我们在写Java代码的时候，createStatement和prepareStatement都应该要放在循环外面，而且使用了这些Statment后，及时关闭。最好是在执行了一次executeQuery、executeUpdate等之后，如果不需要使用结果集（ResultSet）的数据，就马上将Statment关闭。<br /><br />对于出现ORA-01000错误这种情况，单纯的加大open_cursors并不是好办法，那只是治标不治本。实际上，代码中的隐患并没有解除。 <br />而且，绝大部分情况下，open_cursors只需要设置一个比较小的值，就足够使用了，除非有非常特别的要求。</span>
				</font>
		</div>
		<div style="COLOR: #000000"> </div>
		<div style="COLOR: #000000">
				<span class="javascript" id="text1762931">
						<p>如果你不使用连接池，那么就没有什么问题，一旦Connection关闭，数据库物理连接就被释放，所有相关Java资源也可以被GC回收了。 <br /><br />但是如果你使用连接池，那么请注意，Connection关闭并不是物理关闭，只是归还连接池，所以PreparedStatement和ResultSet都被持有，并且实际占用相关的数据库的游标资源，在这种情况下，只要长期运行，往往就会报“游标超出数据库允许的最大值”的错误，导致程序无法正常访问数据库。 </p>
						<br />
						<p>---</p>
						<br />
						<p>这个关不关和使用不使用conn pool没有关系，一般操作是会是这样，线程从外界获取一个conn，然后创建自己地stmt,rs,然后执行逻辑操作，然后将conn返回给pool。 如果程序员忘记手动关地话。当这个线程执行完以后，stmt，rs都成垃圾，当他们被垃圾搜集地时候，gc会替我们把它们给关闭地。这就是很多代码没有关闭，仍然正常运行。 <br />但是这样会有一个潜在地问题。就是gc无法确定什么时候运行。如果free地内存很多，很可能有些gc就不会被启动，这样stmt迟迟没有被关闭，执行一段时间会报错。 <br />所以健壮地代码应该手工把rs,stmt都关闭</p>
						<br />
						<p>---</p>
						<br />
						<p>
								<font face="Verdana">Java连结Oracle常犯错误<br />1。只懂 createStatement,不懂关闭statement<br /><br />2.。只懂 createStatement,不懂preparedStatement.<br /><br />3 。只懂在sql里用to_date,甚至直接用String，不懂用 setDate()</font>
						</p>
						<p>---</p>
						<p>
								<span class="javascript" id="text113542">我记得.我的程序中也出现过这种问题, <br />主要原因是我get Connection 对象后,这个connectin没有被进行关闭, <br />同时进行出来的 preparedStatement 对象,不关闭也会出现这种问题, <br />而且,推荐这些数据库操作的变量尽量用局部变量,现用现取,随时关闭,而且放在finally{}中进行关闭,比较保险 </span>
						</p>
						<p>
								<span class="javascript">---</span>
						</p>
						<p>
								<span class="javascript">通常這樣的情形是你使用了超過DB設定同時可用的connection數量 <br />你可以試試看下列方式: <br />1. 若你使用connection pool, 你可以將connection pool的max connection <br />數量降低看看, 同時檢查有無歸還connection <br />2. 若未使用conneciton pool, 你就該檢查一下, 你的connection在使用過後 <br />有沒有關閉囉 <br /><br />另外一種情形是: 你的系統使用量真的很大, 所以同時150的DB connection <br />session是不夠的, 你就需要調整Oracle DB囉 </span>
						</p>
				</span>
				<div>
						<p>
								<font face="verdana, arial, helvetica" size="2">
										<span class="javascript" id="text1766071">通常的jdbc代码:<br />...<br />Statement stmt = null;<br />ResultSet rs = null;<br />try {<br />stmt = conn.createStatement();<br />rs = stmt.executeQuery('select xx from yy');<br />...<br />} catch (SQLExeption e) {<br />e.printlStackTrace();<br />} finally {<br />if (stmt != null) {<br />try {stmt.close();} catch (SQLException e) { }<br />}<br />}</span>
								</font>
						</p>
				</div>
		</div>
<img src ="http://www.blogjava.net/hua/aggbug/92642.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hua/" target="_blank">花</a> 2007-01-09 16:46 <a href="http://www.blogjava.net/hua/archive/2007/01/09/92642.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle数据库字符集问题总结</title><link>http://www.blogjava.net/hua/archive/2006/09/22/71265.html</link><dc:creator>花</dc:creator><author>花</author><pubDate>Fri, 22 Sep 2006 02:54:00 GMT</pubDate><guid>http://www.blogjava.net/hua/archive/2006/09/22/71265.html</guid><wfw:comment>http://www.blogjava.net/hua/comments/71265.html</wfw:comment><comments>http://www.blogjava.net/hua/archive/2006/09/22/71265.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hua/comments/commentRss/71265.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hua/services/trackbacks/71265.html</trackback:ping><description><![CDATA[
		<p 2em="">在不同数据库做数据迁移、同其它系统交换数据等，常常因为字符集不同而导致迁移失败或数据库内数据变成乱码。现在我将oracle字符集相关的一些知识做个简单总结 </p>
		<p 2em="">
		</p>
		<p 2em="">
				<b>一、什么是oracle字符集</b>
		</p>
		<p 2em="">
		</p>
		<p 2em="">Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储，处理，检索数据。它使数据库工具，错误消息，排序次序，日期，时间，货币，数字，和日历自动适应本地化语言和平台。 </p>
		<p 2em="">
		</p>
		<p 2em="">影响oracle数据库字符集最重要的参数是NLS_LANG参数。它的格式如下: </p>
		<p 2em="">
		</p>
		<center>
				<ccid_nobr>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" bgcolor="#e6e6e6" 9pt="">
														<pre>    NLS_LANG = language_territory.charset	                              </pre>
												</td>
										</tr>
								</tbody>
						</table>
				</ccid_nobr>
		</center>
		<p 2em="">
		</p>
		<p 2em="">
		</p>
		<p 2em="">它有三个组成部分(语言、地域和字符集)，每个成分控制了NLS子集的特性。其中: </p>
		<p 2em="">
		</p>
		<p 2em="">Language 指定服务器消息的语言，territory 指定服务器的日期和数字格式，charset 指定字符集。如:AMERICAN _ AMERICA. ZHS16GBK </p>
		<p 2em="">
		</p>
		<p 2em="">从NLS_LANG的组成我们可以看出，真正影响数据库字符集的其实是第三部分。所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据，前面影响的只是提示信息是中文还是英文。 </p>
		<p 2em="">
		</p>
		<p 2em="">
				<b>二、如何查询Oracle的字符集</b>
		</p>
		<p 2em="">
		</p>
		<p 2em="">很多人都碰到过因为字符集不同而使数据导入失败的情况。这涉及三方面的字符集，一是oracel server端的字符集，二是oracle client端的字符集;三是dmp文件的字符集。在做数据导入的时候，需要这三个字符集都一致才能正确导入。 </p>
		<p 2em="">
		</p>
		<p 2em="">
				<b>1、查询oracle server端的字符集</b>
		</p>
		<p 2em="">
		</p>
		<p 2em="">有很多种方法可以查出oracle server端的字符集，比较直观的查询方法是以下这种: </p>
		<p 2em="">
		</p>
		<center>
				<ccid_nobr>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" bgcolor="#e6e6e6" 9pt="">
														<pre>   SQL&gt;select userenv(‘language’) from dual</pre>
												</td>
										</tr>
								</tbody>
						</table>
				</ccid_nobr>
		</center>
		<p 2em="">
		</p>
		<p 2em="">
		</p>
		<p 2em="">结果类似如下:AMERICAN _ AMERICA. ZHS16GBK </p>
		<p 2em="">
		</p>
		<p 2em="">
				<b>2、如何查询dmp文件的字符集</b>
		</p>
		<p 2em="">
		</p>
		<p 2em="">用oracle的exp工具导出的dmp文件也包含了字符集信息，dmp文件的第2和第3个字节记录了dmp文件的字符集。如果dmp文件不大，比如只有几M或几十M，可以用UltraEdit打开(16进制方式)，看第2第3个字节的内容，如0354，然后用以下SQL查出它对应的字符集: </p>
		<p 2em="">
		</p>
		<center>
				<ccid_nobr>
						<table style="WIDTH: 419px; HEIGHT: 59px" cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="419" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" bgcolor="#e6e6e6" 9pt="">
														<pre>   SQL&gt; select nls_charset_name(to_number('0354','xxxx')) from dual;    <br />   ZHS16GBK</pre>
												</td>
										</tr>
								</tbody>
						</table>
				</ccid_nobr>
		</center>
		<p 2em="">
		</p>
		<p 2em="">
		</p>
		<p 2em="">如果dmp文件很大，比如有2G以上(这也是最常见的情况)，用文本编辑器打开很慢或者完全打不开，可以用以下命令(在unix主机上): </p>
		<p 2em="">
		</p>
		<center>
				<ccid_nobr>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" bgcolor="#e6e6e6" 9pt="">
														<pre>   cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6          	</pre>
												</td>
										</tr>
								</tbody>
						</table>
				</ccid_nobr>
		</center>
		<p 2em="">
		</p>
		<p 2em="">
		</p>
		<p 2em="">然后用上述SQL也可以得到它对应的字符集。 </p>
		<p 2em="">
		</p>
		<p 2em="">
				<b>3、查询oracle client端的字符集</b>
		</p>
		<p 2em="">
		</p>
		<p 2em="">这个比较简单。在windows平台下，就是注册表里面相应OracleHome的NLS_LANG。还可以在dos窗口里面自己设置，比如: </p>
		<p 2em="">
		</p>
		<center>
				<ccid_nobr>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" bgcolor="#e6e6e6" 9pt="">
														<pre>   set nls_lang=AMERICAN_AMERICA.ZHS16GBK						</pre>
												</td>
										</tr>
								</tbody>
						</table>
				</ccid_nobr>
		</center>
		<p 2em="">
		</p>
		<p 2em="">
		</p>
		<p 2em="">这样就只影响这个窗口里面的环境变量。 </p>
		<p 2em="">
		</p>
		<p 2em="">在unix平台下，就是环境变量NLS_LANG。 </p>
		<p 2em="">
		</p>
		<center>
				<ccid_nobr>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" bgcolor="#e6e6e6" 9pt="">
														<pre>
																<ccid_code>   $echo $NLS_LANG
   AMERICAN_AMERICA.ZHS16GBK    							</ccid_code>
														</pre>
												</td>
										</tr>
								</tbody>
						</table>
				</ccid_nobr>
		</center>
		<p 2em="">
		</p>
		<p 2em="">
		</p>
		<p 2em="">如果检查的结果发现server端与client端字符集不一致，请统一修改为同server端相同的字符集。 </p>
		<p 2em="">
				<b>三、修改oracle的字符集</b>
		</p>
		<p 2em="">
		</p>
		<p 2em="">上文说过，oracle的字符集有互相的包容关系。如us7ascii就是zhs16gbk的子集,从us7ascii到zhs16gbk不会有数据解释上的问题,不会有数据丢失。在所有的字符集中utf8应该是最大,因为它基于unicode,双字节保存字符(也因此在存储空间上占用更多)。 </p>
		<p 2em="">
		</p>
		<p 2em="">一旦数据库创建后，数据库的字符集理论上讲是不能改变的。因此，在设计和安装之初考虑使用哪一种字符集十分重要。根据Oracle的官方说明，字符集的转换是从子集到超集受支持,反之不行。如果两种字符集之间根本没有子集和超集的关系，那么字符集的转换是不受oracle支持的。对数据库server而言，错误的修改字符集将会导致很多不可测的后果，可能会严重影响数据库的正常运行，所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。一般来说，除非万不得已，我们不建议修改oracle数据库server端的字符集。特别说明，我们最常用的两种字符集ZHS16GBK和ZHS16CGB231280之间不存在子集和超集关系，因此理论上讲这两种字符集之间的相互转换不受支持。 </p>
		<p 2em="">
		</p>
		<p 2em="">
				<b>1、修改server端字符集(不建议使用)</b>
		</p>
		<p 2em="">
		</p>
		<p 2em="">在oracle 8之前，可以用直接修改数据字典表props$来改变数据库的字符集。但oracle8之后，至少有三张系统表记录了数据库字符集的信息，只改props$表并不完全，可能引起严重的后果。正确的修改方法如下: </p>
		<p 2em="">
		</p>
		<center>
				<ccid_nobr>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" bgcolor="#e6e6e6" 9pt="">
														<pre>   $sqlplus /nolog
   SQL&gt;conn / as sysdba                                                         </pre>
												</td>
										</tr>
								</tbody>
						</table>
				</ccid_nobr>
		</center>
		<p 2em="">
		</p>
		<p 2em="">
		</p>
		<p 2em="">若此时数据库服务器已启动，则先执行SHUTDOWN IMMEDIATE命令关闭数据库服务器，然后执行以下命令: </p>
		<p 2em="">
		</p>
		<center>
				<ccid_nobr>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" bgcolor="#e6e6e6" 9pt="">
														<pre>    SQL&gt;STARTUP MOUNT;
    SQL&gt;ALTER SYSTEM ENABLE RESTRICTED SESSION;
    SQL&gt;ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
    SQL&gt;ALTER SYSTEM SET AQ_TM_PROCESSES=0;
    SQL&gt;ALTER DATABASE OPEN;
    SQL&gt;ALTER DATABASE CHARACTER SET ZHS16GBK;
    SQL&gt;ALTER DATABASE national CHARACTER SET ZHS16GBK;
    SQL&gt;SHUTDOWN IMMEDIATE;
    SQL&gt;STARTUP</pre>
												</td>
										</tr>
								</tbody>
						</table>
				</ccid_nobr>
		</center>
		<p 2em="">
		</p>
		<p 2em="">
		</p>
		<p 2em="">
				<b>2、修改dmp文件字符集</b>
		</p>
		<p 2em="">
		</p>
		<p 2em="">上文说过，dmp文件的第2第3字节记录了字符集信息，因此直接修改dmp文件的第2第3字节的内容就可以‘骗’过oracle的检查。这样做理论上也仅是从子集到超集可以修改，但很多情况下在没有子集和超集关系的情况下也可以修改，我们常用的一些字符集，如US7ASCII，WE8ISO8859P1，ZHS16CGB231280，ZHS16GBK基本都可以改。因为改的只是dmp文件，所以影响不大。 </p>
		<p 2em="">
		</p>
		<p 2em="">具体的修改方法比较多，最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。比如想将dmp文件的字符集改为ZHS16GBK，可以用以下SQL查出该种字符集对应的16进制代码: </p>
		<p 2em="">
		</p>
		<center>
				<ccid_nobr>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" bgcolor="#e6e6e6" 9pt="">
														<pre>   SQL&gt; select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;
   0354                                                 			</pre>
												</td>
										</tr>
								</tbody>
						</table>
				</ccid_nobr>
		</center>
		<p 2em="">
		</p>
		<p 2em="">
		</p>
		<p 2em="">然后将dmp文件的2、3字节修改为0354即可。 </p>
		<p 2em="">
		</p>
		<p 2em="">如果dmp文件很大，用ue无法打开，就需要用程序的方法了。网上有人用java存储过程写了转换的程序(用java存储过程的好处是通用性教好，缺点是比较麻烦)。我在windows下测试通过。但要求oracle数据库一定要安装JVM选项。有兴趣的朋友可以研究一下程序代码. </p>
<img src ="http://www.blogjava.net/hua/aggbug/71265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hua/" target="_blank">花</a> 2006-09-22 10:54 <a href="http://www.blogjava.net/hua/archive/2006/09/22/71265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL入门学习 </title><link>http://www.blogjava.net/hua/archive/2006/08/25/65734.html</link><dc:creator>花</dc:creator><author>花</author><pubDate>Fri, 25 Aug 2006 03:51:00 GMT</pubDate><guid>http://www.blogjava.net/hua/archive/2006/08/25/65734.html</guid><wfw:comment>http://www.blogjava.net/hua/comments/65734.html</wfw:comment><comments>http://www.blogjava.net/hua/archive/2006/08/25/65734.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hua/comments/commentRss/65734.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hua/services/trackbacks/65734.html</trackback:ping><description><![CDATA[
		<h4 class="TextColor1" id="subjcns!A598B5498EA4C845!277" style="MARGIN-BOTTOM: 0px"> </h4>
		<div id="msgcns!A598B5498EA4C845!277">
				<table cellspacing="0" cellpadding="0" width="590" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span>
														<p align="left">
																<font size="2">安装篇 <br /><br />PHP+MySQL+Linux目前已逐渐成为小型web服务器的一种经典组合。在indows环境下构筑和调试MySQL数据库是许多网站开发者的一种首选。本人在Windows98环境下初学MySQL，现将学习过程与经验总结出来供大家参考。 <br /><br />1、下载mysql-3.23.35-win.zip并解压； <br /><br />2、运行setup.exe;选择d:\mysql,"tyical install" <br /><br />3、启动mysql，有如下方法： <br /><br />方法一：使用winmysqladmin <br />1)、进入d::\mysql\bin目录，运行winmysqladmin.exe，在屏幕右下角的任务栏内会有一个带红色的图符 <br />2)、鼠标左键点击该图符，选择“show me”，出现“WinMySQLAdmin”操作界面；首次运行时会中间会出现一个对话框要求输入并设置你的用户名和口令 <br />3)、选择“My.INI setup” <br />4)、在“mysqld file”中选择“mysqld-opt”(win9x)或“mysqld-nt”(winNT) <br />5)、选择“Pick-up or Edit my.ini values”可以在右边窗口内对你的my.ini文件进行编辑 <br />6)、选择“Save Modification”保存你的my.ini文件 <br />7)、如果你想快速使用winmysqladmin(开机时自动运行），选择“Create ShortCut on Start Menu” <br />8)、测试： <br />进入DOS界面； <br />在d:\mysql\bin目录下运行mysql，进入mysql交互操作界面 <br />输入show databases并回车，屏幕显示出当前已有的两个数据库mysql和test <br /><br />方法二：不使用winmysqladmin <br />1)、在DOS窗口下，进入d:/mysql/bin目录 <br />2)、win9X下)运行: <br />mysqld <br />在NT下运行: <br />mysqld-nt --standalone <br />3)、此后，mysql在后台运行 <br />4)、测试mysql:（在d:/mysql/bin目录下） <br />a)、mysqlshow <br />正常时显示已有的两个数据库mysql和test <br />b)、mysqlshow -u root mysql <br />正常时显示数据库mysql里的五个表： <br />columns_priv <br />db <br />host <br />tables_priv <br />user <br />c)、mysqladmin version status proc <br />显示版本号、状态、进程信息等 <br />d)、mysql test <br />进入mysql操作界面，当前数据库为test <br />5)、mysql关闭方法： <br />mysqladmin -u root shutdown <br /><br />4、至此，MySQL已成功安装，接着可以熟悉MySQL的常用命令并创建自己的数据库了。 <br /><br />入门篇 <br /><br />上篇讲了如何安装并测试MySQL，环境建好后就可以继续我们的学习了。本篇主要熟悉一写常用命令。 <br /><br />1、启动MySQL服务器 <br />实际上上篇已讲到如何启动MySQL。两种方法： <br />一是用winmysqladmin，如果机器启动时已自动运行，则可直接进入下一步操作。 <br />二是在DOS方式下运行 <br />d:mysqlbinmysqld <br /><br />2、进入mysql交互操作界面 <br />在DOS方式下，运行： <br />d:mysqlbinmysql <br />出现: <br />mysql <br />的提示符，此时已进入mysql的交互操作方式。 <br />如果出现 "ERROR 2003: Can´t connect to MySQL server on ´localhost´ (10061)“， <br />说明你的MySQL还没有启动。 <br /><br />3、退出MySQL操作界面 <br />在mysql&gt;提示符下输入quit可以随时退出交互操作界面： <br />mysql&gt; quit <br />Bye <br />你也可以用control-D退出。 <br /><br />4、第一条命令 <br />mysql&gt; select version(),current_date(); <br />+----------------+-----------------+ <br />| version() | current_date() | <br />+----------------+-----------------+ <br />| 3.23.25a-debug | 2001-05-17 | <br />+----------------+-----------------+ <br />1 row in set (0.01 sec) <br />mysql&gt; <br /><br />此命令要求mysql服务器告诉你它的版本号和当前日期。尝试用不同大小写操作上述命令，看结果如何。 <br />结果说明mysql命令的大小写结果是一致的。 <br />练习如下操作： <br />mysql&gt;Select (20+5)*4; <br />mysql&gt;Select (20+5)*4,sin(pi()/3); <br />mysql&gt;Select (20+5)*4 AS Result,sin(pi()/3); (AS: 指定假名为Result) <br /><br />5、多行语句 <br />一条命令可以分成多行输入，直到出现分号“；”为止： <br />mysql&gt; select <br />-&gt; USER() <br />-&gt; , <br />-&gt; now() <br />-&gt;; <br />+--------------------+---------------------+ <br />| USER() | now() | <br />+--------------------+---------------------+ <br />| ODBC@localhost | 2001-05-17 22:59:15 | <br />+--------------------+---------------------+ <br />1 row in set (0.06 sec) <br />mysql&gt; <br />注意中间的逗号和最后的分号的使用方法。 <br /><br />6、一行多命令 <br />输入如下命令： <br />mysql&gt; SELECT USER(); SELECT NOW(); <br />+------------------+ <br />| USER() | <br />+------------------+ <br />| ODBC@localhost | <br />+------------------+ <br />1 row in set (0.00 sec) <br /><br />+---------------------+ <br />| NOW() | <br />+---------------------+ <br />| 2001-05-17 23:06:15 | <br />+---------------------+ <br />1 row in set (0.00 sec) <br />mysql&gt; <br />注意中间的分号，命令之间用分号隔开。 <br /><br />7、显示当前存在的数据库 <br />mysql&gt; show databases; <br />+----------+ <br />| Database | <br />+----------+ <br />| mysql | <br />| test | <br />+----------+ <br />2 row in set (0.06 sec) <br />mysql&gt; <br /><br />8、选择数据库并显示当前选择的数据库 <br />mysql&gt; USE mysql <br />Database changed <br />mysql&gt; <br />(USE 和 QUIT 命令不需要分号结束。） <br />mysql&gt; select database(); <br />+---------------+ <br />| database() | <br />+---------------+ <br />| mysql | <br />+---------------+ <br />1 row in set (0.00 sec) <br /><br />9、显示当前数据库中存在的表 <br />mysql&gt; SHOW TABLES; <br /><br />10、显示表(db)的内容 <br />mysql&gt;select * from db; <br /><br />11、命令的取消 <br />当命令输入错误而又无法改变（多行语句情形）时，只要在分号出现前就可以用 c来取消该条命令 <br />mysql&gt; select <br />-&gt; user() <br />-&gt; c <br />mysql&gt; <br /><br />这是一些最常用的最基本的操作命令，通过多次练习就可以牢牢掌捂了。 <br /><br />学习篇 <br /><br />了解了一些最基本的操作命令后，我们再来学习如何创建一个数据库和数据库表。 <br /><br />1、使用SHOW语句找出在服务器上当前存在什么数据库： <br /><br />mysql&gt; SHOW DATABASES; <br />+----------+ <br />| Database | <br />+----------+ <br />| mysql | <br />| test | <br />+----------+ <br />3 rows in set (0.00 sec) <br /><br />2、创建一个数据库abccs <br />mysql&gt; CREATE DATABASE abccs; <br />注意不同操作系统对大小写的敏感。 <br /><br />3、选择你所创建的数据库 <br />mysql&gt; USE abccs <br />Database changed <br />此时你已经进入你刚才所建立的数据库abccs. <br /><br />4、 创建一个数据库表 <br />首先看现在你的数据库中存在什么表： <br />mysql&gt; SHOW TABLES; <br />Empty set (0.00 sec) <br />说明刚才建立的数据库中还没有数据库表。下面来创建一个数据库表mytable: <br /><br />我们要建立一个你公司员工的生日表，表的内容包含员工姓名、性别、出生日期、出生城市。 <br />mysql&gt; CREATE TABLE mytable (name VARCHAR(20), sex CHAR(1), <br />-&gt; birth DATE, birthaddr VARCHAR(20)); <br />Query OK, 0 rows affected (0.00 sec) <br /><br />由于name、birthadd的列值是变化的，因此选择VARCHAR，其长度不一定是20。可以选择从 <br />1到255的任何长度，如果以后需要改变它的字长，可以使用ALTER TABLE语句。）; <br />性别只需一个字符就可以表示："m"或"f"，因此选用CHAR(1); <br />birth列则使用DATE数据类型。 <br /><br />创建了一个表后，我们可以看看刚才做的结果，用SHOW TABLES显示数据库中有哪些表： <br />mysql&gt; SHOW TABLES; <br />+---------------------+ <br />| Tables in menagerie | <br />+---------------------+ <br />| mytables | <br />+---------------------+ <br /><br />5、显示表的结构： <br />mysql&gt; DESCRIBE mytable; <br />+-------------+-------------+------+-----+---------+-------+ <br />| Field | Type | Null | Key | Default | Extra | <br />+-------------+-------------+------+-----+---------+-------+ <br />| name | varchar(20) | YES | | NULL | | <br />| sex | char(1) | YES | | NULL | | <br />| birth | date | YES | | NULL | | <br />| deathaddr | varchar(20) | YES | | NULL | | <br />+-------------+-------------+------+-----+---------+-------+ <br />4 rows in set (0.00 sec) <br /><br />6、 往表中加入记录 <br />我们先用SELECT命令来查看表中的数据： <br />mysql&gt; select * from mytable; <br />Empty set (0.00 sec) <br />这说明刚才创建的表还没有记录。 <br /><br />加入一条新记录： <br />mysql&gt; insert into mytable <br />-&gt; values (´abccs´,´f´,´1977-07-07´,´china´); <br />Query OK, 1 row affected (0.05 sec) <br />再用上面的SELECT命令看看发生了什么变化。 <br /><br />我们可以按此方法一条一条地将所有员工的记录加入到表中。 <br /><br />7、用文本方式将数据装入一个数据库表 <br />如果一条一条地输入，很麻烦。我们可以用文本文件的方式将所有记录加入你的数据库表中。 <br />创建一个文本文件“mysql.txt”，每行包含一个记录，用定位符(tab)把值分开，并且以在 <br />CREATE TABLE语句中列出的列次序给出，例如： <br /><br />abccs f 1977-07-07 china 　 <br />mary f 1978-12-12 usa <br />tom m 1970-09-02 usa <br /><br />使用下面命令将文本文件“mytable.txt”装载到mytable表中: <br />mysql&gt; LOAD DATA LOCAL INFILE "mytable.txt" INTO TABLE pet; <br /><br />再使用如下命令看看是否已将数据输入到数据库表中： <br />mysql&gt; select * from mytable; <br /><br />学习篇 <br /><br />上篇我们学会了如何创建一个数据库和数据库表，并知道如何向数据库表中添加记录。 <br />那么我们如何从数据库表中检索数据呢？ <br /><br />1、从数据库表中检索信息 <br />实际上，前面我们已经用到了SELECT语句，它用来从数据库表中检索信息。 <br />select语句格式一般为： <br /><br />SELECT 检索关键词 FROM 被检索的表 WHERE 检索条件(可选) <br /><br />以前所使用的“ * ”表示选择所有的列。 <br />下面继续使用我们在上篇文章中创建的表mytable： <br /><br />2、查询所有数据： <br />mysql&gt; select * from mytable; <br />+----------+------+------------+----------+ <br />| name | sex | birth | birthaddr | <br />+----------+------+------------+--------+ <br />| abccs |f | 1977-07-07 | china | <br />| mary |f | 1978-12-12 | usa | <br />| tom |m | 1970-09-02 | usa | <br />+----------+------+------------+----------+ <br />3 row in set (0.00 sec) <br /><br />3、修正错误记录： <br />假如tom的出生日期有错误，应该是1973－09－02，则可以用update语句来修正： <br />mysql&gt; update mytable set birth = "1973-09-02" where name = "tom"; <br />再用2中的语句看看是否已更正过来。 <br /><br />4、选择特定行 <br />上面修改了tom的出生日期，我们可以选择tom这一行来看看是否已经有了变化： <br />mysql&gt; select * from mytable where name = "tom"; <br />+--------+------+------------+------------+ <br />| name |sex | birth | birthaddr | <br />+--------+------+------------+------------+ <br />| tom |m | 1973-09-02 | usa | <br />+--------+------+------------+------------+ <br />1 row in set (0.06 sec) <br /><br />上面WHERE的参数指定了检索条件。我们还可以用组合条件来进行查询： <br />mysql&gt; SELECT * FROM mytable WHERE sex = "f" AND birthaddr = "china"; <br />+--------+------+------------+------------+ <br />| name |sex | birth | birthaddr | <br />+--------+------+------------+------------+ <br />| abccs |f | 1977-07-07 | china | <br />+--------+------+------------+------------+ <br />1 row in set (0.06 sec) <br /><br />5、 选择特定列 <br />假如你想查看表中的所有人的姓名，则可以这样操作： <br />mysql&gt; SELECT name FROM mytable; <br />+----------+ <br />| name | <br />+----------+ <br />| abccs | <br />| mary | <br />| tom | <br />+----------+ <br />3 row in set (0.00 sec) <br />如果想列出姓名和性别两列，则可以用逗号将关键词name和birth分开： <br />myaql&gt; select name,birth from mytable; <br /><br />6、对行进行排序 <br />我们可以对表中的记录按生日大小进行排序： <br />mysql&gt; SELECT name, birth FROM mytable ORDER BY birth; <br />+----------+------------+ <br />| name | birth | <br />+----------+------------+ <br />| tom | 1973-09-02 | <br />| abccs | 1977-07-07 | <br />| mary | 1978-12-12 | <br />+----------+------------+ <br />3 row in set (0.00 sec) <br /><br />我们可以用DESC来进行逆序排序： <br />mysql&gt; SELECT name, birth FROM mytable ORDER BY birth DESC; <br />+----------+------------+ <br />| name | birth | <br />+----------+------------+ <br />| mary | 1978-12-12 | <br />| abccs | 1977-07-07 | <br />| tom | 1973-09-02 | <br />+----------+------------+ <br />3 row in set (0.00 sec) <br /><br />7、 行计数 <br />数据库经常要统计一些数据，如表中员工的数目，我们就要用到行计数函数COUNT()。 <br />COUNT()函数用于对非NULL结果的记录进行计数： <br />mysql&gt; SELECT COUNT(*) FROM mytable; <br />+----------+ <br />| COUNT(*) | <br />+----------+ <br />| 3 | <br />+----------+ <br />1 row in set (0.06 sec) <br /><br />员工中男女数量： <br />mysql&gt; SELECT sex, COUNT(*) FROM mytable GROUP BY sex; <br />+------+----------+ <br />| sex | COUNT(*) | <br />+------+----------+ <br />| f | 2 | <br />| m | 1 | <br />+------+----------+ <br />2 row in set (0.00 sec) <br /><br />注意我们使用了GROUP BY对SEX进行了分组。 <br /><br />多表操作 <br /><br />前面我们熟悉了数据库和数据库表的基本操作，现在我们再来看看如何操作多个表。 <br /><br />在一个数据库中，可能存在多个表，这些表都是相互关联的。我们继续使用前面的例子。前面建立的表中包含了员工的一些基本信息，如姓名、性别、出生日期、出生地。我们再创建一个表，该表用于描述员工所发表的文章，内容包括作者姓名、文章标题、发表日期。 <br /><br />1、查看第一个表mytable的内容： <br />mysql&gt; select * from mytable; <br />+----------+------+------------+-----------+ <br />| name | sex | birth | birthaddr | <br />+----------+------+------------+-----------+ <br />| abccs |f | 1977-07-07 | china | <br />| mary |f | 1978-12-12 | usa | <br />| tom |m | 1970-09-02 | usa | <br />+----------+------+------------+-----------+ <br /><br />2、创建第二个表title（包括作者、文章标题、发表日期）: <br />mysql&gt; create table title(writer varchar(20) not null, <br />-&gt; title varchar(40) not null, <br />-&gt; senddate date); <br /><br />向该表中填加记录，最后表的内容如下： <br />mysql&gt; select * from title; <br />+--------+-------+------------+ <br />| writer | title | senddate | <br />+--------+-------+------------+ <br />| abccs | a1 | 2000-01-23 | <br />| mary | b1 | 1998-03-21 | <br />| abccs | a2 | 2000-12-04 | <br />| tom | c1 | 1992-05-16 | <br />| tom | c2 | 1999-12-12 | <br />+--------+-------+------------+ <br />5 rows in set (0.00sec) <br /><br />3、多表查询 <br />现在我们有了两个表: mytable 和 title。利用这两个表我们可以进行组合查询： <br />例如我们要查询作者abccs的姓名、性别、文章： <br />mysql&gt; SELECT name,sex,title FROM mytable,title <br />-&gt; WHERE name=writer AND name=´abccs´; <br />+-------+------+-------+ <br />| name | sex | title | <br />+-------+------+-------+ <br />| abccs | f | a1 | <br />| abccs | f | a2 | <br />+-------+------+-------+ <br /><br />上面例子中，由于作者姓名、性别、文章记录在两个不同表内，因此必须使用组合来进行查询。必须要指定一个表中的记录如何与其它表中的记录进行匹配。 <br />注意：如果第二个表title中的writer列也取名为name（与mytable表中的name列相同）而不是writer时，就必须用mytable.name和title.name表示，以示区别。 <br /><br />再举一个例子，用于查询文章a2的作者、出生地和出生日期： <br />mysql&gt; select title,writer,birthaddr,birth from mytable,title <br />-&gt; where mytable.name=title.writer and title=´a2´; <br />+-------+--------+-----------+------------+ <br />| title | writer | birthaddr | birth | <br />+-------+--------+-----------+------------+ <br />| a2 | abccs | china | 1977-07-07 | <br />+-------+--------+-----------+------------+ <br /><br />修改和备份、批处理 <br /><br />有时我们要对数据库表和数据库进行修改和删除，可以用如下方法实现： <br /><br />1、增加一列： <br />如在前面例子中的mytable表中增加一列表示是否单身single: <br />mysql&gt; alter table mytable add column single char(1); <br /><br />2、修改记录 <br />将abccs的single记录修改为“y”： <br />mysql&gt; update mytable set single=´y´ where name=´abccs´; <br /><br />现在来看看发生了什么： <br />mysql&gt; select * from mytable; <br />+----------+------+------------+-----------+--------+ <br />| name | sex | birth | birthaddr | single | <br />+----------+------+------------+-----------+--------+ <br />| abccs |f | 1977-07-07 | china | y | <br />| mary |f | 1978-12-12 | usa | NULL | <br />| tom |m | 1970-09-02 | usa | NULL | <br />+----------+------+------------+-----------+--------+ <br /><br />3、增加记录 <br />前面已经讲过如何增加一条记录，为便于查看，重复与此： <br />mysql&gt; insert into mytable <br />-&gt; values (´abc´,´f´,´1966-08-17´,´china´,´n´); <br />Query OK, 1 row affected (0.05 sec) <br />查看一下： <br />mysql&gt; select * from mytable; <br />+----------+------+------------+-----------+--------+ <br />| name | sex | birth | birthaddr | single | <br />+----------+------+------------+-----------+--------+ <br />| abccs |f | 1977-07-07 | china | y | <br />| mary |f | 1978-12-12 | usa | NULL | <br />| tom |m | 1970-09-02 | usa | NULL | <br />| abc |f | 1966-08-17 | china | n | <br />+----------+------+------------+-----------+--------+ <br /><br /><br />3、删除记录 <br />用如下命令删除表中的一条记录： <br />mysql&gt; delete from mytable where name=´abc´; <br />DELETE从表中删除满足由where给出的条件的一条记录。 <br /><br />再显示一下结果： <br />mysql&gt; select * from mytable; <br />+----------+------+------------+-----------+--------+ <br />| name | sex | birth | birthaddr | single | <br />+----------+------+------------+-----------+--------+ <br />| abccs |f | 1977-07-07 | china | y | <br />| mary |f | 1978-12-12 | usa | NULL | <br />| tom |m | 1970-09-02 | usa | NULL | <br />+----------+------+------------+-----------+--------+ <br /><br />4、删除表： <br />mysql&gt; drop table ****(表1的名字)，***表2的名字; <br />可以删除一个或多个表，小心使用。 <br /><br />5、数据库的删除： <br />mysql&gt; drop database 数据库名; <br />小心使用。 <br /><br />6、数据库的备份： <br />退回到DOS： <br />mysql&gt; quit <br />d:mysqlbin <br />使用如下命令对数据库abccs进行备份： <br />mysqldump --opt abccs&gt;abccs.dbb <br />abccs.dbb就是你的数据库abccs的备份文件。 <br /><br />7、用批处理方式使用MySQL: <br /><br />首先建立一个批处理文件mytest.sql,内容如下： <br />use abccs; <br />select * from mytable; <br />select name,sex from mytable where name=´abccs´; <br /><br />在DOS下运行如下命令： <br />d:mysqlbin mysql &lt; mytest.sql <br />在屏幕上会显示执行结果。 <br /><br />如果想看结果，而输出结果很多，则可以用这样的命令： <br />mysql &lt; mytest.sql | more <br /><br />我们还可以将结果输出到一个文件中： <br />mysql &lt; mytest.sql &gt; mytest.out </font>
														</p>
												</span>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
<img src ="http://www.blogjava.net/hua/aggbug/65734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hua/" target="_blank">花</a> 2006-08-25 11:51 <a href="http://www.blogjava.net/hua/archive/2006/08/25/65734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP连接各类数据库大全</title><link>http://www.blogjava.net/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.blogjava.net/hua/archive/2006/05/29/48721.html</guid><wfw:comment>http://www.blogjava.net/hua/comments/48721.html</wfw:comment><comments>http://www.blogjava.net/hua/archive/2006/05/29/48721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hua/comments/commentRss/48721.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hua/services/trackbacks/48721.html</trackback:ping><description><![CDATA[
		<font face="Courier New">现在有好多初学jsp的网友经常会问数据库怎么连接啊，怎么老出错啊？所以我集中的在这写篇文章供大家参考，其实这种把数据库逻辑全部放在jsp里未必是好的做法，但是有利于初学者学习，所以我就这样做了，当大家学到一定程度的时候，可以考虑用MVC的模式开发。在练习这些代码的时候，你一定将jdbc的驱动程序放到服务器的类路径里，然后要在数据库里建一个表test,有两个字段比如为test1，test2，可以用下面SQL建<br /><br />　　create table test(test1 varchar(20),test2 varchar(20)<br /><br />　　然后向这个表写入一条测试纪录，那么现在开始我们的jsp和数据库之旅吧。<br /><br />　　一、jsp连接Oracle8/8i/9i数据库（用thin模式） <br />　　testoracle.jsp如下： <br />　　&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />　　&lt;%@ page import="java.sql.*"%&gt; <br />　　&lt;html&gt; <br />　　&lt;body&gt; <br />　　&lt;%Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); <br />　　String url="jdbc:oracle:thin:@localhost:1521:orcl"; <br />　　//orcl为你的数据库的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()) {%&gt; <br />　　您的第一个字段内容为：&lt;%=rs.getString(1)%&gt; <br />　　您的第二个字段内容为：&lt;%=rs.getString(2)%&gt; <br />　　&lt;%}%&gt; <br />　　&lt;%out.print("数据库操作成功，恭喜你");%&gt; <br />　　&lt;%rs.close(); <br />　　stmt.close(); <br />　　conn.close(); <br />　　%&gt; <br />　　&lt;/body&gt; <br />　　&lt;/html&gt; <br /><br />二、jsp连接Sql Server7.0/2000数据库 <br /><br />　　testsqlserver.jsp如下： <br />　　&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />　　&lt;%@ page import="java.sql.*"%&gt; <br />　　&lt;html&gt; <br />　　&lt;body&gt; <br />　　&lt;%Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); <br />　　String　url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"; <br />　　//pubs为你的数据库的 <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()) {%&gt; <br />　　您的第一个字段内容为：&lt;%=rs.getString(1)%&gt; <br />　　您的第二个字段内容为：&lt;%=rs.getString(2)%&gt; <br />　　&lt;%}%&gt; <br />　　&lt;%out.print("数据库操作成功，恭喜你");%&gt; <br />　　&lt;%rs.close(); <br />　　stmt.close(); <br />　　conn.close(); 　　<br />　　%&gt; <br />　　&lt;/body&gt; <br />　　&lt;/html&gt; <br /><br />三、jsp连接DB2数据库 <br /><br />　　testdb2.jsp如下： <br />　　&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />　　&lt;%@ page import="java.sql.*"%&gt; <br />　　&lt;html&gt; <br />　　&lt;body&gt; <br />　　&lt;%Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); <br />　　String url="jdbc:db2://localhost:5000/sample"; <br />　　//sample为你的数据库名 <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()) {%&gt; <br />　　您的第一个字段内容为：&lt;%=rs.getString(1)%&gt; <br />　　您的第二个字段内容为：&lt;%=rs.getString(2)%&gt; <br />　　&lt;%}%&gt; <br />　　&lt;%out.print("数据库操作成功，恭喜你");%&gt; <br />　　&lt;%rs.close(); <br />　　stmt.close(); <br />　　conn.close(); <br />　　%&gt; <br />　　&lt;/body&gt; <br />　　&lt;/html&gt;<br /><br />四、jsp连接Informix数据库 <br /><br />　　testinformix.jsp如下： <br />　　&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />　　&lt;%@ page import="java.sql.*"%&gt; <br />　　&lt;html&gt; <br />　　&lt;body&gt; <br />　　&lt;%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 />　　//testDB为你的数据库名 <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()) {%&gt; <br />　　您的第一个字段内容为：&lt;%=rs.getString(1)%&gt; <br />　　您的第二个字段内容为：&lt;%=rs.getString(2)%&gt; <br />　　&lt;%}%&gt; <br />　　&lt;%out.print("数据库操作成功，恭喜你");%&gt; <br />　　&lt;%rs.close(); <br />　　stmt.close(); <br />　　conn.close(); <br />　　%&gt; <br />　　&lt;/body&gt; <br />　　&lt;/html&gt; <br /><br />五、jsp连接Sybase数据库 <br /><br />　　testmysql.jsp如下： <br />　　&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />　　&lt;%@ page import="java.sql.*"%&gt; <br />　　&lt;html&gt; <br />　　&lt;body&gt; <br />　　&lt;%Class.forName("com.sybase.jdbc.SybDriver").newInstance(); <br />　　String url =" jdbc:sybase:Tds:localhost:5007/tsdata"; <br />　　//tsdata为你的数据库名 <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()) {%&gt; <br />　　您的第一个字段内容为：&lt;%=rs.getString(1)%&gt; <br />　　您的第二个字段内容为：&lt;%=rs.getString(2)%&gt; <br />　　&lt;%}%&gt; <br />　　&lt;%out.print("数据库操作成功，恭喜你");%&gt; <br />　　&lt;%rs.close(); <br />　　stmt.close(); <br />　　conn.close(); <br />　　%&gt; <br />　　&lt;/body&gt; <br />　　&lt;/html&gt; <br /><br />六、jsp连接MySQL数据库 <br /><br />　　testmysql.jsp如下： <br />　　&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />　　&lt;%@ page import="java.sql.*"%&gt; <br />　　&lt;html&gt; <br />　　&lt;body&gt; <br />　　&lt;%Class.forName("org.gjt.mm.mysql.Driver").newInstance(); <br />　　String url="jdbc:mysql://localhost/softforum?user=soft&amp;password=soft1234&amp;useUnicode=true&amp;characterEncoding=8859_1" <br />　　//testDB为你的数据库名 <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()) {%&gt; <br />　　您的第一个字段内容为：&lt;%=rs.getString(1)%&gt; <br />　　您的第二个字段内容为：&lt;%=rs.getString(2)%&gt; <br />　　&lt;%}%&gt; <br />　　&lt;%out.print("数据库操作成功，恭喜你");%&gt; <br />　　&lt;%rs.close(); <br />　　stmt.close(); <br />　　conn.close(); <br />　　%&gt; <br />　　&lt;/body&gt; <br />　　&lt;/html&gt;<br /><br />七、jsp连接PostgreSQL数据库 <br /><br />　　testmysql.jsp如下： <br />　　&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />　　&lt;%@ page import="java.sql.*"%&gt; <br />　　&lt;html&gt; <br />　　&lt;body&gt; <br />　　&lt;%Class.forName("org.postgresql.Driver").newInstance(); <br />　　String url ="jdbc:postgresql://localhost/soft" <br />　　//soft为你的数据库名 <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()) {%&gt; <br />　　您的第一个字段内容为：&lt;%=rs.getString(1)%&gt; <br />　　您的第二个字段内容为：&lt;%=rs.getString(2)%&gt; <br />　　&lt;%}%&gt; <br />　　&lt;%out.print("数据库操作成功，恭喜你");%&gt; <br />　　&lt;%rs.close(); <br />　　stmt.close(); <br />　　conn.close(); <br />　　%&gt; <br />　　&lt;/body&gt; <br />　　&lt;/html&gt;<br /></font>
<img src ="http://www.blogjava.net/hua/aggbug/48721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hua/" target="_blank">花</a> 2006-05-29 12:46 <a href="http://www.blogjava.net/hua/archive/2006/05/29/48721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于ORACLE连接池2</title><link>http://www.blogjava.net/hua/archive/2006/05/26/48339.html</link><dc:creator>花</dc:creator><author>花</author><pubDate>Fri, 26 May 2006 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/hua/archive/2006/05/26/48339.html</guid><wfw:comment>http://www.blogjava.net/hua/comments/48339.html</wfw:comment><comments>http://www.blogjava.net/hua/archive/2006/05/26/48339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hua/comments/commentRss/48339.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hua/services/trackbacks/48339.html</trackback:ping><description><![CDATA[
		<table class="center_tdbgall" style="WORD-BREAK: break-all" cellspacing="0" cellpadding="0" width="760" align="center" border="0">
				<tbody>
						<tr>
								<td colspan="2">
										<table cellspacing="0" cellpadding="0" width="100%" bgcolor="#f5f5f5" border="0">
												<tbody>
														<tr>
																<td valign="center" width="3%">
																		<img alt="Oracle应用" src="http://www.eduxue.com/Images/arrow.gif" align="absMiddle" />
																</td>
																<td width="66%" height="30">
																		<strong>关于ORACLE连接池</strong>
																</td>
																<td width="18%">
																</td>
																<td align="right" width="13%">字体：<a href="javascript:fontZoomA();">小</a><a href="javascript:fontZoomB();">大</a></td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
						<tr valign="center" align="middle">
								<td class="main_ArticleTitle" style="WORD-BREAK: break-all" colspan="2" height="50">关于ORACLE连接池</td>
						</tr>
						<tr align="middle">
								<td class="Article_tdbgall" colspan="2">
								</td>
						</tr>
						<tr>
								<td class="main_tdbg_760" id="fontzoom" style="WORD-BREAK: break-all" valign="top" colspan="2" height="300">
										<table cellspacing="0" cellpadding="4" align="left" border="0">
												<tbody>
														<tr>
																<td>
																		<script type="text/javascript">
																				<!--
google_ad_client = "pub-7533676430250960";
google_alternate_ad_url = "http://www.eduxue.com/taobao.html";
google_ad_width = 336;
google_ad_height = 280;
google_ad_format = "336x280_as";
google_ad_type = "text_image";
google_ad_channel ="0773845475";
google_color_border = "FFFFFF";
google_color_bg = "FFFFFF";
google_color_link = "0000FF";
google_color_url = "999999";
google_color_text = "000000";
//-->
																		</script>
																		<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
																		</script>
																</td>
														</tr>
												</tbody>
										</table>
										<p>
										</p>
										<p>172 * <br />173 * @param props 属性 <br />174 */ <br />175 private void loadDrivers(Properties props) { <br />176 String driverClasses = props.getProperty("drivers"); <br />177 StringTokenizer st = new StringTokenizer(driverClasses); <br />178 while (st.hasMoreElements()) { <br />179 String driverClassName = st.nextToken().trim(); <br />180 try { <br />181 Driver driver = (Driver) <br />182 Class.forName(driverClassName).newInstance(); <br />183 DriverManager.registerDr</p>iver(driver); <br />184 drivers.addElement(driver); <br />185 log("成功注册JDBC驱动程序\\\" + driverClassName); <br />186 } <br />187 catch (Exception e) { <br />188 log("无法注册JDBC驱动程序: " + <br />189 driverClassName + ", 错误: " + e); <br />190 } <br />191 } <br />192 } <br />193 <br />194 /** <br />195 * 将文本信息写入日志文件 <br />196 */ <br />197 private void log(String msg) { <br />198 log.println(new Date() + ": " + msg); <br />199 } <br />200 <br />201 /** <br />202 * 将文本信息与异常写入日志文件 <br />203 */ <br />204 private void log(Throwable e, String msg) { <br />205 log.println(new Date() + ": " + msg); <br />206 e.printStackTrace(log); <br />207 } <br />208 <br />209 /** <br />210 * 此内部类定义了一个连接池.它能够根据要求创建新连接,直到预定的最\\r 
<p></p><p></p><p align="center"> </p></td>
						</tr>
						<tr>
								<td align="right" colspan="2">
										<span class="Article_tdbgall"> </span>
								</td>
						</tr>
						<tr>
								<td width="5">
								</td>
								<td width="752">
										<p> </p>
								</td>
						</tr>
				</tbody>
		</table>
		<table class="center_tdbgall" cellspacing="0" cellpadding="0" width="760" align="center" border="0">
				<tbody>
						<tr>
								<td class="main_shadow">
								</td>
						</tr>
				</tbody>
		</table>
		<!--文章显示代码结束-->
		<!--最新热点、最新推荐、相关文章代码开始-->
		<table class="center_tdbgall" style="WORD-BREAK: break-all" cellspacing="0" cellpadding="0" width="760" align="center" border="0">
				<tbody>
						<tr>
								<td width="33%" bgcolor="#f5f5f5" height="25">
								</td>
								<td width="5" rowspan="2">
								</td>
								<td class="main_tdbg_760" valign="center" align="middle" width="33%" rowspan="2">
										<script type="text/javascript">
												<!--
google_ad_client = "pub-7533676430250960";
google_ad_width = 125;
google_ad_height = 125;
google_ad_format = "125x125_as_rimg";
google_cpa_choice = "CAAQ7-bnzwEaCMQUcnn9ADW1KN2_93M";
//-->
										</script>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/hua/aggbug/48339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hua/" target="_blank">花</a> 2006-05-26 15:29 <a href="http://www.blogjava.net/hua/archive/2006/05/26/48339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于ORACLE连接池</title><link>http://www.blogjava.net/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.blogjava.net/hua/archive/2006/05/26/48283.html</guid><wfw:comment>http://www.blogjava.net/hua/comments/48283.html</wfw:comment><comments>http://www.blogjava.net/hua/archive/2006/05/26/48283.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hua/comments/commentRss/48283.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hua/services/trackbacks/48283.html</trackback:ping><description><![CDATA[
		<p>到目前为目,JDBC2的连结池只是一个接口,没有真正的实现,JDBC3正在开发中,据报已经支持连结池,但JDBC3用了JNDI技术,连结池的配置可以让一个高手都烦死. </p>
		<p>目前第三方已经实现的连结池当然是poolman,1.0版对一般用户来说已经足够用了.配置也简单,2.0版虽然增加了一些功能,但配置也是采用JNDI,对RMI和EJB不懂的朋友可能很烦.建议用1.0的了. </p>
		<p>如果有兴趣,自己也可以实现连结池,最关键的技术也就是把连结作为参数传给一个BEAN,用完后返回这个参数连结而不是关闭. <br />下面是一个简单的实现: <br />DBConnectionManager.java程序清单如下： </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 * 管理类DBConnectionManager支持对一个或多个由属性文件定义的数据库连接 <br />008 * 池的访问.客户程序可以调用getInstance()方法访问本类的唯一实例. <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 * 返回唯一实例.如果是第一次调用此方法,则创建实例 <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 * 建构函数私有以防止其它对象创建本类实例 <br />033 */ <br />034 private DBConnectionManager() { <br />035 init(); <br />036 } <br />037 <br />038 /** <br />039 * 将连接对象返回给由名字指定的连接池 <br />040 * <br />041 * @param name 在属性文件中定义的连接池名字 <br />042 * @param con 连接对象\\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 * 获得一个可用的(空闲的)连接.如果没有可用连接,且已有连接数小于最大连接数 <br />053 * 限制,则创建并返回新连接 <br />054 * <br />055 * @param name 在属性文件中定义的连接池名字 <br />056 * @return Connection 可用连接或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 * 则创建并返回新连接.否则,在指定的时间内等待其它线程释放连接. <br />069 * <br />070 * @param name 连接池名字 <br />071 * @param time 以毫秒计的等待时间\\r </p>
		<p>
		</p>
		<p>
		</p>
		<p>072 * @return Connection 可用连接或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 * 关闭所有连接,撤销驱动程序的注册\\r </p>
		<p>084 */ <br />085 public synchronized void release() { <br />086 // 等待直到最后一个客户程序调用 <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驱动程序 " + driver.getClass().getName()+"的注册\\\"); <br />102 } <br />103 catch (SQLException e) { <br />104 log(e, "无法撤销下列JDBC驱动程序的注册: " + driver.getClass().getName()); <br />105 } <br />106 } <br />107 } <br />108 <br />109 /** <br />110 * 根据指定属性创建连接池实例. <br />111 * <br />112 * @param props 连接池属性 <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 + " .连接池: " + 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("成功创建连接池" + poolName); <br />140 } <br />141 } <br />142 } <br />143 <br />144 /** <br />145 * 读取属性完成初始化 <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("不能读取属性文件. " + <br />155 "请确保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("无法打开日志文件: " + 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驱动程序\\r </p>
<img src ="http://www.blogjava.net/hua/aggbug/48283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hua/" target="_blank">花</a> 2006-05-26 11:24 <a href="http://www.blogjava.net/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.blogjava.net/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.blogjava.net/hua/archive/2006/05/23/47660.html</guid><wfw:comment>http://www.blogjava.net/hua/comments/47660.html</wfw:comment><comments>http://www.blogjava.net/hua/archive/2006/05/23/47660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hua/comments/commentRss/47660.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hua/services/trackbacks/47660.html</trackback:ping><description><![CDATA[
		<font face="Courier New">我本来不再想写一些类似教程的文章,因为既然叫教程就要能历经历史的考验,而对于我这种菜鸟级的程序设计者来说仅喜欢随心所欲地交流一些自己的经验。可以不成方法，无关条理地想到哪说到哪。但是有些问题我又不能不出来说明白，因为目前网上的很多“教程”都在把初学者引向错误，有些是作者个人理解的错误，有些作者自己从来没有做过开发却能写出一篇软件开发的文章。他们只会做TRANSLATE，COPY，CUT这些操作，最简单的例子就是sun的JDK开发文档中到目前为止介绍大对象（文件）存储的方法都是错误的，可是说经过N（N &gt;100）次的重写都没有人纠正，因为后来的人都只是COPY了一下，根本没有真的去做，只是把原作者换成自己的名字而已。 <br />（尊重声明：凡以AXMAN，超级菜鸟，诗剑书生签名的文章除在CNJSP网站发布谢绝任何网站转贴） <br /><br />问题一：如保加载JDBC驱动程序： <br />正常我们加载驱动程序有三个途径： <br />1）Class.forName(String)这想当于classLoader一个String指定的类，在装载时把该驱动程序的静态内容都初始化，其实这时驱动程序类调用了DriverManager.registerDriver(driver);方法 <br />2）使用系统属性：System.getProperty().load(new FileInputStream("属性文件")); <br />在属性文件中指定jdbc.driver=drivername 这样的好处是可以同时加载多个JDBC，换数据库时不用访问JAVA源代码，只是修改属性文件 <br />3）直接registerDriver(driver）这种方法最可靠，可以在任何环境下使用。 <br /><br />1）方法简单，但MS的JVM不能正确初始化。比如使用IE时在APPLET中就不能使用，应该用3）的方法。但3）方法在灵活性方面不如2），可以根据环境综合考虑。 <br /><br /><br />问题二：大对象存储 <br />    一般来说，大对象存储是把文件存到数据库中，当然也可以内存中的超大字符串。对于象图片这样的文件当然是用二进制存储，这里有很多误区，网络上的教程99%都是行不通的，连SUN自己的文档都一直错误，虽然错误很小。按说二进制文件应该存为BLOB类型，但JBDC2并不能直接对BLOB存入二进制文件，如果你这样做，会得到一个IO而不是SQL异常，为此花了我近两个小时才弄清楚。<br />    如果要把一个二制文件存入ORACLE，用标准的JDBC你就要用LONG ROW类型： <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存储，你就必须用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 />同样读取数据你并不能象LONG ROW那样 <br />InputStream in = rs.getBinaryInputStream("detail"); <br />而要 <br />Blob blob = rs.getBlob("detail"); <br />in = blob.getBinaryStream(); <br /><br />问题三：可滚动结果集 <br />    ORACLE 明确说明不支持结果集滚动，那么我们用JDBC2得到一个可滚动的结果集就是同JDBC自己支持的，就是说结果集要在内存中高度缓存，很多很多的开发者都错误地认为是数据库支持的。只是他们没有真正查询大量行，如果真的查询大量行的话肯定是死定了！！！！！！对于超大量行的数据，情愿返回到它的笨方法也不要使用可滚动结果集。<br /><br /></font>
<img src ="http://www.blogjava.net/hua/aggbug/47660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hua/" target="_blank">花</a> 2006-05-23 15:49 <a href="http://www.blogjava.net/hua/archive/2006/05/23/47660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jsp中调用Oracle存储过程的小例子</title><link>http://www.blogjava.net/hua/archive/2006/05/23/47653.html</link><dc:creator>花</dc:creator><author>花</author><pubDate>Tue, 23 May 2006 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/hua/archive/2006/05/23/47653.html</guid><wfw:comment>http://www.blogjava.net/hua/comments/47653.html</wfw:comment><comments>http://www.blogjava.net/hua/archive/2006/05/23/47653.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hua/comments/commentRss/47653.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hua/services/trackbacks/47653.html</trackback:ping><description><![CDATA[以下的例子转自csdn论坛：<br /><br />*执行一条insert语句并传参数*/<br />create or replace procedure p_test2(i in number) as<br />begin<br />insert into t values (i,'x'||to_char(i));<br />commit;<br />end;<br />/<br /><br />&lt;%@ page language="java" contentType="text/html;charset=gb2312"%&gt;<br />&lt;%@page import="java.sql.*"%&gt;<br />&lt;html&gt;<br />&lt;body&gt;<br />&lt;table&gt;<br />&lt;tr&gt;&lt;td&gt;aaa&lt;/td&gt;&lt;td&gt;bbb&lt;/td&gt;&lt;/tr&gt;<br />&lt;%<br />String driver = "oracle.jdbc.driver.OracleDriver";<br />String strUrl = "jdbc:oracle:thin:@192.168.1.6:1521:db";<br />    <br />    Class.forName(driver);<br />    Connection conn = DriverManager.getConnection(strUrl, "scott", "tiger");<br /><br />    String procedure = "{call p_test2 (?) }";<br />    CallableStatement cstmt = conn.prepareCall(procedure);<br />    cstmt.setInt(1,33);<br />    cstmt.executeUpdate();<br /><br />    Statement stmt = conn.createStatement();<br />    ResultSet rs = stmt.executeQuery("select * from t");<br /><br />    while(rs.next())<br />    {<br />        out.println("&lt;tr&gt;&lt;td&gt;" + rs.getString(1) + "&lt;/td&gt;&lt;td&gt;" + rs.getString(2) + "&lt;/td&gt;&lt;/tr&gt;");<br />    }<br /><br />    rs.close();<br />    stmt.close();<br />    conn.close();<br />%&gt;<br />&lt;/table&gt;<br />&lt;p&gt;<br />&lt;%<br />out.print(conn.isClosed());<br />%&gt;<br /><br />&lt;/body&gt;<br />&lt;/html&gt;<br />&lt;/body&gt; <br />&lt;/html&gt;<img src ="http://www.blogjava.net/hua/aggbug/47653.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hua/" target="_blank">花</a> 2006-05-23 15:32 <a href="http://www.blogjava.net/hua/archive/2006/05/23/47653.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>