??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲日本乱码在线观看,亚洲w码欧洲s码免费,亚洲国产精品婷婷久久http://www.tkk7.com/terry-zj/category/4742.htmlzh-cnTue, 31 Aug 2010 19:43:12 GMTTue, 31 Aug 2010 19:43:12 GMT60Oracle instant客户端配|?/title><link>http://www.tkk7.com/terry-zj/archive/2010/08/30/330216.html</link><dc:creator>Terry的Blog</dc:creator><author>Terry的Blog</author><pubDate>Sun, 29 Aug 2010 17:26:00 GMT</pubDate><guid>http://www.tkk7.com/terry-zj/archive/2010/08/30/330216.html</guid><wfw:comment>http://www.tkk7.com/terry-zj/comments/330216.html</wfw:comment><comments>http://www.tkk7.com/terry-zj/archive/2010/08/30/330216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/terry-zj/comments/commentRss/330216.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/terry-zj/services/trackbacks/330216.html</trackback:ping><description><![CDATA[<strong>Oracle instant客户端下载地址</strong><br /> <font size="4"><a target="_blank">http://www.oracle.com/<wbr>technetwork/topics/winsoft-<wbr>085727.html</a><br /> </font><a class="boldbodylink" id="file36" name="file36" onclick="youMustAgreePrompt();">instantclient-basic-win32-11.2.0.1.0.zip</a><br /> <font size="4"><br /> <strong>解压?/strong></font><strong>在客L根目录创建tnsnames.ora文g</strong><br /> XE1 = <br /> (DESCRIPTION = <br />   (ADDRESS = (PROTOCOL = TCP)(HOST = 16.157.1.1)(PORT = 1521)) <br /> (CONNECT_DATA = <br /> (SERVER = DEDICATED) <br /> (SERVICE_NAME = XE1) <br /> ) <br /> <br /> XE2 = <br /> (DESCRIPTION = <br />   (ADDRESS = (PROTOCOL = TCP)(HOST = 16.157.1.2)(PORT = 1521)) <br /> (CONNECT_DATA = <br /> (SERVER = DEDICATED) <br /> (SID= XE2) <br /> ) <br /> <br /> 配置PL/SQL Developer<br /> <strong>配置PL/SQL的oracle的目录位|?/strong><br /> tool-->preferences--><wbr>connection-->oracle home ?OCI Library 的\?br /> <br /> 在PL/SQL Developer安装目录下徏立一个start.bat脚本文g<br /> 讄环境变量<br /> set path=C:\instantclient_11_2<br /> set ORACLE_HOME=C:\instantclient_<wbr>11_2<br /> set TNS_ADMIN=C:\instantclient_11_<wbr>2<br /> set NLS_LANG=AMERICAN_AMERICA.<wbr>AL32UTF8<br /> start PLSQLDev.exe <br /> <br /> 具体说明NLS_LANG的取?br /> 格式:NLS_LANG=language_territory.charset <br /> <br /> 取值来?select * from v$nls_parameters <br /> 查询nls的参敎ͼ获得数据库服务器端的字符~码 ,需要保证要讄客户端字W集与服务器端字W集一? <br /> NLS_LANGUAGE <br /> NLS_CHARACTERSET <br /> <br /> <font size="4"><br /> </font> <img src ="http://www.tkk7.com/terry-zj/aggbug/330216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/terry-zj/" target="_blank">Terry的Blog</a> 2010-08-30 01:26 <a href="http://www.tkk7.com/terry-zj/archive/2010/08/30/330216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>日文字符中常见的q情况---正L线“~?/title><link>http://www.tkk7.com/terry-zj/archive/2006/04/20/42108.html</link><dc:creator>Terry的Blog</dc:creator><author>Terry的Blog</author><pubDate>Thu, 20 Apr 2006 02:46:00 GMT</pubDate><guid>http://www.tkk7.com/terry-zj/archive/2006/04/20/42108.html</guid><wfw:comment>http://www.tkk7.com/terry-zj/comments/42108.html</wfw:comment><comments>http://www.tkk7.com/terry-zj/archive/2006/04/20/42108.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/terry-zj/comments/commentRss/42108.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/terry-zj/services/trackbacks/42108.html</trackback:ping><description><![CDATA[ <p>在一般的日文字符表示正常的情况下正L线“~”Q然经怼出现q的情c?br /><br />数据库参数NLS Database Parameters<br />NLS_CHARACTERSET                   JA16SJIS <br />NLS_NCHAR_CHARACTERSET   AL16UTF16<br /><br />一Q对于VARCHAR2字段<br />现象Q在面上输入“~”存入DB后再取出到页面时变成??strong>Q页面的字符讄为charset=shift-jisQ?/strong><br />调查Q?br />1 面提交后在java中观察编码ؓ\uff5e<br />2 java中定义一个字W变量“~”观察编码ؓ\uff5e<br />3 ~码为\uff5e的字W存入数据库再取出的~码为\u301c<br />4 用Object Browser观察数据库中字符都正?br />l论Q存入数据库时编码发生了变化\uff5e ---> \u301c<br />解决Q取出数据时遍历发现\u301cp{换ؓ\uff5e<br />      public String getString(int columnIndex) throws SQLException {<br />         // TODO: ~を変更<br />         String value = rs.getString(columnIndex);<br />         if (value != null){<br />              StringBuffer sbDest = new StringBuffer();<br />              char ch;<br />              for(int j= 0;j< value.length();j++){<br />                  ch = value.charAt(j);<br />                  if(ch == 0x301c){<br />                      sbDest.append("\uff5e"); // ?br />                  }else{<br />                      sbDest.append(ch);<br />                  }<br />              }<br />              value = sbDest.toString();<br />         }</p> <p>         return value;<br />     }<br /><br />二:对于NVARCHAR2字段<br />现象Q在面上输入正波浪U쀜~”存入DB后再取出到页面时变成反L线“〜?strong>Q页面的字符讄为charset=UTF-8Q?br /></strong>用Object Browser工具察看表中的数?发现是正波浪U쀜~?~码为\u301c。(实际上用Object Browser看\u301c  \uff5e都是正L线Q?br />如果用NVARCHAR2字段Q那么正的操作后可以存入\uff5e<br /><br />试验用表 Products Q表中的列定义如下所C?br />id - VARCHAR2(10) ?产品 id<br />lang_id ?VARCHAR2(10) ?语言 id<br />description ?NVARCHAR2(2000) ?Unicode ~码的品描q?br /><br />JDBC 允许 Java E序讉K Oracle9i 数据库中?NVARCHAR2 数据cd的列。Oracle JDBC 驱动E序?SQL NCHAR/NVARCHAR2 列中的数据从本地字符集编码(UTF8 ?AL16UTF16Q直接{化ؓ UTF-16 ~码?Java 字符丌Ӏ?br />为此Q我们需要把 Java 字符串绑定到一?NVARCHAR2 列。下面的代码D|CZ完成q项d的代码?/p> <p>// Get an Oracle preparedstatement<br />OraclePreparedStatement orastmt =(OraclePreparedStatement)connection.prepareStatement(<br />"INSERT INTO PRODUCTS VALUES(?,?,?)");<br />// Bind the 3rd parameter to NVARCHAR2 form so that the data is stored as unicode<br /><strong>orastmt.setFormOfUse(3,OraclePreparedStatement.FORM_NCHAR);<br /></strong>orastmt.setString(1,product.getId());<br />orastmt.setString(2,product.getLangId());<br />orastmt.setString(3,product.getDescription());<br />orastmt.executeUpdate();<br />orastmt.close();</p> <p>使用 orastmt.setFormOfUse() Ҏ来指定列的类型是 NVARCHAR2。确保数据以Unicode ~码存储?br /><br />关于NVARCHAR2字段的操作参考:<br /><a >http://www.oracle.com/technology/sample_code/tech/java/sqlj_jdbc/files/9i_jdbc/NCHARsupport4UnicodeSample/Readme.html</a><br /><br />注意q段话:<br />The only difference in usage between the SQL CHAR and SQL NCHAR datatypes occur in a data bind situation. <br />The JDBC program must call the setFormOfUse() method to specify if the data is bound for a SQL NCHAR<br />datatype and <strong>it must be called before binding</strong> Java variables to SQL NCHAR datatypes.<br /><strong>必须先setFormOfUse再绑定变量。否则存入数据库中的仍是\u301c<br /></strong></p> <img src ="http://www.tkk7.com/terry-zj/aggbug/42108.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/terry-zj/" target="_blank">Terry的Blog</a> 2006-04-20 10:46 <a href="http://www.tkk7.com/terry-zj/archive/2006/04/20/42108.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>比较Oracle SQL中的IN & EXISTShttp://www.tkk7.com/terry-zj/archive/2006/04/18/41662.htmlTerry的BlogTerry的BlogTue, 18 Apr 2006 08:01:00 GMThttp://www.tkk7.com/terry-zj/archive/2006/04/18/41662.htmlhttp://www.tkk7.com/terry-zj/comments/41662.htmlhttp://www.tkk7.com/terry-zj/archive/2006/04/18/41662.html#Feedback4http://www.tkk7.com/terry-zj/comments/commentRss/41662.htmlhttp://www.tkk7.com/terry-zj/services/trackbacks/41662.html在Oracle SQL中取数据时有时要用到in ?exists 那么他们有什么区别呢Q?br />
1 性能上的比较
比如Select * from T1 where x in ( select y from T2 )
执行的过E相当于:
select *
  from t1, ( select distinct y from t2 ) t2
 where t1.x = t2.y;

相对?/p>

select * from t1 where exists ( select null from t2 where y = x )
执行的过E相当于:
for x in ( select * from t1 )
   loop
      if ( exists ( select null from t2 where y = x.x )
      then
         OUTPUT THE RECORD
      end if
end loop
表 T1 不可避免的要被完全扫描一?/p>

分别适用在什么情?
以子查询 ( select y from T2 )虑方向
如果子查询的l果集很大需要消耗很多时_但是T1比较执? select null from t2 where y = x.x )非常快,那么exists比较适合用在q里
相对应得子查询的l果集比较小的时候就应该使用in.

2 含义上的比较
在标准的scott/tiger用户?br />

    EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
1 7499 ALLEN SALESMAN 7698 1981/02/20 1600.00 300.00 30
2 7521 WARD SALESMAN 7698 1981/02/22 1250.00 500.00 30
3 7566 JONES MANAGER 7839 1981/04/02 2975.00 20
4 7654 MARTIN SALESMAN 7698 1981/09/28 1250.00 1400.00 30
5 7698 BLAKE MANAGER 7839 1981/05/01 2850.00 30
6 7782 CLARK MANAGER 7839 1981/06/09 2450.00 10
7 7788 SCOTT ANALYST 7566 1987/04/19 3000.00 20
8 7839 KING PRESIDENT   1981/11/17 5000.00 10
9 7844 TURNER SALESMAN 7698 1981/09/08 1500.00 0.00 30
10 7876 ADAMS CLERK 7788 1987/05/23 1100.00 20
11 7900 JAMES CLERK 7698 1981/12/03 950.00 30
12 7902 FORD ANALYST 7566 1981/12/03 3000.00 20
13 7934 MILLER CLERK 7782 1982/01/23 1300.00   10

执行
SQL> select count(*) from emp where empno not in ( select mgr from emp );
COUNT(*)
----------
         0
SQL> select count(*) from emp T1
  2  where not exists ( select null from emp T2 where t2.mgr = t1.empno ); -- q里子查询中取出nullq没有什么特D作用,只是表示取什么都一栗?br />COUNT(*)
----------
         8
l果明显不同Q问题就出在MGR=null的那条数据上。Q何值X not in (null)  l果都不成立?br />用一个小例子试验一?
select * from dual where dummy not in ( NULL ) -- no rows selected
select * from dual where NOT( dummy not in ( NULL ) ) --no rows selected
知觉上这两句SQLL一句会取出数据的,但是实际上都没有。SQL中逻辑表达式的值可以有三种l果Qtrue false nullQ而null相当于false.




Terry的Blog 2006-04-18 16:01 发表评论
]]>
SQL优化是重?转蝲)http://www.tkk7.com/terry-zj/archive/2006/03/30/38291.htmlTerry的BlogTerry的BlogThu, 30 Mar 2006 09:32:00 GMThttp://www.tkk7.com/terry-zj/archive/2006/03/30/38291.htmlhttp://www.tkk7.com/terry-zj/comments/38291.htmlhttp://www.tkk7.com/terry-zj/archive/2006/03/30/38291.html#Feedback0http://www.tkk7.com/terry-zj/comments/commentRss/38291.htmlhttp://www.tkk7.com/terry-zj/services/trackbacks/38291.html信息pȝ讉K量又不大Q瓶颈一般不会出现在应用层,极有可能在数据库q一层,不用急着看程序。先扑և逻辑dơ数最多的SQLQ硬盘读取次数最多的SQLQ找到SQLQ对于SQLq行优化。看看有没有发生全表扫描的地斏V?
一般发生全表扫描,极有可能是没有徏立合理的索引Q或者烦引由于左边引用函数或其它原因造成索引失效?
对于q行一q多的系l,最好要自己写一个自动重建烦引的E序Q定旉建烦引?
或者用TOAD工具帮你重徏索引?

另外在看一下数据库的CPU占用率,如果占用率在l常?0%Q?00%Q那一定要是SQL或存储过E及trigger中写的不好?

不需要从应用层找SQLQ方向性错误,太篏Q也看不出效果?
而应当用pl/SQL, toad{工P分析出最bad的SQL语句Q一看到q些语句后,再修改应用层的查询就是了。又快又方便?

 

-- 逻辑d的SQL
select * from (select buffer_gets, sql_text
from v$sqlarea
where buffer_gets > 500000
order by buffer_gets desc) where rownum<=30;

-- 执行ơ数多的SQL
select sql_text,executions from
(select sql_text,executions from v$sqlarea order by executions desc)
where rownum<81;

-- ȝ盘多的SQL
select sql_text,disk_reads from
(select sql_text,disk_reads from v$sqlarea order by disk_reads desc)
where rownum<21;

-- 排序多的SQL
select sql_text,sorts from
(select sql_text,sorts from v$sqlarea order by sorts desc)
where rownum<21;

--分析的次数太多,执行的次数太,要用l变量的Ҏ来写sql
set pagesize 600;
set linesize 120;
select substr(sql_text,1,80) "sql", count(*), sum(executions) "totexecs"
from v$sqlarea
where executions < 5
group by substr(sql_text,1,80)
having count(*) > 30
order by 2;

转蝲地址 http://forum.javaeye.com/viewtopic.php?t=19464



Terry的Blog 2006-03-30 17:32 发表评论
]]>
PL/SQL支持嵌套事务http://www.tkk7.com/terry-zj/archive/2006/01/27/29303.htmlTerry的BlogTerry的BlogFri, 27 Jan 2006 08:20:00 GMThttp://www.tkk7.com/terry-zj/archive/2006/01/27/29303.htmlhttp://www.tkk7.com/terry-zj/comments/29303.htmlhttp://www.tkk7.com/terry-zj/archive/2006/01/27/29303.html#Feedback0http://www.tkk7.com/terry-zj/comments/commentRss/29303.htmlhttp://www.tkk7.com/terry-zj/services/trackbacks/29303.html使用场景:
当一个PL/SQLE序执行出错 需要输出log信息到数据库表中的时?׃遇到q个N.
log的内容要提交到表?但是前面出错的内容却不能提交.虽然我们可以在出错时先Rollback {log好了
再commit.但是q样毕竟比较ȝ.实际上PL/SQL本n支持嵌套事务.
看下面的例?
CREATE OR REPLACE procedure Test1
as
PRAGMA AUTONOMOUS_TRANSACTION; -- 关键是q句
begin
--set transaction read write;
insert into aaa values(1,4,7);
commit;
end;
/

CREATE OR REPLACE procedure Test2
as
begin
--set transaction read write;
insert into aaa values(2,5,8);
Test1;
insert into aaa values(3,6,9);
rollback;
end;
/
当execute Test2完了时在AAA表中插入了一行(1Q?Q?Q?BR>
--------------------------------------------------------------------------------------------------------------------------
理论知识:
AUTONOMOUS TRANSACTION(自治事务)的介l?

在基于低版本的ORACLE做一些项目的q程?有时会遇C些头疼的问题.,比如惛_执行当前一个由多个DMLl成的transaction(事务)?为每一步DML记录一些信息到跟踪表中,׃事务的原子?q些跟踪信息的提交将军_于主事务的commit或rollback. q样一来写E序的难度就增大? E序员不得不把这些跟t信息记录到cM数组的结构中,然后在主事务l束后把它们存入跟踪??真是ȝ!

有没有一个简单的Ҏ解决cM问题呢?

ORACLE8i的AUTONOMOUS TRANSACTION(自治事务Q以下AT)是一个很好的回答?/P>

AT 是由M?以下MT)调用但是独立于它的事务。在AT被调用执行时QMT被挂P在AT内部Q一pd的DML可以被执行ƈ且commit或rollback.

注意׃AT的独立性,它的commit和rollbackq不影响MT的执行效果。在AT执行l束后,M务获得控制权Q又可以l箋执行了?/P>

如何实现AT的定义呢Q我们来看一下它的语法。其实非常简单?/P>

只需下列PL/SQL的声明部分加上PRAGMA AUTONOMOUS_TRANSACTION 可以了?/P>

1Q?nbsp; 的匿名PL/SQL?/P>

2Q?nbsp; Functions ?ProcedureQ独立声明或声明在package中都可)

3Q?nbsp; SQL Object Type的方?/P>

4Q?nbsp; 触发器?/P>

  比如Q?/P>

 在一个独立的procedure中声明AT

CREATE OR REPLACE PROCEDURE

   Log_error(error_msg IN VARCHAR2(100))

IS

   PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN

   Insert into Error_log values ( sysdate,error_msg);

   COMMIT;

END;

下面我们来看一个例子,Qwin2000 advanced server + oracle8.1.6 , connect as scottQ?/P>

建立一个表:

create table msg (msg varchar2(120));

首先,用普通的事务写个匿名PL/SQL块:

 declare

   cnt  number := -1;   --} Global variables

   procedure local is

   begin

      select count(*) into cnt from msg;

      dbms_output.put_line('local: # of rows is '||cnt);

      insert into msg values ('New Record');

      commit;

   end;

 

   begin

      delete from msg ;

      commit;

      insert into msg values ('Row 1');

      local;

      select count(*) into cnt from msg;

      dbms_output.put_line('main: # of rows is '||cnt);

      rollback;

      local;

      insert into msg values ('Row 2');

      commit;

      local;

      select count(*) into cnt from msg;

      dbms_output.put_line('main: # of rows is '||cnt);

   end;

q行l果(注意打开serveroutput)

local: # of rows is 1   -> 子程序local中可以’看到’主匿名块中的uncommitted记录

main: # of rows is 2    -> d名块可以’看到?条记?它们都是被local commit掉的)

local: # of rows is 2   -> 子程序local首先’看到?条记?然后又commit了第三条记录

local: # of rows is 4   -> 子程序local又’看到’了新增加的记录(它们都是被local commit掉的),然后又commit了第五条记录

main: # of rows is 5    -> d名块最后’看到’了所有的记录.

从这个例子中,我们看到COMMIT和ROLLBACK的位|无论是在主匿名块中或者在子程序中,都会影响到整个当前事?

现在用AT改写一下匿名块中的procedure local:

...

   procedure local is

      pragma AUTONOMOUS_TRANSACTION;

   begin

...

重新q行(注意打开serveroutput)

local: # of rows is 0   -> 子程序local中无法可以’看到’主匿名块中的uncommitted记录 (因ؓ它是独立?

main: # of rows is 2    -> d名块可以’看到?条记?但只有一条是被commited.

local: # of rows is 1   -> 子程序local中可以’看到’它前一ơcommit的记?但是d名块中的记录已经被提前rollback?/P>

local: # of rows is 3   -> 子程序local 中可以’看到?条记录包括主匿名块commit的记?/P>

main: # of rows is 4    ->d名块最后’看到’了所有的记录.

很明?AT是独立的,在它执行?MT被暂停了. AT的COMMIT,ROLLBACKq不影响MT的执?

q用AT?有一些注意事?单列丑֦?

1.     在匿名PL/SQL块中,只有的匿名PL/SQL块可以被设ؓAT

2.     如果AT试图讉K被MT控制的资?可能有deadlock发生.

3.     Package 不能被声明ؓAT,只有package所拥有的function和procedure 才能声明为AT

4.     ATE序必须以commit 或rollbackl尾,否则会生Oracle错误ORA-06519: active autonomous transaction detected and rolled back

在程序开发时,如果充分q用AUTONOMOUS TRANSACTION的特?一定能取得事倍功半的效果.



Terry的Blog 2006-01-27 16:20 发表评论
]]>
SQL and PL/SQLhttp://www.tkk7.com/terry-zj/archive/2005/12/06/22794.htmlTerry的BlogTerry的BlogTue, 06 Dec 2005 14:29:00 GMThttp://www.tkk7.com/terry-zj/archive/2005/12/06/22794.htmlhttp://www.tkk7.com/terry-zj/comments/22794.htmlhttp://www.tkk7.com/terry-zj/archive/2005/12/06/22794.html#Feedback0http://www.tkk7.com/terry-zj/comments/commentRss/22794.htmlhttp://www.tkk7.com/terry-zj/services/trackbacks/22794.htmlSQL and PL/SQL
 
Oracle 的内|函数提供了全角和半角字W{换的功能:
SELECT TO_SINGLE_BYTE('Q2QabcQYQ?) FROM dual -- 123abcXYZ
SELECT TO_MULTI_BYTE('123abcXYZ') FROM dual -- Q2QabcQYQ?/FONT>

一些PL/SQL的小Ҏ?

DECLARE
    -- Local variables here
    i   INTEGER;
    idx VARCHAR2(2000);
   
    TYPE word_list IS TABLE OF idx%TYPE INDEX BY idx%TYPE;
    the_list word_list;

    wChar VARCHAR2(2000);

    wTmp varchar2(2000);
    num1 NUMBER(12);
   
    chr1 CHAR(5);
   
    FUNCTION tstChar(inputChr IN CHAR) RETURN NUMBER IS
    BEGIN
        dbms_output.put_line('|' || inputChr || '|');
        RETURN 1;
    END;
BEGIN
    -------------------------------------------------------------
    --               Max Min value
    -------------------------------------------------------------
    num1 := greatest(100,200,300,210,120,99);
    dbms_output.put_line(num1); -- 300
   
    wTmp := greatest('abc','bcd','cde','xxx','zzz','yyy');
    dbms_output.put_line(wTmp); -- zzz
   
    wTmp := least('abc','bcd','cde','xxx','zzz','yyy');
    dbms_output.put_line(wTmp); -- abc
   
    -------------------------------------------------------------
    --               substr
    -------------------------------------------------------------   
    wTmp := 'abcdefg';
    wTmp := substr(wTmp,-3,2);
    dbms_output.put_line(wTmp); -- ef
   
    -------------------------------------------------------------
    --               lpad
    -------------------------------------------------------------   
    wTmp := lpad(wTmp,10,'?');
    dbms_output.put_line(wTmp); -- ????????ef

    wTmp := NULL;
    wTmp := lpad(wTmp,10,'?');
    dbms_output.put_line(wTmp); -- null

    -------------------------------------------------------------
    --               length of char
    -------------------------------------------------------------   
    chr1 := 'aaa';
    num1 := tstChar(chr1);
    
    -------------------------------------------------------------
    --               table indexed by varchar2
    -------------------------------------------------------------   
    dbms_output.put_line('------ test 1 collection index by varchar2------');
    the_list('key1') := 'value1';
    the_list('key2') := 'value2';
    the_list('key3') := 'value3';
    the_list('key0') := NULL;

    idx := the_list.FIRST();

    WHILE idx IS NOT NULL LOOP
        Dbms_Output.Put_line(idx || '   ' || the_list(idx));
        idx := the_list.NEXT(idx);
    END LOOP;

    IF the_list.EXISTS('aaa') THEN
        Dbms_Output.Put_line('aaa');
    ELSE
        Dbms_Output.Put_line('no aaa');
    END IF;

    Dbms_Output.Put_line(the_list.COUNT);
    the_list.delete('key1');
    Dbms_Output.Put_line(the_list.COUNT);

    -------------------------------------------------------------
    --               handle null
    -------------------------------------------------------------   
    dbms_output.put_line('------ test 2  handle null------');
    idx := NULL;
    idx := CASE WHEN idx IS NULL THEN 'is null' WHEN idx IS NOT NULL THEN 'is not null' ELSE 'else' END;
    Dbms_Output.Put_line(idx);

    idx := NULL;
    SELECT decode(idx, NULL, 'is null', 'is not null', 'else')
      INTO idx
      FROM dual;
    Dbms_Output.Put_line(idx);

    idx := NULL;
    idx := REPLACE('old_string_1', NULL, 'replace null');
    Dbms_Output.Put_line(idx);

    idx := REPLACE('old_string_2', '_', NULL);
    Dbms_Output.Put_line(idx);

    idx := 'apple' || NULL || NULL || 'sauce';
    Dbms_Output.Put_line(idx);

    -------------------------------------------------------------
    --               动态sql
    -------------------------------------------------------------   
    wChar := 'select to_char(sysdate,''yyyy/mm/dd'') from dual ';
   
    execute immediate wChar into idx;
    Dbms_Output.Put_line('test execute immediate = ' || idx);
   

    -------------------------------------------------------------
    --               隐式光标
    -------------------------------------------------------------   

--    for rec in (select *  from mststrc21) loop
--        Dbms_Output.Put_line('rec = ' || rec.pantpatternno);
--    end loop;
   
    -------------------------------------------------------------
    --               trim()
    -------------------------------------------------------------   
    --Trim(Leading|Trailing|Both trim_character from trim_source)
    idx := TRIM(' abc ');
    Dbms_Output.Put_line('|' || idx || '|');
   
    idx := TRIM(' abc '); -- full space
    Dbms_Output.Put_line('|' || idx || '|');
   
    idx := TRIM(leading ' ' FROM ' abc '); -- full space
    Dbms_Output.Put_line('|' || idx || '|');
   
    idx := TRIM(leading 'ab' FROM 'abc');
    Dbms_Output.Put_line('|' || idx || '|'); -- ORA-30001: 切捨てセットの文字は1つにする必要がありま?BR>   
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        Dbms_Output.Put_line('NO_DATA_FOUND');   
        Dbms_Output.Put_line(SQLCODE);   
        Dbms_Output.Put_line(SQLERRM);
    WHEN TOO_MANY_ROWS THEN
        Dbms_Output.Put_line('TOO_MANY_ROWS');   
        Dbms_Output.Put_line(SQLCODE);   
        Dbms_Output.Put_line(SQLERRM);
    WHEN OTHERS THEN
        Dbms_Output.Put_line('OTHERS');   
        Dbms_Output.Put_line(SQLCODE);   
        Dbms_Output.Put_line(SQLERRM);   
END;



Terry的Blog 2005-12-06 22:29 发表评论
]]>
提交一个查询有必要用事务吗?(转蝲) http://www.tkk7.com/terry-zj/archive/2005/12/06/22792.htmlTerry的BlogTerry的BlogTue, 06 Dec 2005 14:25:00 GMThttp://www.tkk7.com/terry-zj/archive/2005/12/06/22792.htmlhttp://www.tkk7.com/terry-zj/comments/22792.htmlhttp://www.tkk7.com/terry-zj/archive/2005/12/06/22792.html#Feedback0http://www.tkk7.com/terry-zj/comments/commentRss/22792.htmlhttp://www.tkk7.com/terry-zj/services/trackbacks/22792.html如果只提交一个查询,有必要用事务吗?q个问题之前已经讨论q?

http://forum.javaeye.com/viewtopic.php?t=1603

但是q没有得出明的l论。先让我们看看事务的定义Q?

引用:

Transactions are described in terms of ACID properties, which are as follows:
n Atomic: all changes to the database made in a transaction are rolled back if any
change fails.
n Consistent: the effects of a transaction take the database from one consistent
state to another consistent state.
n Isolated: the intermediate steps in a transaction are not visible to other users of
the database.
n Durable: when a transaction is completed (committed or rolled back), its effects
persist in the database.
 


即ACID的定义,从上面看来,g除了isolated之外Q和只读查询都没有关pR那么是否只L询不需要事务呢Q?

再看看Oracle对于只读事务的定义:

引用:
Read-Only Transactions
By default, Oracle guarantees statement-level read consistency. The set of data returned by a single query is consistent with respect to a single point in time. However, in some situations, you might also require transaction-level read consistency. This is the ability to run multiple queries within a single transaction, all of which are read-consistent with respect to the same point in time, so that queries in this transaction do not see the effects of intervening committed transactions.

If you want to run a number of queries against multiple tables and if you are not doing any updating, you prefer a read-only transaction. After indicating that your transaction is read-only, you can run as many queries as you like against any table, knowing that the results of each query are consistent with respect to the same point in time.


Oracle默认情况下保证了SQL语句U别的读一致性,卛_该条SQL语句执行期间Q它只会看到执行前点的数据状态,而不会看到执行期间数据被其他SQL改变的状态?

而Oracle的只L?read-only transaction)则保证了事务U别的读一致性,卛_该事务范围内执行的多条SQL都只会看到执行前点的数据状态,而不会看C务期间的M被其他SQL改变的状态?

因此我们可以得出l论Q?

如果你一ơ执行单条查询语句,则没有必要启用事务支持,数据库默认支持SQL执行期间的读一致性;
如果你一ơ执行多条查询语句,例如l计查询Q报表查询,在这U场景下Q多条查询SQL必须保证整体的读一致性,否则Q在前条SQL查询之后Q后条SQL查询之前Q数据被其他用户改变Q则该次整体的统计查询将会出现读数据不一致的状态,此时Q应该启用事务支持?


只读事务与读写事务区?

对于只读查询Q可以指定事务类型ؓreadonlyQ即只读事务。由于只M务不存在数据的修改,因此数据库将会ؓ只读事务提供一些优化手D,例如Oracle对于只读事务Q不启动回滚D,不记录回滚log?

在JDBC中,指定只读事务的办法ؓQ?
connection.setReadOnly(true);

在Hibernate中,指定只读事务的办法ؓQ?
session.setFlushMode(FlushMode.NEVER);
此时QHibernate也会为只M务提供Session斚w的一些优化手D?

在Spring的Hibernate装中,指定只读事务的办法ؓQ?
bean配置文g中,prop属性增加“readOnly?/FONT>

 

我在MySQL4.1试验了一下,q程和结果如下:

数据库:MySQL4.1
表类型:InnoDB
SpringQ?.1.2
HibernateQ?.1.7

使用Spring的声明式事务理

试验q程如下Q?

不设|查询方法的事务cd(即不需要事?Q访问查询页面,后台执行Spring的BeanҎQ让Hibernate发送select语句Q然后手工在MySQL里面修改该记录某字段|再访问查询页面,发现被修改过的字D值ƈ没有变化QHibernate输出的log昄Q数据库q是把老的字段D回,而没有返回新的字D倹{?

讄查询Ҏ的事务类?只读事务)Q访问查询页面,后台执行Spring的BeanҎQ让Hibernate发送select语句Q然后手工在MySQL里面修改该记录某字段|再访问查询页面,发现被修改过的字D值已l变化,Hibernate输出的log昄Q数据库q回新的字段倹{?

q个试验说明Q至在MySQL4.1的InnoDB情况下,不用只M务的查询无法读取到数据更新|必须使用只读事务来保证读记录的数据一致性。这个结果非o我诧异,和我预期完全两样?

我将在Oracleq_上试试看会有什么样的结果?

BTW: 如果MySQL的表cd改ؓMyISAMQ那么即使不讄事务Q也不会出现L据不一致的现象?/FONT>


oracle有两U方法保证在事务U读数据一致?Transaction-Level Read Consistency)

一是用SET TRANSACTION ISOLATION LEVEL SERIALIZABLE ,
当执行这条命令后L据时会生一些重复copy, 你也可以做数据修? 但在大量数据修改的情况下Ҏ造成deadlock或异? 用commit或rollback把ISOLATION LEVEL讑֛为缺省模式read committed,


二是用SET TRANSCATION READ ONLY
当执行这条命令时数据库会生成一个快照的latch, q个latch会耗费一些resource, 如果你想q行数据修改会导致异? 用commit或rollback会把latch释放? 也将把ISOLATION LEVEL讑֛为缺省模式read committed,



Terry的Blog 2005-12-06 22:25 发表评论
]]>
Oracle9i的全文检索技?/title><link>http://www.tkk7.com/terry-zj/archive/2005/12/06/22790.html</link><dc:creator>Terry的Blog</dc:creator><author>Terry的Blog</author><pubDate>Tue, 06 Dec 2005 14:13:00 GMT</pubDate><guid>http://www.tkk7.com/terry-zj/archive/2005/12/06/22790.html</guid><wfw:comment>http://www.tkk7.com/terry-zj/comments/22790.html</wfw:comment><comments>http://www.tkk7.com/terry-zj/archive/2005/12/06/22790.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/terry-zj/comments/commentRss/22790.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/terry-zj/services/trackbacks/22790.html</trackback:ping><description><![CDATA[<SPAN id=BlogViewId><TR><TD class=ellipse><span id="eweyesc" class=bvTitle id=subjcns!1pnXmtZJZoGE64AUuta1hh1Q!154><FONT size=2>Oracle9i的全文检索技?BR></FONT></SPAN><FONT size=2>参?<BR></FONT><A ><FONT size=2>Oracle book</FONT></A><BR><A ><FONT size=2>http://searchdatabase.techtarget.com.cn/searchdatabase/504969453998440448/20050104/1896262.shtml</FONT></A><BR><A ><FONT size=2>http://www.e800.com.cn/articles/36/1091788059721_2.html</FONT></A><BR><A ><FONT size=2>http://www.oracle.com/global/cn/oramag/oracle/04-sep/o54text.html</FONT></A> <P><FONT size=2>------ Test Oracle text<BR>CREATE TABLE hdocs (<BR>ID NUMBER PRIMARY KEY,<BR>fmt VARCHAR2(10),<BR>text VARCHAR2(80)<BR>);</FONT></P> <P><FONT size=2>CREATE INDEX hdocsx ON hdocs(text) INDEXTYPE IS ctxsys.CONTEXT<BR>PARAMETERS ('datastore ctxsys.file_datastore<BR> filter ctxsys.inso_filter<BR> format column fmt<BR>');</FONT></P> <P><FONT size=2>--  charset column cset // can set charset</FONT></P> <P><FONT size=2>INSERT INTO hdocs VALUES(1, 'binary', 'D:\OracleText\Oracle.pdf');<BR>INSERT INTO hdocs VALUES(2, 'text', 'D:\OracleText\1.txt');<BR>INSERT INTO hdocs VALUES(3, 'binary', 'D:\OracleText\mydoc.doc');<BR>COMMIT; </FONT></P> <P><FONT size=2>select t.*, score(1) from hdocs t WHERE contains(text,'索引ѝプの構文', 1) > 0</FONT></P> <P><FONT size=2>-- 索引の同期化<BR>BEGIN<BR>  ctx_ddl.sync_index('hdocsx', '2M');<BR>END;<BR>/</FONT></P> <P><FONT size=2>-- sync<BR>SET SERVEROUTPUT ON<BR>DECLARE<BR>  job NUMBER;<BR>BEGIN<BR>  DBMS_JOB.SUBMIT(job, 'ctx_ddl.sync_index(''hdocsx'');', SYSDATE, 'SYSDATE + (3/1440)');<BR>  DBMS_OUTPUT.PUT_LINE('job '||job||' has been submitted.');<BR>END;<BR>/</FONT></P> <P><FONT size=2>-- optimizer <BR>DECLARE <BR>  VARIABLE jobno NUMBER;  <BR>BEGIN  <BR>  DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.optimize_index(''hdocsx'',''FULL'');', SYSDATE, 'SYSDATE + 1');  <BR>  <BR>  COMMIT;  <BR>END;<BR>/<BR><BR></FONT><FONT size=2>create or replace procedure syncidx<BR>is<BR>begin<BR>execute immediate<BR>'alter index hdocsx rebuild online' ||<BR>' parameters ( ''sync'' )' ;<BR>execute immediate<BR>'alter index hdocsx rebuild online' ||<BR>' parameters ( ''optimize full maxtime unlimited'' )' ;<BR>end syncidx;<BR>/<BR><BR></FONT><FONT size=2>SET SERVEROUTPUT ON<BR>DECLARE<BR>  job NUMBER;<BR>BEGIN<BR>  DBMS_JOB.SUBMIT(job, 'syncidx;', SYSDATE, 'SYSDATE + (3/1440)');<BR>  DBMS_JOB.RUN(job);<BR>  DBMS_OUTPUT.PUT_LINE('job '||job||' has been submitted.');<BR>END;<BR>/</FONT></P></TD></TR></SPAN><img src ="http://www.tkk7.com/terry-zj/aggbug/22790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/terry-zj/" target="_blank">Terry的Blog</a> 2005-12-06 22:13 <a href="http://www.tkk7.com/terry-zj/archive/2005/12/06/22790.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle特?/title><link>http://www.tkk7.com/terry-zj/archive/2005/12/06/22788.html</link><dc:creator>Terry的Blog</dc:creator><author>Terry的Blog</author><pubDate>Tue, 06 Dec 2005 14:08:00 GMT</pubDate><guid>http://www.tkk7.com/terry-zj/archive/2005/12/06/22788.html</guid><wfw:comment>http://www.tkk7.com/terry-zj/comments/22788.html</wfw:comment><comments>http://www.tkk7.com/terry-zj/archive/2005/12/06/22788.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/terry-zj/comments/commentRss/22788.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/terry-zj/services/trackbacks/22788.html</trackback:ping><description><![CDATA[<SPAN id=BlogViewId><TR><TD class=ellipse><span id="cuwiocm" class=bvTitle id=subjcns!1pnXmtZJZoGE64AUuta1hh1Q!152><FONT size=2>Oracle特?/FONT></SPAN></TD></TR><TR><TD class=bvh8></TD></TR><TR><TD id=msgcns!1pnXmtZJZoGE64AUuta1hh1Q!152> <P><FONT size=2>Ҏ?: PL/SQL?select into 一个变量和直接l这个个变量赋值效果不?<BR>DECLARE<BR>    vTmp VARCHAR2(1000);<BR>BEGIN<BR>    SELECT to_char(sysdate,'EE','NLS_CALENDAR=''Japanese Imperial''') -- q号<BR>      INTO vTmp<BR>      FROM dual; <BR>END;</FONT></P> <P><FONT size=2>l果: PL/SQL procedure successfully completed</FONT></P> <P><FONT size=2>DECLARE<BR>  vTmp VARCHAR2(1000);<BR>BEGIN<BR>  vTmp := to_char(sysdate,'EE','NLS_CALENDAR=''Japanese Imperial''');  -- vTmp := 'qx'<BR>END;</FONT></P> <P><FONT size=2>l果: ORA-06502: PL/SQL: 数値または値のエラヹ{発生しました<BR>ORA-06512: ?</FONT></P> <P><FONT size=2>Ҏ?:用一个record变量直接修改表的记录.record中字D和表的字段的对应关p?<BR>create table EMP<BR>(<BR>  EMPNO    NUMBER(4) not null,<BR>  ENAME    VARCHAR2(10),<BR>  JOB      VARCHAR2(9),<BR>  MGR      NUMBER(4),<BR>  HIREDATE DATE,<BR>  SAL      NUMBER(7,2),<BR>  COMM     NUMBER(7,2),<BR>  DEPTNO   NUMBER(2)<BR>)</FONT></P> <P><FONT size=2>create table EMP_2<BR>(<BR>  EMPNO    NUMBER(4) not null,<BR>  JOB      VARCHAR2(9),<BR>  ENAME    VARCHAR2(10),<BR>  MGR      NUMBER(4),<BR>  HIREDATE DATE,<BR>  COMM     NUMBER(7,2),<BR>  SAL      NUMBER(7,2),<BR>  DEPTNO   NUMBER(2)<BR>)</FONT></P> <P><FONT size=2>DECLARE<BR>    rec EMP_2%ROWTYPE;<BR>BEGIN <BR>    SELECT * <BR>      INTO rec<BR>      FROM emp<BR>     WHERE empno = 9999 ; <BR>    <BR>    INSERT INTO EMP_2 VALUES rec;<BR>END;</FONT></P> <P><FONT size=2>EMP<BR>    EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO<BR>1 9999 terry1 CLERK 7782 1982/01/23 1300.00  10</FONT></P> <P><FONT size=2>EMP_2<BR>    EMPNO JOB ENAME MGR HIREDATE COMM SAL DEPTNO<BR>1 9999 terry1 CLERK 7782 1982/01/23 1300.00  10</FONT></P> <P><FONT size=2>Ҏ?:取日本年?/FONT></P> <P><FONT size=2>SELECT to_char(SYSDATE, 'EEYY MONTH DAY  MM/DD HH24:MI:SS', 'NLS_CALENDAR=''Japanese Imperial''') FROM dual<BR>>>><BR>qx17 4?nbsp; 火曜?nbsp; 04/19 17:34:15</FONT></P></TD></TR></SPAN><img src ="http://www.tkk7.com/terry-zj/aggbug/22788.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/terry-zj/" target="_blank">Terry的Blog</a> 2005-12-06 22:08 <a href="http://www.tkk7.com/terry-zj/archive/2005/12/06/22788.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle SQL依然无可替代--《Mastering Oracle SQL?转蝲)http://www.tkk7.com/terry-zj/archive/2005/12/06/22786.htmlTerry的BlogTerry的BlogTue, 06 Dec 2005 14:04:00 GMThttp://www.tkk7.com/terry-zj/archive/2005/12/06/22786.htmlhttp://www.tkk7.com/terry-zj/comments/22786.htmlhttp://www.tkk7.com/terry-zj/archive/2005/12/06/22786.html#Feedback0http://www.tkk7.com/terry-zj/comments/commentRss/22786.htmlhttp://www.tkk7.com/terry-zj/services/trackbacks/22786.html转蝲 Oracle SQL依然无可替代--《Mastering Oracle SQL?/FONT>

选择?calvinxiu ?Blog  http://dev.csdn.net/user/calvinxiu

天寒地冻Q呆在家里又d了《Mastering Oracle SQL?ndQ发现Oracle的功能还是很强悍Q光函数有两百个,HSQL是很难比拟的。接下来的硬骨头Q看来要么冒险用Hibernate3.0 的SQL Mapping功能Q要么就自己跑JDBCl装VO了?

       1.报表合计专用的Rollup函数
         销售报?BR>  q州     1?nbsp;     2000?BR>  q州     2?nbsp;     2500?BR>  q州                 4500?BR>  深圳     1?nbsp;     1000?BR>  深圳     2?nbsp;     2000?BR>  深圳                 3000?BR>  所有地?nbsp;        7500?BR>

以往的查询SQL:
Select  area,month,sum(money) from SaleOrder group by area,month
然后q州Q深圳的合计和所有地区合计都需要在E序里自行篏?/FONT>

1.其实可以使用如下SQL:   Select area,month,sum(total_sale) from SaleOrder group by rollup(area,month)p产生和报表一模一LU录
 
2.如果year不想累加Q可以写?nbsp;  Select year,month,area,sum(total_sale) from SaleOrder group by year, rollup(month,area)   另外Oracle 9iq支持如下语?   Select year,month,area,sum(total_sale) from SaleOrder group by rollup((year,month),area)
 
3.如果使用Cube(area,month)而不是RollUp(area,month)Q除了获得每个地区的合计之外Q还获得每个月份的合计Q在报表最后显C?/FONT>
 
4.Grouping让合计列更好?BR>  RollUp在显C广州合计时Q月份列为NULLQ但更好的做法应该是昄?所有月?
  Grouping是用来判断当前Column是否是一个合计列Q?为yesQ然后用Decode把它转ؓ"所有月?  Select  Decode(Grouping(area),1,'所有地?,area) area,
          Decode(Grouping(month),1,'所有月?,month),
          sum(money)
  From SaleOrder 
  Group by RollUp(area,month);
 
2.对多U层ơ查询的start with.....connect by
   比如人员l织,产品cd,Oracle提供了很l典的方?/FONT>
SELECT LEVEL, name, emp_id,manager_emp_id
FROM employee
START WITH manager_emp_id is null
CONNECT BY PRIOR emp_id = manager_emp_id;
上面的语句demo了全部的应用,start with指明从哪里开始遍历树,如果从根开?那么它的manager应该是Null,如果从某个职员开?可以写成emp_id='11'
CONNECT BY 是指明父子关系,注意PRIOR位置
另外q有一个LEVEL?昄节点的层?/FONT>
 
3.更多报表/分析决策功能
3.1 分析功能的基本结?BR>     分析功能() over( partion子句,order by子句,H口子句)
     概念上很难讲清楚,q是用例子说话比较好.       
 
3.2 Row_Number ?Rank, DENSE_Rank
    用于选出Top 3 salesq样的报?BR>    当两个业务员可能有相同业l时,p使用Rank和Dense_Rank
    比如
              金额    RowNum  Rank  Dense_Rank
    张三 4000?nbsp;   1             1        1
    李四 3000?nbsp;   2             2        2
    ׃ 2000?nbsp;   3             3        3
    孙六 2000?nbsp;   4             3        3
    丁七 1000?nbsp;   5             5        4
    q时,应该把ƈ列第三的׃和孙六都选进?所以用Ranking功能比RowNumber保险.至于Desnseq是Rankingq具体情况了?/FONT>
    SELECT salesperson_id, SUM(tot_sales) sp_sales,
    RANK( ) OVER (ORDER BY SUM(tot_sales) DESC) sales_rank
    FROM orders
    GROUP BY salesperson_id
3.3 NTILE 把纪录^分成甲乙丙丁四等
        比如我想取得?5%的纪?或者把25%的纪录当作同一个levelq等对待,把另25%当作另一个Levelq等对待
    SELECT cust_nbr, SUM(tot_sales) cust_sales,
    NTILE(4) OVER (ORDER BY SUM(tot_sales) DESC) sales_quartile
    FROM orders
    GROUP BY cust_nbr
    ORDER BY 3,2 DESC;NTITLE(4)把纪录以 SUM(tot_sales)排序分成4?
 
3.4 辅助分析列和Windows Function
     报表除了基本事实数据?d望旁边多些全q总销?到目前ؓ止的累计销?前后三个月的q_销量这L列来参?
    q种前后三个月的q_和到目前为止的篏计销量就叫windows function, 见下?nbsp;   SELECT month, SUM(tot_sales) monthly_sales,
           SUM(SUM(tot_sales)) OVER (ORDER BY month
           ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) max_preceeding
    FROM orders
    GROUP BY month
    ORDER BY month;



    SELECT month, SUM(tot_sales) monthly_sales,
           AVG(SUM(tot_sales)) OVER (ORDER BY month
           ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) rolling_avg  
    FROM orders
    GROUP BY month
    ORDER BY month;
    Windows Function的关键就是Windows子句的几个取?BR>    1 PRECEDING 之前的一条记?BR>    1 FOLLOWING 之后的一条记?BR>    UNBOUNDED PRECEDING 之前的所有记?BR>    CURRENT ROW 当前U录
 
4.SubQueryȝ
  SubQuery天天用了,理论上ȝ一?SubQuery 分三U?BR>  1.Noncorrelated 子查?nbsp;  最普通的样式.
  2.Correlated Subqueries  把父查询的列拉到子查询里面去,头一回cyt教我的时候理解了半天.
  3.Inline View                           也被当成最普通的样式用了.
 
  然后Noncorrelated 子查询又有三U情?BR>  1.q回一行一?nbsp;   where price < (select max(price) from goods )
  2.q回多行一?nbsp;   where price>= ALL (select price from goods where type=2)
                          or where NOT price< ANY(select price from goods where type=2)
                              最常用的IN其实是=ANY()
  3.q回多行多列    一ơ返回多列当然就节省了查询时?          UPDATE monthly_orders 
          SET (tot_orders, max_order_amt) =
             (SELECT COUNT(*), MAX(sale_price)
          FROM cust_order)

         
DELETE FROM line_item
          WHERE (order_nbr, part_nbr) IN
           (SELECT order_nbr, part_nbr FROM cust_order c)


Terry的Blog 2005-12-06 22:04 发表评论
]]>
关于数据库名(db_name)、实例名(instance_name)、ORACLE_SID (转蝲)http://www.tkk7.com/terry-zj/archive/2005/12/06/22784.htmlTerry的BlogTerry的BlogTue, 06 Dec 2005 13:57:00 GMThttp://www.tkk7.com/terry-zj/archive/2005/12/06/22784.htmlhttp://www.tkk7.com/terry-zj/comments/22784.htmlhttp://www.tkk7.com/terry-zj/archive/2005/12/06/22784.html#Feedback0http://www.tkk7.com/terry-zj/comments/commentRss/22784.htmlhttp://www.tkk7.com/terry-zj/services/trackbacks/22784.html数据库名(DB_NAME)、实例名(Instance_name)、以及操作系l环境变?ORACLE_SID)

在ORACLE7?数据库中只有数据库名(db_name)和数据库实例?instance_name)。在ORACLE8i?i中出C新的参数Q即数据库域?db_domain)、服务名(service_name)、以及操作系l环境变?ORACLE_SID)。这些都存在于同一个数据库中的标识Q用于区分不同数据库的参数?

一、什么是数据库名(db_name)? 数据库名是用于区分数据的内部标识Q是以二q制方式存储于数据库控制文g中的参数Q在数据安装或创Z后将不得修改。数据库安装完成后,该参数被写入数据库参数文件pfile中,格式如下Q?

db_name="orcl"
db_domain=dbcenter.toys.com
instance_name=orcl
service_names=orcl.dbcenter.toys.com
control_file=...............

在每一个运行的ORACLE8i数据库中都有一个数据库?db_name),如果一个服务器E序中创Z两个数据库,则有两个数据库名。其控制参数据分属在不同的pfile中控制着相关的数据库?

二、什么是数据库实例名(instance_name) 数据库实例名则用于和操作pȝ之间的联p,用于对外部连接时使用。在操作pȝ中要取得与数据库之间的交互,必须使用数据库实例名。例如,要和某一个数据库serverq接Q就必须知道其数据库实例名,只知道数据库名是没有用的Q与数据库名不同Q在数据安装或创建数据库之后Q实例名可以被修攏V数据库安装完成后,该实例名被写入数据库参数文gpfile中,格式如下Q?
db_name="orcl" #(不允怿?
db_domain=dbcenter.toys.com
instance_name=orcl #(可以修改,可以与db_name相同也可不同)
service_names=orcl.dbcenter.toys.com
control_file=...............
数据库名与实例名之间的关pR?数据库名与实例名之间的关pM般是一一对应关系Q有一个数据库名就有一个实例名Q如果在一个服务器中创Z个数据库Q则有两个数据库名,两个数据库实例名Q用两个标识定一个数据库Q用户和实例相连接?但在8i?i的ƈ行服务器l构中,数据库与实例之间不存在一一对应关系Q而是一对多关系Q?一个数据库对应多个实例Q同一旉内用户只一个实例相联系Q当某一实例出现故障Q其它实例自动服务,以保证数据库安全q行?

三、操作系l环境变?ORACLE_SID) 在实际中Q对于数据库实例名的描述有时使用实例?instance_name)参数Q有时用ORACLE_SID参数。这两个都是数据库实例名Q它们有什么区别呢Q?l常弄؜)

(ORACLE_SID) OS<----------------> ORACLE 数据?<--------(Instance_name(实例?)

上图表示实例名instance_name、ORACLE_SID与数据库及操作系l之间的关系Q虽然这里列出的两个参数都是数据库实例名Q但instance_name参数是ORACLE数据库的参数Q此参数可以在参数文件中查询刎ͼ而ORACLE_SID参数则是操作pȝ环境变量?操作pȝ环境变量ORACLE_SID用于和操作系l交互。也是_在操作系l中要想得到实例名,必M用ORACLE_SID。此参数与ORACLE_BASE、ORACLE_HOME{用法相同。在数据库安装之后,ORACLE_SID被用于定义数据库参数文g的名U。如Q?$ORACLE_BASE/admin/DB_NAME/pfile/init$ORACLE_SID.ora?定义Ҏ:  export ORACLE_SID=orcl

如果在同一服务器中创徏了多个数据库Q则必然同时存在多个数据库实?q时可以重复上述定义q程Q以选择不同实例?

q可以用 [oracle@Datacent]$ . oraenv 来切换不同的ORACLE_SID来通过操作pȝ来启动不同的实例(instance)



Terry的Blog 2005-12-06 21:57 发表评论
]]>
JDBC更新长VARCHAR2字段http://www.tkk7.com/terry-zj/archive/2005/11/13/19542.htmlTerry的BlogTerry的BlogSat, 12 Nov 2005 16:01:00 GMThttp://www.tkk7.com/terry-zj/archive/2005/11/13/19542.htmlhttp://www.tkk7.com/terry-zj/comments/19542.htmlhttp://www.tkk7.com/terry-zj/archive/2005/11/13/19542.html#Feedback0http://www.tkk7.com/terry-zj/comments/commentRss/19542.htmlhttp://www.tkk7.com/terry-zj/services/trackbacks/19542.htmlJDBC更新长VARCHAR2字段

oracle8开始VARCHAR2字段最大长度达C4000.但是我们q不能简单的用jdbc输入q么大的字符丌Ӏ?BR>让我们看看以下的情况:
数据库参?NLS Database ParametersQ?BR>NLS_CHARACTERSET                          JA16SJIS
NLS_NCHAR_CHARACTERSET         AL16UTF16

如果用pstmt.setString(index, value)更新一个字D? value?000个日文字W?那么我们回得到出错信?
java.sql.SQLException: デーѝcズがこの型の最大サイズを超えています? 3000
出错信息表示oracle认ؓ你输入了3000长度的字W?BR>
l过几次实验可以发现pstmt.setString(index, value)只能更新长度<=2000的字Dc?BR>(原因不明 和oracle7时VARCHAR2字段最长ؓ2000有关?)
长度的计方?(英文字母和数字的数量+日文字符的数?3)<=2000
比如?23パラメーゎ쀝的长度?8
   
更新较长的varchar2字段时应该用pstmt.setCharacterStream(...)
且一ơ只能更C个长varchar2字段?/FONT>

    private void updateChar(Connection conn,int index) throws SQLException{
      
        String SQL = " UPDATE KMD_DOWNLOADRRK_T SET OUTPUTQUERY = ? " +
                    " WHERE RRKCD = ?";
        PreparedStatement pstmt = null;
        try{
            pstmt=conn.prepareStatement(SQL);
            //パラメーѝゅR?BR>            String query = "length must <= 2000";
            StringReader read = new StringReader(query);
            pstmt.setCharacterStream(1,read,query.length());
            pstmt.setString(2, "001");
            pstmt.executeUpdate();
        }finally{
            if(pstmt != null) pstmt.close();
        }
    }

setCharacterStream() 的用比较复? Oracle|站上还介绍了一U解军_?用两个参数对应一个字D?BR>比如emp表中有一个字Dmemo
insert into emp(memo) values (?||?);
只要保证l每个参数赋的g过限制长度卛_.

题外话:
2000对于oracle PL/SQL中的VARCHAR2变量来说是比较特D的是数字?BR>定义一个小?000的VARCHAR2变量Q那么oracle把它放在栈内存 如果大于2000放在堆内存?BR>



Terry的Blog 2005-11-13 00:01 发表评论
]]>
Oracle提供的序号函?/title><link>http://www.tkk7.com/terry-zj/archive/2005/11/12/19431.html</link><dc:creator>Terry的Blog</dc:creator><author>Terry的Blog</author><pubDate>Fri, 11 Nov 2005 16:23:00 GMT</pubDate><guid>http://www.tkk7.com/terry-zj/archive/2005/11/12/19431.html</guid><wfw:comment>http://www.tkk7.com/terry-zj/comments/19431.html</wfw:comment><comments>http://www.tkk7.com/terry-zj/archive/2005/11/12/19431.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/terry-zj/comments/commentRss/19431.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/terry-zj/services/trackbacks/19431.html</trackback:ping><description><![CDATA[     摘要: Oracle提供的序号函?以emp表ؓ?1: rownum 最单的序号 但是在order by之前q定?select rownum,t.* from emp t order by ename   行数 ROWNUM EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 1 11 787...  <a href='http://www.tkk7.com/terry-zj/archive/2005/11/12/19431.html'>阅读全文</a><img src ="http://www.tkk7.com/terry-zj/aggbug/19431.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/terry-zj/" target="_blank">Terry的Blog</a> 2005-11-12 00:23 <a href="http://www.tkk7.com/terry-zj/archive/2005/11/12/19431.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://ai-xian.com" target="_blank">˳վ߹ۿ</a>| <a href="http://xseporn.com" target="_blank">椸Ƶۿ</a>| <a href="http://ystchem.com" target="_blank">ִִֻˬƵ</a>| <a href="http://shadaiym.com" target="_blank">һ</a>| <a href="http://hnmeiankj.com" target="_blank">վɫȫ</a>| <a href="http://igao4.com" target="_blank">91޾ƷƵ</a>| <a href="http://ekyzs.com" target="_blank">ѿƬ߹ۿ</a>| <a href="http://kanboy.com" target="_blank">˳</a>| <a href="http://juytv.com" target="_blank">ҹҹˬ888Ƶ</a>| <a href="http://508009.com" target="_blank">avһ߲ </a>| <a href="http://peipeixiu.com" target="_blank">Ļѹۿ</a>| <a href="http://wkk3.com" target="_blank">1134Ʒ</a>| <a href="http://wenfaka.com" target="_blank">ĻĻmv </a>| <a href="http://www16am8.com" target="_blank">ɫwwwվ</a>| <a href="http://haoda8.com" target="_blank">ŮվɫƵ</a>| <a href="http://spvec.com" target="_blank">Ůʮ·Ůbbw</a>| <a href="http://wwwvv99.com" target="_blank">ձ˳Ƶ</a>| <a href="http://muguangmi.com" target="_blank">˳߹ۿվ </a>| <a href="http://449892.com" target="_blank">GVGVͬ</a>| <a href="http://qiwangxuan.com" target="_blank">ѹԺ߹ۿ</a>| <a href="http://jhmydxx.com" target="_blank">˳ɵӰ߹ۿ</a>| <a href="http://8xcb.com" target="_blank">ҹþþþ</a>| <a href="http://www-36664.com" target="_blank">þþƷר</a>| <a href="http://88109a.com" target="_blank">޹Դ</a>| <a href="http://wivyswap.com" target="_blank">ѿŮƴɫ</a>| <a href="http://6969xxoo.com" target="_blank">鶹69Ƶ</a>| <a href="http://nyminer.com" target="_blank">պvavaŷva</a>| <a href="http://www-887234.com" target="_blank">ձ</a>| <a href="http://bzzxyp.com" target="_blank">޾Ʒ91</a>| <a href="http://7778tv.com" target="_blank">þ91˳ɵӰվ</a>| <a href="http://18yinren.com" target="_blank">ƷѾƷ߹ۿ</a>| <a href="http://asdfghjklzxcv.com" target="_blank">˳վ999þþۺ</a>| <a href="http://155lh.com" target="_blank">޹һǻ</a>| <a href="http://987566.com" target="_blank">պ߲Ƶһ</a>| <a href="http://wwwby1385.com" target="_blank">ɫƷһ</a>| <a href="http://www-84243.com" target="_blank">պ޵һҳ</a>| <a href="http://cg-fun.com" target="_blank">1000žžδʮ</a>| <a href="http://huianpawn.com" target="_blank">ĻƷþ</a>| <a href="http://hn-hshb.com" target="_blank">ĻþþƷˮ</a>| <a href="http://818812.com" target="_blank">99ֻоƷѲ</a>| <a href="http://3bmmatv.com" target="_blank">AVר߳</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>