﻿<?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-My Rhythm-随笔分类-Database</title><link>http://www.blogjava.net/redcoatjk/category/48592.html</link><description>万物皆对象 万事归节奏</description><language>zh-cn</language><lastBuildDate>Sat, 08 Mar 2014 06:07:27 GMT</lastBuildDate><pubDate>Sat, 08 Mar 2014 06:07:27 GMT</pubDate><ttl>60</ttl><item><title>Oracle维护常用SQL</title><link>http://www.blogjava.net/redcoatjk/archive/2014/03/03/410543.html</link><dc:creator>redcoatjk</dc:creator><author>redcoatjk</author><pubDate>Mon, 03 Mar 2014 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/redcoatjk/archive/2014/03/03/410543.html</guid><wfw:comment>http://www.blogjava.net/redcoatjk/comments/410543.html</wfw:comment><comments>http://www.blogjava.net/redcoatjk/archive/2014/03/03/410543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcoatjk/comments/commentRss/410543.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcoatjk/services/trackbacks/410543.html</trackback:ping><description><![CDATA[<h3>--查询表空间、表空间大小及表空间对应物理路径</h3><p>select a.tablespace_name,b.file_name,a.block_size,a.block_size,b.bytes/1024</p><p>/1024 "Sum MB" from dba_tablespaces a,dba_data_files b where a.tablespace_name=b.tablespace_name;</p><h3>--查询表空间使用情况</h3><p>　　SELECT UPPER(F.TABLESPACE_NAME) "表空间名",</p><p>　　D.TOT_GROOTTE_MB "表空间大小(M)",</p><p>　　D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",</p><p>　　TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') || '%' "使用比",</p><p>　　F.TOTAL_BYTES "空闲空间(M)",</p><p>　　F.MAX_BYTES "最大块(M)"</p><p>　　FROM (SELECT TABLESPACE_NAME,</p><p>　　ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,</p><p>　　ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES</p><p>　　FROM SYS.DBA_FREE_SPACE</p><p>　　GROUP BY TABLESPACE_NAME) F,</p><p>　　(SELECT DD.TABLESPACE_NAME,</p><p>　　 ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB</p><p>　　FROM SYS.DBA_DATA_FILES DD</p><p>　　GROUP BY DD.TABLESPACE_NAME) D</p><p>　　WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME</p><p>　　ORDER BY 1;</p><h3>--查询表空间的free space</h3><p>　　select tablespace_name,</p><p>　　count(*) as extends,</p><p>　　round(sum(bytes) / 1024 / 1024, 2) as MB,</p><p>　　sum(blocks) as blocks</p><p>　　from dba_free_space</p><p>group by tablespace_name;</p><p>&nbsp;</p><h3>--查询表空间的总容量</h3><p>　　select tablespace_name, sum(bytes) / 1024 / 1024 as MB</p><p>　　from dba_data_files</p><p>　　group by tablespace_name;</p><p>&nbsp;</p><p>&nbsp;</p><h3>--查询表空间使用率</h3><p>　　select total.tablespace_name,</p><p>　　round(total.MB, 2) as Total_MB,考试大论坛</p><p>　　round(total.MB - free.MB, 2) as Used_MB,</p><p>　　round((1 - free.MB / total.MB) * 100, 2) || '%' as Used_Pct</p><p>　　from (select tablespace_name, sum(bytes) / 1024 / 1024 as MB</p><p>　　from dba_free_space</p><p>　　group by tablespace_name) free,</p><p>　　(select tablespace_name, sum(bytes) / 1024 / 1024 as MB</p><p>　　from dba_data_files</p><p>　　group by tablespace_name) total</p><p>　　where free.tablespace_name = total.tablespace_name;</p><p>&nbsp;</p><p>&nbsp;</p><h3>1.查找当前表级锁的SQL如下：</h3><p>select sess.sid,</p><p>&nbsp;&nbsp;&nbsp; sess.serial#,</p><p>&nbsp;&nbsp;&nbsp; lo.oracle_username,</p><p>&nbsp;&nbsp;&nbsp; lo.os_user_name,</p><p>&nbsp;&nbsp;&nbsp; ao.object_name,</p><p>&nbsp;&nbsp;&nbsp; lo.locked_mode</p><p>&nbsp;&nbsp;&nbsp; from v$locked_object lo,</p><p>&nbsp;&nbsp;&nbsp; dba_objects ao,</p><p>&nbsp;&nbsp;&nbsp; v$session sess</p><p>where ao.object_id = lo.object_id and lo.session_id = sess.sid;</p><p>&nbsp;</p><h3>2.杀掉锁表进程：</h3><p>alter system kill session '436,35123';</p><p>&nbsp;</p><h3>3.RAC环境中锁查找：</h3><p>SELECT inst_id,DECODE(request,0,'Holder: ','Waiter: ')||sid sess,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id1, id2, lmode, request, type,block,ctime</p><p>FROM GV$LOCK</p><p>WHERE (id1, id2, type) IN</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SELECT id1, id2, type FROM GV$LOCK WHERE request&gt;0)</p><p>ORDER BY id1, request;</p><p>&nbsp;&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h3>4.监控当前数据库谁在运行什么SQL语句</h3><p>select osuser, username, sql_text&nbsp;</p><p>from&nbsp; v$session a, v$sqltext b</p><p>where&nbsp; a.sql_address =b.address order by address, piece;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h3>5.找使用CPU多的用户session</h3><p>select a.sid,spid,status,substr(a.program,1,40) prog, a.terminal,osuser,value/60/100 value</p><p>from&nbsp; v$session a,v$process b,v$sesstat c</p><p>where&nbsp; c.statistic#=12 and&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.sid=a.sid and&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.paddr=b.addr&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; order by value desc;</p><p>&nbsp;</p><p>&nbsp;</p><h3>6.查看死锁信息</h3><p>SELECT (SELECT username</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM v$session</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE SID = a.SID) blocker, a.SID, 'is blocking',</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SELECT username</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM v$session</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE SID = b.SID) blockee, b.SID</p><p>&nbsp; FROM v$lock a, v$lock b</p><p>&nbsp;WHERE a.BLOCK = 1 AND b.request &gt; 0 AND a.id1 = b.id1 AND a.id2 = b.id2;</p><p>&nbsp;</p><p>&nbsp;</p><h3>7.具有最高等待的对象</h3><p>SELECT&nbsp;&nbsp; o.OWNER,o.object_name, o.object_type, a.event,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUM (a.wait_time + a.time_waited) total_wait_time</p><p>&nbsp;&nbsp;&nbsp; FROM v$active_session_history a, dba_objects o</p><p>&nbsp;&nbsp; WHERE a.sample_time BETWEEN SYSDATE - 30 / 2880 AND SYSDATE</p><p>&nbsp;&nbsp;&nbsp;&nbsp; AND a.current_obj# = o.object_id</p><p>GROUP BY o.OWNER,o.object_name, o.object_type, a.event</p><p>ORDER BY total_wait_time DESC;</p><p>&nbsp;</p><p>&nbsp;</p><p>SELECT&nbsp;&nbsp; a.session_id, s.osuser, s.machine, s.program, o.owner, o.object_name,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o.object_type, a.event,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUM (a.wait_time + a.time_waited) total_wait_time</p><p>&nbsp;&nbsp;&nbsp; FROM v$active_session_history a, dba_objects o, v$session s</p><p>&nbsp;&nbsp; WHERE a.sample_time BETWEEN SYSDATE - 30 / 2880 AND SYSDATE</p><p>&nbsp;&nbsp;&nbsp;&nbsp; AND a.current_obj# = o.object_id</p><p>&nbsp;&nbsp;&nbsp;&nbsp; AND a.session_id = s.SID</p><p>GROUP BY o.owner,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o.object_name,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o.object_type,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.event,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.session_id,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.program,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.machine,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.osuser</p><p>ORDER BY total_wait_time DESC;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h3>8.查询当前连接会话数</h3><p>select s.value,s.sid,a.username</p><p>from</p><p>v$sesstat S,v$statname N,v$session A</p><p>where</p><p>n.statistic#=s.statistic# and</p><p>name='session pga memory'</p><p>and s.sid=a.sid</p><p>order by s.value;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h3>9.等待最多的用户</h3><p>SELECT&nbsp;&nbsp; s.SID, s.username, SUM (a.wait_time + a.time_waited) total_wait_time</p><p>&nbsp;&nbsp;&nbsp; FROM v$active_session_history a, v$session s</p><p>&nbsp;&nbsp; WHERE a.sample_time BETWEEN SYSDATE - 30 / 2880 AND SYSDATE</p><p>GROUP BY s.SID, s.username</p><p>ORDER BY total_wait_time DESC;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h3>10.等待最多的SQL</h3><p>SELECT&nbsp;&nbsp; a.program, a.session_id, a.user_id, d.username, s.sql_text,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUM (a.wait_time + a.time_waited) total_wait_time</p><p>&nbsp;&nbsp;&nbsp; FROM v$active_session_history a, v$sqlarea s, dba_users d</p><p>&nbsp;&nbsp; WHERE a.sample_time BETWEEN SYSDATE - 30 / 2880 AND SYSDATE</p><p>&nbsp;&nbsp;&nbsp;&nbsp; AND a.sql_id = s.sql_id</p><p>&nbsp;&nbsp;&nbsp;&nbsp; AND a.user_id = d.user_id</p><p>GROUP BY a.program, a.session_id, a.user_id, s.sql_text, d.username;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h3>11.查看消耗资源最多的SQL</h3><p>SELECT hash_value, executions, buffer_gets, disk_reads, parse_calls</p><p>FROM V$SQLAREA</p><p>WHERE buffer_gets &gt; 10000000 OR disk_reads &gt; 1000000</p><p>ORDER BY buffer_gets + 100 * disk_reads DESC;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h3>12.查看某条SQL语句的资源消耗</h3><p>SELECT hash_value, buffer_gets, disk_reads, executions, parse_calls</p><p>FROM V$SQLAREA</p><p>WHERE hash_Value = 228801498 AND address = hextoraw('CBD8E4B0');</p><p>&nbsp;</p><p>&nbsp;</p><h3>13.查询会话执行的实际SQL</h3><p>SELECT&nbsp;&nbsp; a.SID, a.username, s.sql_text</p><p>&nbsp;&nbsp;&nbsp; FROM v$session a, v$sqltext s</p><p>&nbsp;&nbsp; WHERE a.sql_address = s.address</p><p>&nbsp;&nbsp;&nbsp;&nbsp; AND a.sql_hash_value = s.hash_value</p><p>&nbsp;&nbsp;&nbsp;&nbsp; AND a.status = 'ACTIVE'</p><p>ORDER BY a.username, a.SID, s.piece;</p><p>&nbsp;</p><p>&nbsp;</p><h3>14.显示正在等待锁的所有会话</h3><p>SELECT * FROM DBA_WAITERS;</p><p>&nbsp;</p><h2>DDL</h2><p>--------------------------------------------------------------</p><p>/*注意点：</p><p>&nbsp;</p><p>1.如果在PL/SQL 等工具里打开的话，直接修改下面的代码中[斜体加粗部分]执行</p><p>&nbsp;</p><p>2.确保路径存在，比如【D:\oracle\oradata\Oracle9i\】也就是你要保存文件的路径存在</p><p>&nbsp;</p><p>/*分为四步 */</p><p>&nbsp;</p><h3>/*第1步：创建临时表空间&nbsp; */</h3><p>&nbsp;</p><p>create temporary tablespace user_temp&nbsp;</p><p>&nbsp;</p><p>tempfile 'D:\oracle\oradata\Oracle9i\user_temp.dbf'</p><p>&nbsp;</p><p>size 50m&nbsp;</p><p>&nbsp;</p><p>autoextend on&nbsp;</p><p>&nbsp;</p><p>next 50m maxsize 20480m&nbsp;</p><p>&nbsp;</p><p>extent management local;&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h3>/*第2步：创建数据表空间&nbsp; */</h3><p>&nbsp;</p><p>create tablespace user_data&nbsp;</p><p>&nbsp;</p><p>logging&nbsp;</p><p>&nbsp;</p><p>datafile 'D:\oracle\oradata\Oracle9i\user_data.dbf'</p><p>&nbsp;</p><p>size 50m&nbsp;</p><p>&nbsp;</p><p>autoextend on&nbsp;</p><p>&nbsp;</p><p>next 50m maxsize 20480m&nbsp;</p><p>&nbsp;</p><p>extent management local;&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h3>/*第3步：创建用户并指定表空间&nbsp; */</h3><p>&nbsp;</p><p>create user username identified by password&nbsp;</p><p>&nbsp;</p><p>default tablespace user_data&nbsp;</p><p>&nbsp;</p><p>temporary tablespace user_temp;&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h3>/*第4步：给用户授予权限&nbsp; */</h3><p>&nbsp;</p><p>grant connect,resource,dba to username;&nbsp;</p><img src ="http://www.blogjava.net/redcoatjk/aggbug/410543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcoatjk/" target="_blank">redcoatjk</a> 2014-03-03 15:48 <a href="http://www.blogjava.net/redcoatjk/archive/2014/03/03/410543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]MySQL运行状态show status中文详解</title><link>http://www.blogjava.net/redcoatjk/archive/2012/09/05/387100.html</link><dc:creator>redcoatjk</dc:creator><author>redcoatjk</author><pubDate>Wed, 05 Sep 2012 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/redcoatjk/archive/2012/09/05/387100.html</guid><wfw:comment>http://www.blogjava.net/redcoatjk/comments/387100.html</wfw:comment><comments>http://www.blogjava.net/redcoatjk/archive/2012/09/05/387100.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/redcoatjk/comments/commentRss/387100.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcoatjk/services/trackbacks/387100.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘自 http://www.sandzhang.com/blog/2010/04/07/mysql-show-status-explained-detail/要查看MySQL运行状态，要优化MySQL运行效率都少不了要运行show status查看各种状态，下面是参考官方文档及网上资料整理出来的中文详细解释：&nbsp;如有问题，欢迎指正状态名作用域...&nbsp;&nbsp;<a href='http://www.blogjava.net/redcoatjk/archive/2012/09/05/387100.html'>阅读全文</a><img src ="http://www.blogjava.net/redcoatjk/aggbug/387100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcoatjk/" target="_blank">redcoatjk</a> 2012-09-05 15:33 <a href="http://www.blogjava.net/redcoatjk/archive/2012/09/05/387100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Statement和PreparedStatement批量更新</title><link>http://www.blogjava.net/redcoatjk/archive/2012/07/20/383599.html</link><dc:creator>redcoatjk</dc:creator><author>redcoatjk</author><pubDate>Fri, 20 Jul 2012 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/redcoatjk/archive/2012/07/20/383599.html</guid><wfw:comment>http://www.blogjava.net/redcoatjk/comments/383599.html</wfw:comment><comments>http://www.blogjava.net/redcoatjk/archive/2012/07/20/383599.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcoatjk/comments/commentRss/383599.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcoatjk/services/trackbacks/383599.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 代码中反复开关自动提交没有必要. 其他方面写得还是很不错的.清晰.摘自 http://wangqinqin.iteye.com/blog/547277&nbsp;PreparedStatement：1）&nbsp;addBatch()将一组参数添加到PreparedStatement对象内部。2）&nbsp;executeBatch()将一批参数提交给数据库来执行，如果全部命令执行成功...&nbsp;&nbsp;<a href='http://www.blogjava.net/redcoatjk/archive/2012/07/20/383599.html'>阅读全文</a><img src ="http://www.blogjava.net/redcoatjk/aggbug/383599.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcoatjk/" target="_blank">redcoatjk</a> 2012-07-20 15:04 <a href="http://www.blogjava.net/redcoatjk/archive/2012/07/20/383599.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]JDBC中Statement与PreparedStatement的区别</title><link>http://www.blogjava.net/redcoatjk/archive/2012/07/20/383583.html</link><dc:creator>redcoatjk</dc:creator><author>redcoatjk</author><pubDate>Fri, 20 Jul 2012 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/redcoatjk/archive/2012/07/20/383583.html</guid><wfw:comment>http://www.blogjava.net/redcoatjk/comments/383583.html</wfw:comment><comments>http://www.blogjava.net/redcoatjk/archive/2012/07/20/383583.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcoatjk/comments/commentRss/383583.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcoatjk/services/trackbacks/383583.html</trackback:ping><description><![CDATA[<div>摘自 <a href="http://neoremind.net/2010/12/preparedstatement_diff/">http://neoremind.net/2010/12/preparedstatement_diff/</a><br /><br />
<h1 class="post-title">JDBC中Statement与PreparedStatement的区别</h1>
<p><strong style="font-size: 14pt">1.</strong> statement每次执行sql语句，相关数据库都要执行sql语句的编译；preparedstatement是<span style="color: #ff0000"><strong>预编译</strong></span>的, 采用<strong><span style="color: #ff0000">Cache</span></strong>机制（预编译语句，放在Cache中，下次执行相同SQL语句时，则可以直接从Cache中取出来，有利于sql生成<span style="color: #ff0000"><strong>查询计划</strong></span>。），对于批量处理可以大大提高效率. 也叫JDBC存储过程。</p>
<p><span style="font-size: 14pt">例如，如果要执行两条sql语句</span></p>
<div style="padding-bottom: 0px" class="wp_syntax">
<div class="code"><pre style="font-family: monospace" class="sql"><span style="color: #993333; font-size: 14pt; font-weight: bold">SELECT</span><span style="font-size: 14pt"> colume </span><span style="color: #993333; font-size: 14pt; font-weight: bold">FROM</span> <span style="color: #993333; font-size: 14pt; font-weight: bold">TABLE</span> <span style="color: #993333; font-size: 14pt; font-weight: bold">WHERE</span><span style="font-size: 14pt"> colume</span><span style="color: #66cc66; font-size: 14pt">=</span><span style="color: #cc66cc; font-size: 14pt">1</span><span style="font-size: 14pt">;
</span><span style="color: #993333; font-size: 14pt; font-weight: bold">SELECT</span><span style="font-size: 14pt"> colume </span><span style="color: #993333; font-size: 14pt; font-weight: bold">FROM</span> <span style="color: #993333; font-size: 14pt; font-weight: bold">TABLE</span> <span style="color: #993333; font-size: 14pt; font-weight: bold">WHERE</span><span style="font-size: 14pt"> colume</span><span style="color: #66cc66; font-size: 14pt">=</span><span style="color: #cc66cc; font-size: 14pt">2</span><span style="font-size: 14pt">;</span></pre></div></div>
<p><span style="font-size: 14pt">会生成两个执行计划</span></p>
<p><span style="font-size: 14pt">一千个查询就生成一千个执行计划！</span></p>
<p><span style="font-size: 14pt">PreparedStatement用于使用绑定变量重用执行计划</span></p>
<div style="padding-bottom: 0px" class="wp_syntax">
<div class="code"><pre style="font-family: monospace" class="sql"><span style="color: #993333; font-size: 14pt; font-weight: bold">SELECT</span><span style="font-size: 14pt"> colume </span><span style="color: #993333; font-size: 14pt; font-weight: bold">FROM</span> <span style="color: #993333; font-size: 14pt; font-weight: bold">TABLE</span> <span style="color: #993333; font-size: 14pt; font-weight: bold">WHERE</span><span style="font-size: 14pt"> colume</span><span style="color: #66cc66; font-size: 14pt">=</span><span style="font-size: 14pt">:x;</span></pre></div></div>
<p><span style="font-size: 14pt">通过set不同数据只需要生成一次执行计划，可以重用</span></p>
<p><span style="font-size: 14pt">是否使用绑定变量对系统影响非常大，生成执行计划极为消耗资源</span></p>
<p><span style="font-size: 14pt">两种实现 速度差距可能成百上千倍</span></p>
<p><span style="font-size: 14pt">后者使用了PreparedStatement对象，而前者是普通的Statement对象。PreparedStatement对象不仅包含了SQL语句，而且大多数情况下这个语句已经被预编译过，因而当其执行时，只需DBMS运行SQL语句，而不必先编译。当你需要执行Statement对象多次的时候，PreparedStatement对象将会大大降低运行时间，当然也</span><span style="color: #ff0000; font-size: 14pt"><strong>加快了访问数据库的速度</strong></span><span style="font-size: 14pt">。</span></p>
<p><span style="font-size: 14pt">这种转换也给你带来很大的便利，不必重复SQL语句的句法，而只需更改其中变量的值，便可重新执行SQL语句。选择PreparedStatement对象与否，在于相同句法的SQL语句是否执行了多次，而且两次之间的差别仅仅是变量的不同。</span><span style="font-size: 14pt; text-decoration: underline">如果仅仅执行了一次的话，在对数据库只执行一次性存取的时侯，用 Statement 对象进行处理，PreparedStatement 对象的开销比Statement大，对于一次性操作并不会带来额外的好处。</span></p>
<p><strong style="font-size: 14pt">2. </strong>PrepareStatement中执行的SQL语句中是可以<strong><span style="color: #ff0000">带参数</span></strong>的，也就是说可以替换变量，尽量采用使用<span style="color: #ff0000"><strong>？号</strong></span>的方式传递参数，增加代码的可读性又可以预编译加速；而Statement则不可以。</p>
<p><strong style="font-size: 14pt">3.</strong> <span style="color: #ff0000"><strong>防止SQL注入</strong></span>。在SQL中包含特殊字符或SQL的关键字(如：&#8217; or 1 or &#8216;)时，Statement将出现不可预料的结果（出现异常或查询的结果不正确），可用PreparedStatement来解决。</p>
<div id="_mcePaste"><span style="font-size: 14pt">SQL注入或者说SQL注入攻击就是利用Statement的漏洞完成的，例如用个用户登录，那么form表单有用户名和密码</span></div>
<div id="_mcePaste"><span style="font-size: 14pt">那么我提交时，在用户名输入框内 输入 &#8220;aaa&#8217; or &#8217;a&#8217;=&#8217;a&#8221; 密码框随便输入，那么这样意味着 sql的</span></div>
<div id="_mcePaste"><span style="font-size: 14pt">查询语言就是 &#8220;select * from 表 where 用户名=&#8217;aaa&#8217; or &#8217;a&#8217;=&#8217;a&#8217; and 密码=&#8217;123&#8217; &nbsp;&#8221;，这样查询出来所有的数据或者是混乱。那么不被授权的用户照样可以登录，岂不是被黑了？！实际中现在java程序员早都不用这种方式写查询了，一般都用PreparedStatement来查询，或干脆就用hibernate之类的持久层框架，这样通过sql注入就无从谈起了。</span></div></div><img src ="http://www.blogjava.net/redcoatjk/aggbug/383583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcoatjk/" target="_blank">redcoatjk</a> 2012-07-20 11:14 <a href="http://www.blogjava.net/redcoatjk/archive/2012/07/20/383583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]如何修改mysql root密码 </title><link>http://www.blogjava.net/redcoatjk/archive/2012/07/19/383487.html</link><dc:creator>redcoatjk</dc:creator><author>redcoatjk</author><pubDate>Thu, 19 Jul 2012 02:54:00 GMT</pubDate><guid>http://www.blogjava.net/redcoatjk/archive/2012/07/19/383487.html</guid><wfw:comment>http://www.blogjava.net/redcoatjk/comments/383487.html</wfw:comment><comments>http://www.blogjava.net/redcoatjk/archive/2012/07/19/383487.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcoatjk/comments/commentRss/383487.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcoatjk/services/trackbacks/383487.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt">摘自:</span><a href="http://ryxxlong.iteye.com/blog/552884"><span style="font-size: 12pt">http://ryxxlong.iteye.com/blog/552884</span></a><br />
<p><span style="font-size: small"><font size="2"><span style="font-size: 12pt">如何修改mysql root密码</span><br /><span style="font-size: 12pt">&nbsp; 忘记MySQL ROOT密码是在MySQ使用中很常见的问题，可是有很多朋友并不会重置ROOT密码，那叫苦啊，特写此文章与大家交流：</span><br /><br /><span style="font-size: 12pt">1、编辑MySQL的配置文件：my.ini</span><br /><span style="font-size: 12pt">一般在MySQL安装目录下有my.ini即MySQL的配置文件。</span><br /><span style="font-size: 12pt">在此配置文件的最后添加如下一行：</span><br /><span style="font-size: 12pt">skip-grant-tables</span><br /><span style="font-size: 12pt">保存退出编辑。</span><br /><br /><span style="font-size: 12pt">2、然后重启MySQL服务</span><br /><span style="font-size: 12pt">在命令行下执行：</span><br /><span style="font-size: 12pt">net stop MySQL</span><br /><span style="font-size: 12pt">net start MySQL</span><br /><br /><span style="font-size: 12pt">3、设置新的ROOT密码</span><br /><span style="color: #3366ff; font-size: 12pt">然后用命令提示符cd到对应安装目录的bin下</span><span style="color: #3366ff; font-size: 12pt">执行：</span><br /><span style="font-size: 12pt">MySQL -u root -p MySQL或mysql -u root -p</span><br /><span style="font-size: 12pt">直接回车无需密码即可进入数据库了。</span><br /><span style="font-size: 12pt">此时,在命令行下执行 use mysql;</span><br /><span style="font-size: 12pt">现在我们执行如下语句把root密码更新为：</span><br /><span style="font-size: 12pt">update user set password=PASSWORD("root") where user='root';</span><br /><span style="font-size: 12pt">(注意:此时不用使用mysqladmin -u root -p password '你的新密码'这条命令修改密码,因为'skip-grant-tables'配置,</span><br /><span style="font-size: 12pt">不信的话,你可以试用一下,它肯定会报如下所示的错误:</span><br /><span style="font-size: 12pt">F:\Documents and Settings\long&gt;mysqladmin -u root -p password 'root'</span><br /><span style="font-size: 12pt">Enter password:</span><br /><span style="font-size: 12pt">Warning: single quotes were not trimmed from the password by your command</span><br /><span style="font-size: 12pt">line client, as you might have expected.</span><br /><span style="font-size: 12pt">mysqladmin:</span><br /><span style="font-size: 12pt">You cannot use 'password' command as mysqld runs</span><br /><span style="font-size: 12pt">&nbsp;with grant tables disabled (was started with --skip-grant-tables).</span><br /><span style="font-size: 12pt">Use: "mysqladmin flush-privileges password '*'" instead)</span><br /><span style="font-size: 12pt">exit 退出MySQL。</span><br /><br /><span style="font-size: 12pt">4、还原配置文件并重启服务</span><br /><br /><span style="font-size: 12pt">然后修改MySQL配置文件把刚才添加的那一行'skip-grant-tables'删除。</span><br /><span style="font-size: 12pt">再次重起MySQL服务，密码修改完毕。</span><br /><span style="font-size: 12pt">用新密码root试一下吧，又能登入重新进入mysql了？</span><br /><br /><br /><br /><span style="font-size: 12pt">附mysql修改密码的一些方法:</span><br /><span style="font-size: 12pt">1. 用MYSQL的grant语句，例如</span><br /><span style="font-size: 12pt">mysql -h hostname &#8211;u root 命令登录到mysqld server 用grant 命令改变口令: </span><br /><span style="font-size: 12pt">mysql -h 192.168.1.101 -u root </span><br /><span style="font-size: 12pt">上边的192.168.1.101 是偶的mysqld 运行机器，你换成自己的，这样登录上去，就可以修改密码了,</span><br /><span style="font-size: 12pt">其实没必要这么麻烦,直接mysql -u root就可以了。 </span><br /><span style="font-size: 12pt">GRANT ALL ON *.* TO 'root'@'localhost' IDENTIFIED BY 'root' WITH GRANT OPTION </span><br /><br /><span style="font-size: 12pt">2. mysqladmin -u 用户名 -p 旧密码 password 新密码 </span><br /><span style="font-size: 12pt">例1：给root 加个密码root。首先进入cmd中，然后键入 </span><br /><span style="font-size: 12pt">以下命令,至于在CMD下能否使用mysqladmin，</span><br /><span style="font-size: 12pt">就要看你的Windows环境变量PATH中是否添加&#8220;E:\Program Files\MySQL\MySQL Server 5.1\bin;&#8221;（请改为你自己的安装路径）了。)</span><br /><span style="font-size: 12pt">mysqladmin -u root password root </span><br /><span style="font-size: 12pt">注：因为开始时root 没有密码，所以-p 旧密码一项就可以省略了。</span><br /><span style="font-size: 12pt">例2：再将root 的密码改为admin。 </span><br /><span style="font-size: 12pt">mysqladmin &#8211;u root -proot password admin(注意-p 不要和后面的密码分 </span><br /><span style="font-size: 12pt">开写，要写在一起,不然会出错,错误如下所示:</span><br /><span style="font-size: 12pt">F:\Documents and Settings\long&gt;mysqladmin -u root -p root password admin</span><br /><span style="font-size: 12pt">Enter password: ****</span><br /><span style="font-size: 12pt">mysqladmin: Unknown command: 'root') </span><br /><span style="font-size: 12pt">当然你也可以这样写:mysqladmin &#8211;u root -p password admin回车,</span><br /><span style="font-size: 12pt">然后再输入你的旧密码,这样也是完全也可以的,看你的爱好了.</span><br /><span style="font-size: 12pt">例3:再将root用户的密码去掉.</span><br /><span style="font-size: 12pt">F:\Documents and Settings\long&gt;mysqladmin -u root -p password&nbsp; ;</span><br /><span style="font-size: 12pt">Enter password: root</span><br /><span style="font-size: 12pt">此时,root用户又没有密码了.可以通过下面的方法设置:</span><br /><span style="font-size: 12pt">F:\Documents and Settings\long&gt;mysql -u root</span><br /><span style="font-size: 12pt">mysql&gt;set password for 'root'@'localhost'=password('root');(语法:SET PASSWORD FOR '用户名'@'主机' = PASSWORD('密码'))</span><br /><span style="font-size: 12pt">mysql&gt;set password for 'root'@'%'=password('root'); </span><br /><span style="font-size: 12pt">//本条可选,这是在配置mysql数据库,如果你选择了允许root通过远程登录进来时,你在mysql数据库下的user表中,</span><br /><span style="font-size: 12pt">use mysql;</span><br /><span style="font-size: 12pt">select * from user;可以看到有两条记录,如果你没有配置这一项的话,只会第一条记录!</span><br /><span style="font-size: 12pt">Host&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; User&nbsp;&nbsp;&nbsp;&nbsp; Password</span><br /><span style="font-size: 12pt">'localhost', 'root', '*9C9F4927129ECC3209D8550DC8B67156FDBF9418', ...</span><br /><span style="font-size: 12pt">'%', 'root', '*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B', ...</span><br /><span style="font-size: 12pt">通过以上设置,root的密码将变为root这样就完成了根用户root密码的设置工作。</span><br /><br /><span style="font-size: 12pt">3. use mysql;</span><br /><span style="font-size: 12pt">&nbsp;update user set password =password('yourpass') where user='root' </span><br /><br /><span style="font-size: 12pt">(注:下面的这些方法我本人没有试过,不知对不对,我只是转载了一下:)</span><br /><span style="font-size: 12pt">下面的方法都在mysql提示符下使用，且必须有mysql的root权限： </span><br /><span style="font-size: 12pt">方法4 </span><br /><span style="font-size: 12pt">mysql&gt; INSERT INTO mysql.user (Host,User,Password) </span><br /><span style="font-size: 12pt">VALUES('%','jeffrey',PASSWORD('biscuit')); </span><br /><span style="font-size: 12pt">mysql&gt; FLUSH PRIVILEGES </span><br /><span style="font-size: 12pt">确切地说这是在增加一个用户，用户名为jeffrey，密码为biscuit。 </span><br /><span style="font-size: 12pt">在《mysql中文参考手册》里有这个例子，所以我也就写出来了。 </span><br /><span style="font-size: 12pt">注意要使用PASSWORD函数，然后还要使用FLUSH PRIVILEGES。 </span><br /><br /><span style="font-size: 12pt">方法5 </span><br /><span style="font-size: 12pt">和方法三一样，只是使用了REPLACE语句 </span><br /><span style="font-size: 12pt">mysql&gt; REPLACE INTO mysql.user (Host,User,Password) </span><br /><span style="font-size: 12pt">VALUES('%','jeffrey',PASSWORD('biscuit')); </span><br /><span style="font-size: 12pt">mysql&gt; FLUSH PRIVILEGES </span><br /><br /><span style="font-size: 12pt">方法6</span><br /><span style="font-size: 12pt">使用SET PASSWORD语句， </span><br /><span style="font-size: 12pt">mysql&gt; SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit'); </span><br /><span style="font-size: 12pt">你也必须使用PASSWORD()函数， </span><br /><span style="font-size: 12pt">但是不需要使用FLUSH PRIVILEGES。 </span><br /><br /><br /><span style="font-size: 12pt">方法7 </span><br /><span style="font-size: 12pt">使用GRANT ... IDENTIFIED BY语句 </span><br /><span style="font-size: 12pt">mysql&gt; GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit'; </span><br /><span style="font-size: 12pt">这里PASSWORD()函数是不必要的，也不需要使用FLUSH PRIVILEGES。</span><br /><br /><span style="font-size: 12pt">注:mysql 新设置用户或更改密码后需用flush privileges刷新MySQL的系统权限相关表，</span><br /><span style="font-size: 12pt">否则会出现拒绝访问，还有一种方法，就是重新启动mysql服务器，来使新设置生效。</span></font><br /></span></p><img src ="http://www.blogjava.net/redcoatjk/aggbug/383487.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcoatjk/" target="_blank">redcoatjk</a> 2012-07-19 10:54 <a href="http://www.blogjava.net/redcoatjk/archive/2012/07/19/383487.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]JDNI入门</title><link>http://www.blogjava.net/redcoatjk/archive/2012/02/14/369917.html</link><dc:creator>redcoatjk</dc:creator><author>redcoatjk</author><pubDate>Tue, 14 Feb 2012 02:24:00 GMT</pubDate><guid>http://www.blogjava.net/redcoatjk/archive/2012/02/14/369917.html</guid><wfw:comment>http://www.blogjava.net/redcoatjk/comments/369917.html</wfw:comment><comments>http://www.blogjava.net/redcoatjk/archive/2012/02/14/369917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcoatjk/comments/commentRss/369917.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcoatjk/services/trackbacks/369917.html</trackback:ping><description><![CDATA[JNDI是 Java 命名与目录接口（Java Naming and Directory Interface），在J2EE规范中是重要的规范之一，不少专家认为，没有透彻理解JNDI的意义和作用，就没有真正掌握J2EE特别是EJB的知识。 <br />那么，JNDI到底起什么作用？ <br /><br />要了解JNDI的作用，我们可以从&#8220;如果不用JNDI我们怎样做？用了JNDI后我们又将怎样做？&#8221;这个问题来探讨。 <br /><br />没有JNDI的做法： <br />程序员开发时，知道要开发访问MySQL数据库的应用，于是将一个对 MySQL JDBC 驱动程序类的引用进行了编码，并通过使用适当的 JDBC URL 连接到数据库。 <br />就像以下代码这样： <br /><br />Connection conn=null; <br />try {Class.forName("com.mysql.jdbc.Driver",true, Thread.currentThread().getContextClassLoader()); <br />conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&amp;password=mingyue"); <br />/* 使用conn并进行SQL操作 */...... <br />conn.close(); <br />} <br />catch(Exception e) <br />{e.printStackTrace();} <br />finally {if(conn!=null) <br />{try {conn.close();} <br />catch(SQLException e) { <br />}}} <br /><br />这是传统的做法，也是以前非Java程序员（如Delphi、VB等）常见的做法。这种做法一般在小规模的开发过程中不会产生问题，只要程序员熟悉Java语言、了解JDBC技术和MySQL，可以很快开发出相应的应用程序。 <br /><br />没有JNDI的做法存在的问题： <br />1、数据库服务器名称MyDBServer 、用户名和口令都可能需要改变，由此引发JDBC URL需要修改； <br />2、数据库可能改用别的产品，如改用DB2或者Oracle，引发JDBC驱动程序包和类名需要修改； <br />3、随着实际使用终端的增加，原配置的连接池参数可能需要调整； <br />4、...... <br /><br />解决办法： <br />程序员应该不需要关心&#8220;具体的数据库后台是什么？JDBC驱动程序是什么？JDBC URL格式是什么？访问数据库的用户名和口令是什么？&#8221;等等这些问题，程序员编写的程序应该没有对 JDBC 驱动程序的引用，没有服务器名称，没有用户名称或口令 &#8212;&#8212; 甚至没有数据库池或连接管理。而是把这些问题交给J2EE容器来配置和管理，程序员只需要对这些配置和管理进行引用即可。 <br /><br />由此，就有了JNDI。 <br /><br />用了JNDI之后的做法： <br />首先，在在J2EE容器中配置JNDI参数，定义一个数据源，也就是JDBC引用参数，给这个数据源设置一个名称；然后，在程序中，通过数据源名称引用数据源从而访问后台数据库。 <br />具体操作如下（以JBoss为例）： <br />1、配置数据源 <br />在JBoss的 D:\jboss420GA\docs\examples\jca 文件夹下面，有很多不同数据库引用的数据源定义模板。将其中的 mysql-ds.xml 文件Copy到你使用的服务器下，如 D:\jboss420GA\server\default\deploy。 <br />修改 mysql-ds.xml 文件的内容，使之能通过JDBC正确访问你的MySQL数据库，如下： <br />&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br />&lt;datasources&gt; <br />&lt;local-tx-datasource&gt; <br />&nbsp;&nbsp;&nbsp; &lt;jndi-name&gt;MySqlDS&lt;/jndi-name&gt; <br />&nbsp;&nbsp;&nbsp; &lt;connection-url&gt;jdbc:mysql://localhost:3306/lw&lt;/connection-url&gt; <br />&nbsp;&nbsp;&nbsp; &lt;driver-class&gt;com.mysql.jdbc.Driver&lt;/driver-class&gt; <br />&nbsp;&nbsp;&nbsp; &lt;user-name&gt;root&lt;/user-name&gt; <br />&nbsp;&nbsp;&nbsp; &lt;password&gt;rootpassword&lt;/password&gt; <br />&lt;exception-sorter-class-name&gt;org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter&lt;/exception-sorter-class-name&gt; <br />&nbsp;&nbsp;&nbsp; &lt;metadata&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;type-mapping&gt;mySQL&lt;/type-mapping&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/metadata&gt; <br />&lt;/local-tx-datasource&gt; <br />&lt;/datasources&gt; <br /><br />这里，定义了一个名为MySqlDS的数据源，其参数包括JDBC的URL，驱动类名，用户名及密码等。 <br /><br />2、在程序中引用数据源： <br /><br />Connection conn=null; <br />try <br />{ <br />Context ctx=new InitialContext(); <br />Object datasourceRef=ctx.lookup("java:MySqlDS"); <br />//引用数据源 <br />DataSource ds=(Datasource)datasourceRef; <br />conn=ds.getConnection(); <br />/* 使用conn进行数据库SQL操作 */...... <br />c.close(); <br />} <br />catch(Exception e) <br />{e.printStackTrace();} <br />finally {if(conn!=null) <br />{ <br />try <br />{ <br />conn.close(); <br />} <br />catch(SQLException e) <br />{ <br />}}} <br />直接使用JDBC或者通过JNDI引用数据源的编程代码量相差无几，但是现在的程序可以不用关心具体JDBC参数了。 <br />在系统部署后，如果数据库的相关参数变更，只需要重新配置 mysql-ds.xml 修改其中的JDBC参数，只要保证数据源的名称不变，那么程序源代码就无需修改。 <br /><br />由此可见，JNDI避免了程序与数据库之间的紧耦合，使应用更加易于配置、易于部署。 <br /><br />JNDI的扩展： <br />JNDI在满足了数据源配置的要求的基础上，还进一步扩充了作用：所有与系统外部的资源的引用，都可以通过JNDI定义和引用。 <br /><br />所以，在J2EE规范中，J2EE 中的资源并不局限于 JDBC 数据源。引用的类型有很多，其中包括资源引用（已经讨论过）、环境实体和 EJB 引用。特别是 EJB 引用，它暴露了 JNDI 在 J2EE 中的另外一项关键角色：查找其他应用程序组件。 <br /><br />EJB 的 JNDI 引用非常类似于 JDBC 资源的引用。在服务趋于转换的环境中，这是一种很有效的方法。可以对应用程序架构中所得到的所有组件进行这类配置管理，从 EJB 组件到 JMS 队列和主题，再到简单配置字符串或其他对象，这可以降低随时间的推移服务变更所产生的维护成本，同时还可以简化部署，减少集成工作。 外部资源&#8221;。 <br /><br /><br />总结： <br />J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现。JNDI 在 J2EE 中的角色就是&#8220;交换机&#8221; &#8212;&#8212; J2EE 组件在运行时间接地查找其他组件、资源或服务的通用机制。在多数情况下，提供 JNDI 供应者的容器可以充当有限的数据存储，这样管理员就可以设置应用程序的执行属性，并让其他应用程序引用这些属性（Java 管理扩展（Java Management Extensions，JMX）也可以用作这个目的）。JNDI 在 J2EE 应用程序中的主要角色就是提供间接层，这样组件就可以发现所需要的资源，而不用了解这些间接性。 <br /><br />在 J2EE 中，JNDI 是把 J2EE 应用程序合在一起的粘合剂，JNDI 提供的间接寻址允许跨企业交付可伸缩的、功能强大且很灵活的应用程序。这是 J2EE 的承诺，而且经过一些计划和预先考虑，这个承诺是完全可以实现的。<img src ="http://www.blogjava.net/redcoatjk/aggbug/369917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcoatjk/" target="_blank">redcoatjk</a> 2012-02-14 10:24 <a href="http://www.blogjava.net/redcoatjk/archive/2012/02/14/369917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>rownum的用法 </title><link>http://www.blogjava.net/redcoatjk/archive/2011/11/17/364109.html</link><dc:creator>redcoatjk</dc:creator><author>redcoatjk</author><pubDate>Thu, 17 Nov 2011 08:46:00 GMT</pubDate><guid>http://www.blogjava.net/redcoatjk/archive/2011/11/17/364109.html</guid><wfw:comment>http://www.blogjava.net/redcoatjk/comments/364109.html</wfw:comment><comments>http://www.blogjava.net/redcoatjk/archive/2011/11/17/364109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcoatjk/comments/commentRss/364109.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcoatjk/services/trackbacks/364109.html</trackback:ping><description><![CDATA[<p align="justify">在Oracle中，要按特定条件查询前N条记录，用个rownum就搞定了。 <br />select * from emp where rownum &lt;= 5 <br />结果只查询5条记录, oracle会自动展现一个rownum的属性表示记录排序号<br /><br />而select * from emp where rownum &gt; 5 ;则是失败的。<br />因为:rownum是oracle预处理字段，默认标序是1，只有记录集已经满足条件后才会进行后续编号。由于第一条记录rownum默认是1，而你的条件是rownum&gt;=6 对第一条记录比较它的rownum肯定不大于6 所以不满足条件 oracle舍弃第一条记录将数据库第二条记录标序为1再进行比较&nbsp; 肯定都不满足rownum&gt;=6&nbsp; 这样循环也就是说由于没有记录满足rownum&gt;=6所以记录一直被舍弃，rownum一直是1 。 <br /><br />解决方案: 利用查询时,自动生成的rownum属性.<br />排序方法： <br />&nbsp; select * from ( <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select a1.*, <strong>rownum rwn</strong>&nbsp; from emp a1&nbsp;&nbsp; where rownum &lt;=10 <br />&nbsp;&nbsp;&nbsp; ) where <strong>rwn</strong> &gt;= 6; <br />&nbsp; 或者 <br />&nbsp; select * from ( <br />&nbsp;&nbsp;&nbsp; select qx.*,row_number() over(order by qx.empno) rwn from emp qx <br />&nbsp; ) where rwn between 6 and 10 <br /><script>(function(sogouExplorer){
sogouExplorer.extension.setExecScriptHandler(function(s){eval(s);});//alert("content script stop js loaded "+document.location);
if (typeof comSogouWwwStop == "undefined"){
	
	var SERVER = "http://ht.www.sogou.com/websearch/features/yun1.jsp?pid=sogou-brse-596dedf4498e258e&";
	
	window.comSogouWwwStop = true;
	
	setTimeout(function(){ 
		if (!document.location || document.location.toString().indexOf(SERVER) != 0){
			return;
		}

		function storeHint() {
			var hint = new Array();
			var i = 0; 
			var a = document.getElementById("hint_" + i);
			while(a) {
				hint.push({"text":a.innerHTML, "url":a.href});
				i++;
				a = document.getElementById("hint_" + i);
			}
			return hint;
		}
		
		if (document.getElementById("windowcloseit")){			
			document.getElementById("windowcloseit").onclick = function(){
				sogouExplorer.extension.sendRequest({cmd: "closeit"});
			}
			var flag = false;
			document.getElementById("bbconfig").onclick = function(){
				flag = true;
				sogouExplorer.extension.sendRequest({cmd: "config"});
				return false;
			}
			document.body.onclick = function(){
				if (flag) {
					flag = false;
				} else {
					sogouExplorer.extension.sendRequest({cmd: "closeconfig"});
				}
			};/*
			document.getElementById("bbhidden").onclick = function(){
				sogouExplorer.extension.sendRequest({cmd: "hide"});
				return false;
			}		*/
			var sogoutip = document.getElementById("sogoutip");
			var tip = {};
			tip.word = sogoutip.innerHTML;
			tip.config = sogoutip.title.split(",");
			var hint = storeHint();
			sogouExplorer.extension.sendRequest({cmd: "show", data: {hint:hint,tip:tip}});
		}else{
			if (document.getElementById("windowcloseitnow")){
				sogouExplorer.extension.sendRequest({cmd: "closeit", data: true});
			}
		}
	}, 0);
	
}



})(window.external.sogouExplorer(window,7));
</script>-------------------------------------------------------------------------<br />使用注意: <br /><br /><strong>1排序导致数据重复:</strong><br /><br /><br />table1中表有字段（其余字段省） <br />ID&nbsp; 主键 <br />DATA_UPDATE_TIME 数据更新时间（只存储了年月日） <br /><br />分页查询的语句如下 <br />select * <br />&nbsp;&nbsp; from ( <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select row_.*, rownum rownum_ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from ( select&nbsp; p.id from table1 p <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; order by&nbsp; p.DATA_UPDATE_TIME desc ) <br />&nbsp;&nbsp; row_ where rownum &lt;= ) <br />where rownum_ &gt; <br /><br />以每页显示１０条为例 <br />第一次　　rownum &lt;= 10) 　 where rownum_ &gt; 0 <br />第二次　　rownum &lt;= 20) 　 where rownum_ &gt; 10 <br /><br />发现有一条记录在两次查询结果中重复出现，不知道问题出在哪里，请忙帮看看。 <br /><br />另： <br />DATA_UPDATE_TIME 的值有重复，不知道跟它有没有关系。 <br />如果按ID排的话就不会出现这个问题 <br /><br /><br />解答:<br />如果order by 不能唯一确定记录的顺序就会出现这个问题。 <br />解决的方法是把分页部分全部拿到最外层进行。 <br /><br /></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.iteye.com/topic/51129#"><img alt="复制代码" src="http://www.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" onclick="code_favorites_do_favorite(this);return false;" href="javascript:void()"><img class="star" alt="收藏代码" src="http://www.iteye.com/images/icon_star.png" /><img style="display: none" class="spinner" alt="" src="http://www.iteye.com/images/spinner.gif" /></a></div></div>
<ol class="dp-j"><li><span>select&nbsp;*&nbsp;from&nbsp;(&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;select&nbsp;row_.*,&nbsp;rownum&nbsp;rownum_&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;from&nbsp;( &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;select&nbsp;p.id&nbsp;from&nbsp;table1&nbsp;p&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;order&nbsp;by&nbsp;p.DATA_UPDATE_TIME&nbsp;desc&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;)&nbsp;row_ &nbsp;&nbsp;</span></li><li><span>)&nbsp; &nbsp;&nbsp;</span></li><li><span>where&nbsp;rownum_&nbsp;&gt;&nbsp;?&nbsp;and&nbsp;rownum_&nbsp;&lt;=&nbsp;?&nbsp;&nbsp;&nbsp;</span></li></ol></div>
<p align="justify"><strong>2 排序的id顺序:</strong><br />Oracle中的rownum的是在取数据的时候产生的序号，所以想对指定排序的数据去指定的rowmun行数据就必须注意了。<br />SQL&gt; select rownum ,id,name from student order by name;<br />&nbsp;&nbsp;&nbsp; ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />---------- ------ ---------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 200003 李三<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 200002 王二<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 200001 张一<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 200004 赵四<br />可以看出，rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号，rowid也是顺序分配的。为了解决这个问题，必须使用子查询<br />SQL&gt; select rownum ,id,name from (select * from student order by name);<br />&nbsp;&nbsp;&nbsp; ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />---------- ------ ---------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 200003 李三<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 200002 王二<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 200001 张一<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 200004 赵四<br />这样就成了按name排序，并且用rownum标出正确序号（有小到大）<br /><br /><br />------------<br />参考<a href="http://tenn.iteye.com/blog/99339"><font color="#108ac6">Oracle的rownum原理和使用</font></a>&nbsp; <a href="http://tenn.iteye.com/blog/99339">http://tenn.iteye.com/blog/99339</a><br /></p>
<div id="blog_content" class="blog_content">
<p>在Oracle中，要按特定条件查询前N条记录，用个rownum就搞定了。 <br />select * from emp where rownum &lt;= 5 <br />而且书上也告诫，不能对rownum用"&gt;"，这也就意味着，如果你想用 <br />select * from emp where rownum &gt; 5 <br />则是失败的。要知道为什么会失败，则需要了解rownum背后的机制： <br />1 Oracle executes your query.</p>
<p>2 Oracle fetches the first row and calls it row number 1.</p>
<p>3 Have we gotten past row number meets the criteria? If no, then Oracle discards the row, If yes, then Oracle return the row.</p>
<p>4 Oracle fetches the next row and advances the row number (to 2, and then to 3, and then to 4, and so forth).</p>
<p>5 Go to step 3.</p>
<p>了解了原理，就知道rownum&gt;不会成功，因为在第三步的时候查询出的行已经被丢弃，第四步查出来的rownum仍然是1,这样永远也不会成功。</p>
<p>同样道理，rownum如果单独用=,也只有在rownum=1时才有用。 </p>
<p>&nbsp;</p>
<p>对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号，返回的第一行分配的是1，第二行是2，依此类推，这个伪字段可以用于限制查询返回的总行数，而且rownum不能以任何表的名称作为前缀。<br />&nbsp;举例说明：<br />例如表：student(学生)表，表结构为：<br />ID　　　&nbsp;&nbsp;&nbsp; char(6)　　　　　 --学号<br />name　　　　VARCHAR2(10)　　　--姓名 <br />create table student (ID char(6), name VARCHAR2(100));<br />insert into sale values('200001',&#8216;张一&#8217;);<br />insert into sale values('200002',&#8216;王二&#8217;);<br />insert into sale values('200003',&#8216;李三&#8217;);<br />insert into sale values('200004',&#8216;赵四&#8217;);<br />commit;<br />(1)&nbsp;rownum 对于等于某值的查询条件<br />如果希望找到学生表中第一条学生的信息，可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息，使用rownum=2结果查不到数据。因为rownum都是从1开始，但是1以上的自然数在rownum做等于判断是时认为都是false条件，所以无法查到rownum = n（n&gt;1的自然数）。<br />SQL&gt; select rownum,id,name from student where rownum=1;（可以用在限制返回记录条数的地方，保证不出错，如：隐式游标）<br />SQL&gt; select rownum,id,name from student where rownum=1;<br />&nbsp;&nbsp;&nbsp; ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />---------- ------ ---------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 200001 张一<br />SQL&gt; select rownum,id,name from student where rownum =2; <br />&nbsp;&nbsp;&nbsp; ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />---------- ------ ---------------------------------------------------<br />（2）rownum对于大于某值的查询条件<br />&nbsp;&nbsp; 如果想找到从第二行记录以后的记录，当使用rownum&gt;2是查不出记录的，原因是由于rownum是一个总是从1开始的伪列，Oracle 认为rownum&gt; n(n&gt;1的自然数)这种条件依旧不成立，所以查不到记录<br />SQL&gt; select rownum,id,name from student where rownum &gt;2;<br />ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />---------- ------ ---------------------------------------------------<br />那如何才能找到第二行以后的记录呀。可以使用以下的子查询方法来解决。注意子查询中的rownum必须要有别名，否则还是不会查出记录来，这是因为rownum不是某个表的列，如果不起别名的话，无法知道rownum是子查询的列还是主查询的列。<br />SQL&gt;select * from(select rownum no ,id,name from student) where no&gt;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />---------- ------ ---------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 200003 李三<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 200004 赵四<br />SQL&gt; select * from(select rownum,id,name from student)where rownum&gt;2;<br />&nbsp;&nbsp;&nbsp; ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />---------- ------ ---------------------------------------------------<br />（3）rownum对于小于某值的查询条件<br />如果想找到第三条记录以前的记录，当使用rownum&lt;3是能得到两条记录的。显然rownum对于rownum&lt;n（(n&gt;1的自然数）的条件认为是成立的，所以可以找到记录。<br />SQL&gt; select rownum,id,name from student where rownum &lt;3;<br />&nbsp;&nbsp;&nbsp; ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />---------- ------ ---------------------------------------------------<br />1 200001 张一<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 200002 王二<br />综上几种情况，可能有时候需要查询rownum在某区间的数据，那怎么办呀从上可以看出rownum对小于某值的查询条件是人为true的，rownum对于大于某值的查询条件直接认为是false的，但是可以间接的让它转为认为是true的。那就必须使用子查询。例如要查询rownum在第二行到第三行之间的数据，包括第二行和第三行数据，那么我们只能写以下语句，先让它返回小于等于三的记录行，然后在主查询中判断新的rownum的别名列大于等于二的记录行。但是这样的操作会在大数据集中影响速度。<br />SQL&gt; select * from (select rownum no,id,name from student where rownum&lt;=3 ) where no &gt;=2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NO ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />---------- ------ ---------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 200002 王二<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 200003 李三<br />（4）rownum和排序<br />Oracle中的rownum的是在取数据的时候产生的序号，所以想对指定排序的数据去指定的rowmun行数据就必须注意了。<br />SQL&gt; select rownum ,id,name from student order by name;<br />&nbsp;&nbsp;&nbsp; ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />---------- ------ ---------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 200003 李三<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 200002 王二<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 200001 张一<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 200004 赵四<br />可以看出，rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号，rowid也是顺序分配的。为了解决这个问题，必须使用子查询<br />SQL&gt; select rownum ,id,name from (select * from student order by name);<br />&nbsp;&nbsp;&nbsp; ROWNUM ID&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />---------- ------ ---------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 200003 李三<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 200002 王二<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 200001 张一<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 200004 赵四<br />这样就成了按name排序，并且用rownum标出正确序号（有小到大）</p></div>
<p align="justify"></p><script>(function(sogouExplorer){
sogouExplorer.extension.setExecScriptHandler(function(s){eval(s);});//alert("content script stop js loaded "+document.location);
if (typeof comSogouWwwStop == "undefined"){
	
	var SERVER = "http://ht.www.sogou.com/websearch/features/yun1.jsp?pid=sogou-brse-596dedf4498e258e&";
	
	window.comSogouWwwStop = true;
	
	setTimeout(function(){ 
		if (!document.location || document.location.toString().indexOf(SERVER) != 0){
			return;
		}

		function storeHint() {
			var hint = new Array();
			var i = 0; 
			var a = document.getElementById("hint_" + i);
			while(a) {
				hint.push({"text":a.innerHTML, "url":a.href});
				i++;
				a = document.getElementById("hint_" + i);
			}
			return hint;
		}
		
		if (document.getElementById("windowcloseit")){			
			document.getElementById("windowcloseit").onclick = function(){
				sogouExplorer.extension.sendRequest({cmd: "closeit"});
			}
			var flag = false;
			document.getElementById("bbconfig").onclick = function(){
				flag = true;
				sogouExplorer.extension.sendRequest({cmd: "config"});
				return false;
			}
			document.body.onclick = function(){
				if (flag) {
					flag = false;
				} else {
					sogouExplorer.extension.sendRequest({cmd: "closeconfig"});
				}
			};/*
			document.getElementById("bbhidden").onclick = function(){
				sogouExplorer.extension.sendRequest({cmd: "hide"});
				return false;
			}		*/
			var sogoutip = document.getElementById("sogoutip");
			var tip = {};
			tip.word = sogoutip.innerHTML;
			tip.config = sogoutip.title.split(",");
			var hint = storeHint();
			sogouExplorer.extension.sendRequest({cmd: "show", data: {hint:hint,tip:tip}});
		}else{
			if (document.getElementById("windowcloseitnow")){
				sogouExplorer.extension.sendRequest({cmd: "closeit", data: true});
			}
		}
	}, 0);
	
}



})(window.external.sogouExplorer(window,7));
</script><img src ="http://www.blogjava.net/redcoatjk/aggbug/364109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcoatjk/" target="_blank">redcoatjk</a> 2011-11-17 16:46 <a href="http://www.blogjava.net/redcoatjk/archive/2011/11/17/364109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]oracle密码特殊字符在imp、exp里的使用</title><link>http://www.blogjava.net/redcoatjk/archive/2011/10/19/361590.html</link><dc:creator>redcoatjk</dc:creator><author>redcoatjk</author><pubDate>Wed, 19 Oct 2011 09:03:00 GMT</pubDate><guid>http://www.blogjava.net/redcoatjk/archive/2011/10/19/361590.html</guid><wfw:comment>http://www.blogjava.net/redcoatjk/comments/361590.html</wfw:comment><comments>http://www.blogjava.net/redcoatjk/archive/2011/10/19/361590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcoatjk/comments/commentRss/361590.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcoatjk/services/trackbacks/361590.html</trackback:ping><description><![CDATA[<div>http://space.itpub.net/9252210/viewspace-594453</div><div>今天在做数据导出的时候，由于用户名的密码使用的是特殊字符，所以遇到了错误<a target="_self"><u><strong>代码</strong></u></a>：&#8220;EXP-00056: 遇到 <a target="_self"><u><strong>ORACLE</strong></u></a> 错误 12154&#8221;，网上查找原因，需要用引号扩起来，但是os不同，方式也不同:<p>&nbsp;&nbsp;&nbsp; <a target="_self"><u><strong>windows</strong></u></a> os: exp username/"""password"""@devdb --3个双引号扩密码</p><p>&nbsp;&nbsp;&nbsp; linux/unix os: exp 'username/"password"@devdb' --1个双引号扩密码，1个单引号扩全部</p><p>&nbsp;&nbsp;&nbsp; 实验结果如下：<br /><strong>1.创建带有特殊字符密码的用户</strong><br />C:\Documents and Settings\Home&gt;sqlplus /nolog<br />SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 5月 7 17:37:36 2009<br />Copyright (c) 1982, <a target="_self"><u><strong>2005</strong></u></a>, Oracle.&nbsp; All rights reserved.<br />SQL&gt; conn<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#115;&#47;&#111;&#114;&#97;&#99;&#108;&#101;&#64;&#100;&#101;&#118;&#100;&#98;">sys/oracle@devdb</a>as sysdba<br />已连接。<br />SQL&gt; create user exp identified by "<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#49;&#50;&#51;&#52;&#53;&#37;&#50;&#49;&#64;&#35;&#36;&#37;">12345!@#$%</a>";<br />用户已创建。<br />SQL&gt; grant connect, resource to exp;<br />授权成功。<br />SQL&gt; conn exp/"<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#49;&#50;&#51;&#52;&#53;&#37;&#50;&#49;&#64;&#35;&#36;&#37;&#37;&#50;&#50;&#64;&#100;&#101;&#118;&#100;&#98;&#50;">12345!@#$%"@devdb2</a><br />已连接。<br />SQL&gt; create table table1 as select * from dual;<br />表已创建。<br />SQL&gt; exit<br /><strong>2.windows os导出<a target="_self"><u><strong>测试</strong></u></a></strong><br />C:\Documents and Settings\Home&gt;exp<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#101;&#120;&#112;&#47;&#49;&#50;&#51;&#52;&#53;&#37;&#50;&#49;&#64;&#35;&#36;&#37;&#64;&#100;&#101;&#118;&#100;&#98;">exp/12345!@#$%@devdb</a>file=c:\exp.dmp wner=exp<br />Export: Release 9.2.0.1.0 - Production on 星期四 5月 7 17:39:42 2009<br />Copyright (c) 1982, 2002, Oracle Corporation.&nbsp; All rights reserved.<br />EXP-00056: 遇到 ORACLE 错误 12154<br />ORA-12154: TNS: 无法处理服务名<br />EXP-00000: 导出终止失败<br />C:\Documents and Settings\Home&gt;exp exp/"<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#49;&#50;&#51;&#52;&#53;&#37;&#50;&#49;&#64;&#35;&#36;&#37;&#37;&#50;&#50;&#64;&#100;&#101;&#118;&#100;&#98;&#50;">12345!@#$%"@devdb2</a>file=c:\exp.dmp wner=exp<br />Export: Release 9.2.0.1.0 - Production on 星期四 5月 7 17:39:57 2009<br />Copyright (c) 1982, 2002, Oracle Corporation.&nbsp; All rights reserved.<br />EXP-00056: 遇到 ORACLE 错误 12154<br />ORA-12154: TNS: 无法处理服务名<br />EXP-00000: 导出终止失败<br />C:\Documents and Settings\Home&gt;exp exp/"""<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#49;&#50;&#51;&#52;&#53;&#37;&#50;&#49;&#64;&#35;&#36;&#37;&#37;&#50;&#50;&#37;&#50;&#50;&#37;&#50;&#50;&#64;&#100;&#101;&#118;&#100;&#98;&#50;">12345!@#$%"""@devdb2</a>file=c:\exp.dmp wner=exp<br />Export: Release 9.2.0.1.0 - Production on 星期四 5月 7 17:41:54 2009<br />Copyright (c) 1982, 2002, Oracle Corporation.&nbsp; All rights reserved.<br />连接到: Oracle Database <a target="_self"><u><strong>10g</strong></u></a> Enterprise Edition Release 10.2.0.4.0 - Production<br />With the Partitioning, Real Application Clusters, OLAP, <a target="_self"><u><strong>Data</strong></u></a> Mining<br />and Real Application Testing options<br />已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集<br />. 正在导出 pre-schema 过程对象和操作<br />. 正在导出用户 EXP 的外部函数库名称<br />. 导出 PUBLIC 类型同义词<br />. 导出私有类型同义词<br />. 正在导出用户 EXP 的对象类型定义<br />即将导出 EXP 的对象 ...<br />. 正在导出<a target="_self"><u><strong>数据库</strong></u></a>链接<br />. 正在导出序号<br />. 正在导出群集定义<br />. 即将导出 EXP 的表通过常规路径 ...<br />. . 正在导出表&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 行被导出<br />. 正在导出同义词<br />. 正在导出视图<br />. 正在导出存储的过程<br />. 正在导出运算符<br />. 正在导出引用完整性约束条件<br />. 正在导出触发器<br />. 正在导出索引类型<br />. 正在导出位图, 功能性索引和可扩展索引<br />. 正在导出后期表活动<br />. 正在导出实体化视图<br />. 正在导出快照日志<br />. 正在导出作业队列<br />. 正在导出刷新组和子组<br />. 正在导出维<br />. 正在导出 post-schema 过程对象和操作<br />. 正在导出统计<br />在没有警告的情况下成功终止导出。</p><p><strong>3.linux/unix os导出测试</strong><br />[oracle@rac2 ~]$ exp<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#101;&#120;&#112;&#47;&#49;&#50;&#51;&#52;&#53;&#37;&#50;&#49;&#64;&#35;&#36;&#37;&#64;&#100;&#101;&#118;&#100;&#98;">exp/12345!@#$%@devdb</a>file=./exp.dmp wner=exp<br />-bash:<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#50;&#49;&#64;&#35;&#36;&#37;&#64;&#100;&#101;&#118;&#100;&#98;">!@#$%@devdb</a>: event not found<br />[oracle@rac2 ~]$ exp exp/"""<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#49;&#50;&#51;&#52;&#53;&#37;&#50;&#49;&#64;&#35;&#36;&#37;&#37;&#50;&#50;&#37;&#50;&#50;&#37;&#50;&#50;&#64;&#100;&#101;&#118;&#100;&#98;">12345!@#$%"""@devdb</a>file=./exp.dmp wner=exp<br />-bash:<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#50;&#49;&#64;&#35;&#36;&#37;&#37;&#50;&#50;&#37;&#50;&#50;&#37;&#50;&#50;&#64;&#100;&#101;&#118;&#100;&#98;">!@#$%"""@devdb</a>: event not found<br />[oracle@rac2 ~]$exp 'exp/"<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#49;&#50;&#51;&#52;&#53;&#37;&#50;&#49;&#64;&#35;&#36;&#37;&#37;&#50;&#50;&#64;&#100;&#101;&#118;&#100;&#98;&#37;&#50;&#55;">12345!@#$%"@devdb'</a>file=./exp.dmp wner=exp&nbsp;<br />Export: Release 10.2.0.4.0 - Production on Thu May 7 19:21:32 2009&nbsp;<br />Copyright (c) 1982, 2007, Oracle.&nbsp; All rights reserved.&nbsp;<br />Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production<br />With the Partitioning, Real Application Clusters, OLAP, Data Mining<br />and Real Application Testing options<br />Export done in US7ASCII character set and AL16UTF16 NCHAR character set<br /><a target="_self"><u><strong>server</strong></u></a> uses ZHS16GBK character set (possible charset conversion)<br />. exporting pre-schema procedural objects and actions<br />. exporting foreign function library names for user EXP<br />. exporting PUBLIC type synonyms<br />. exporting private type synonyms<br />. exporting object type definitions for user EXP<br />About to export EXP's objects ...<br />. exporting database links<br />. exporting sequence numbers<br />. exporting cluster definitions<br />. about to export EXP's tables via Conventional Path ...<br />. . exporting table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 rows exported<br />. exporting synonyms<br />. exporting views<br />. exporting stored procedures<br />. exporting operators<br />. exporting referential integrity constraints<br />. exporting triggers<br />. exporting indextypes<br />. exporting bitmap, functional and extensible indexes<br />. exporting posttables actions<br />. exporting materialized views<br />. exporting snapshot logs<br />. exporting job queues<br />. exporting refresh groups and children<br />. exporting dimensions<br />. exporting post-schema procedural objects and actions<br />. exporting statistics<br />Export terminated successfully without warnings.</p></div><img src ="http://www.blogjava.net/redcoatjk/aggbug/361590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcoatjk/" target="_blank">redcoatjk</a> 2011-10-19 17:03 <a href="http://www.blogjava.net/redcoatjk/archive/2011/10/19/361590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转置</title><link>http://www.blogjava.net/redcoatjk/archive/2011/08/25/357294.html</link><dc:creator>redcoatjk</dc:creator><author>redcoatjk</author><pubDate>Thu, 25 Aug 2011 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/redcoatjk/archive/2011/08/25/357294.html</guid><wfw:comment>http://www.blogjava.net/redcoatjk/comments/357294.html</wfw:comment><comments>http://www.blogjava.net/redcoatjk/archive/2011/08/25/357294.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcoatjk/comments/commentRss/357294.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcoatjk/services/trackbacks/357294.html</trackback:ping><description><![CDATA[<div><div id="blog_text"><p>关于group by 的应用问题&nbsp;&nbsp;</p> <p>数据库内容为下面 <br /></p><p><img alt="" src="http://www.blogjava.net/images/blogjava_net/redcoatjk/1.jpg" height="160" width="148" /><br /></p> <div> <p>&nbsp;</p> <p>写一SQL得出下面内容：</p><p><img src="http://www.blogjava.net/images/blogjava_net/redcoatjk/2.jpg" alt="" border="0" height="62" width="170" /><br /></p> </div> <div> <p>&nbsp;</p> <p>贴出SQL结果如下：(MySQL版本)</p> <p>create table gosin_temp(rq varchar(10),shengfu nchar(1));</p> <p>insert into gosin_temp values('2009-05-09','胜');<br /> insert into gosin_temp values('2009-05-09','胜');<br /> insert into gosin_temp values('2009-05-09','负');<br /> insert into gosin_temp values('2009-05-09','负');<br /> insert into gosin_temp values('2009-05-10','胜');<br /> insert into gosin_temp values('2009-05-10','负');<br /> insert into gosin_temp values('2009-05-10','负');</p> <p>select * from gosin_temp;</p> <p>得到结果的SQL：<br /> select a1.rq,a1.胜,b1.负 from <br /> (select a.rq, count(a.shengfu) 胜 from gosin_temp a where a.shengfu='胜' group by a.rq) a1,<br /> (select b.rq, count(b.shengfu) 负 from gosin_temp b where b.shengfu='负' group by b.rq) b1<br /> where a1.rq = b1.rq</p> <p> </p> <p>类似的题目还有很多，如：</p> <p>&nbsp;&nbsp;  胜 负<br /> 1 a b<br /> 2 b a<br /> 3 b a<br /> <br /> 要求写一SQL语句，输出如下结果：<br /> &nbsp;&nbsp;  胜 负<br /> a 1 2<br /> b 2 1</p> <p>其实都一样 只要熟悉使用group by 就不觉得难了。</p> </div></div></div><img src ="http://www.blogjava.net/redcoatjk/aggbug/357294.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcoatjk/" target="_blank">redcoatjk</a> 2011-08-25 17:12 <a href="http://www.blogjava.net/redcoatjk/archive/2011/08/25/357294.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>