Rising Sun

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  148 随笔 :: 0 文章 :: 22 评论 :: 0 Trackbacks

#

准备工作:
安装tomcat5.5(注意这点)
安装mysql
拷贝mysql驱动到tomcat_home/common/lib下
新建一个web工程
在工程中加入index.jsp


<%@page import="java.util.*,javax.naming.*,java.sql.*,javax.sql.*" %>
<%@page contentType="text/html;charset=BIG5"%>
<%    
    Context ctx 
= new InitialContext();      
    String strLookup 
= "java:comp/env/jdbc/test"
    DataSource ds 
=(DataSource) ctx.lookup(strLookup);
    Connection con 
= ds.getConnection();
    
if (con != null){
        out.print(
"success");
    }
else{
        out.print(
"failure");
    }
       
%>

web.xml中加入

<resource-ref>
    
<res-ref-name>jdbc/test</res-ref-name>
    
<res-type>javax.sql.DataSource</res-type>
    
<res-auth>Container</res-auth>
    
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

配置tomcat
这一步的目的就是告诉tomcat如何连接数据库
可以分为两种大的类型,每种类型又有很多种配置方式
配置类型一;
(直接配置的类型,这种方式最简单)

方法一:
直接在tomcat_home/conf/localhost/下建立一个xml文件,文件名是<yourAppName>.xml
例如我的工程名叫jndi,对应的名字叫jdni.xml
内容如下:

<Context>
 
<Resource
          name
="jdbc/test"
          type
="javax.sql.DataSource"
          password
="bb"
          driverClassName
="com.mysql.jdbc.Driver"
          maxIdle
="2"
          maxWait
="50"
          username
="root"
          url
="jdbc:mysql://localhost:3306/test"
          maxActive
="4"/>
</Context>

方法二:
只需在tomcat_home\webapps\myapps\META-INF\context.xml中增加:
<context>
<Resource
          name
="jdbc/test"
          type
="javax.sql.DataSource"
          password
="bb"
          driverClassName
="com.mysql.jdbc.Driver"
          maxIdle
="2"
          maxWait
="50"
          username
="root"
          url
="jdbc:mysql://localhost:3306/test"
          maxActive
="4"/>
</context>


说明:这种配置需要告诉tomcat resource的内容,resource应用于什么地方
第一种方法通过文件名知道了app的name
第二种方式本身就在app内部,所以name肯定知道
两种方式都要放在context中

配置类型二:
(配置全局resource,然后通过resourcelink来映射)

步骤一:配置全局resource(这一步对于所有的配置都是一样的)
打开tomcat_home/conf/server.xml加入

<Resource
          name
="jdbc/test"
          type
="javax.sql.DataSource"
          password
="bb"
          driverClassName
="com.mysql.jdbc.Driver"
          maxIdle
="2"
          maxWait
="50"
          username
="root"
          url
="jdbc:mysql://localhost:3306/test"
          maxActive
="4"/>


步骤二:映射
(映射可以配置在多个地方,也就有多个配置方法:)

方法一:(对比类型一的配置理解)
直接在tomcat_home/conf/localhost/下建立一个xml文件,文件名是<yourAppName>.xml
例如我的工程名叫jndi,对应的名字叫jdni.xml加入如下内容

<Context>
<ResourceLink global="jdbc/test" name="jdbc/test" type="javax.sql.DataSource"/>
</Context>

方法二:(对比类型一的配置理解)
在tomcat_home\webapps\myapps\META-INF\context.xml的Context中增加:


<context>
<ResourceLink global="jdbc/test" name="jdbc/test" type="javax.sql.DataSource"/> 
</context>


方法三:(上边两种方法都是把全局的resource 映射给jndi这个web应用,第三种方法就是把这个
全局的resource直接公开给所有的应用)
在tomcat_home/conf/context.xml的<Context></context>之间加入
<ResourceLink global="jdbc/test" name="jdbc/test" type="javax.sql.DataSource"/>


运行测试:
打开ie,输入http://localhost:8080/jndi/index.jsp
看到success

常见错误:
1,Name jdbc is not bound in this Context
2,Cannot create JDBC driver of class '' for connect URL 'null' conf localhost
原因:
大多数是因为配置了全局的resource,但没有link造成的。
解决:
加入link就行了,link的方式见类型二的三种方法。

分析:
看到上边这么多方法,是否感觉眼花缭乱,其实不要死记配置,按照原理分析一下就好了。
你需要的是告诉tomcat哪个应用如何连接数据库。

类型一的方式对应一个应用单独使用这个配置的情况
就是直接告诉tomcat"应用名"  "连接数据库需要的参数"

类型二的方式对应多个应用共享一个配置的情况
这样先配置server.xml告诉tomcat全局范围的"连接数据库需要的参数"
然后映射,映射的时候
1,如果不知道"app name(应用名)"就只需要通过文件名来传递这个信息
2,如果"app name"都知道就只需要加入映射的内容
3,如果要配置成全局公用的,就不需要"app name",本身放在tomcat的context.xml中

最后再次提醒一下:所有的配置必须放在<context></context>之间 

posted @ 2008-08-06 12:52 brock 阅读(175) | 评论 (0)编辑 收藏

我这有个系统是以tomcat5.5+sqlserver2000配置的。我将tomcat使用的初始内存和最大内存分别设置为100M和1024M,然后通过server.xml修改相关的线程数,但minSpareThreads和maxSpareThreads设置的很大或者应经足够小了,通过压力测试,看tomcat5.exe进程占用的内存数的走向图没有什么变化,比如通过压力测试可以使tomcat占到最大800M内存,而压力测试过后放置一晚上tomcat会回落并一直保持在600M。
但通过下面的解释tomcat占用的内存是否应该有变化
minSpareThreads Tomcat初始化时创建的线程数。
maxSpareThreads 一旦创建的线程超过这个值,Tomcat就会关闭不再需要
的socket线程。

下面是我分别设置的线程参数

<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<Connector port="9080"
maxHttpHeaderSize="8192"
maxThreads="10000" minSpareThreads="1000" maxSpareThreads="2000"
enableLookups="false" redirectPort="8443" acceptCount="10000"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8"/>



<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<Connector port="9080"
maxHttpHeaderSize="8192"
maxThreads="10000" minSpareThreads="50" maxSpareThreads="100"
enableLookups="false" redirectPort="8443" acceptCount="10000"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8"/>
posted @ 2008-07-31 15:10 brock 阅读(712) | 评论 (0)编辑 收藏

. 条件标签
    JSTL: 
 1 <c:if test="${user.password == 'hello'}">
 2     <c:choose>
 3         <c:when test="${user.age <= 18}">
 4             <font color="blue" />
 5         </c:when>
 6         <c:when test="${user.age <= 30 && user.age > 18}">
 7             <font color="red" />
 8         </c:when>
 9         <c:otherwise>
10             <font color="green" />
11         </c:otherwise>
12     </c:choose>
13 </c:if>
    Struts2:
1 <s:if test="#user.age <= 18">
2     <font color="blue" />
3 </s:if>
4 <s:elseif test="#user.age <= 30 && user.age > 18">
5     <font color="red" />
6 </s:elseif>
7     <font color="green" />
8 </s:else>

2. 迭代标签
    JSTL:
1 <c:forEach var="user" items="${users}">
2     <c:out value="${user.userName}" />
3 </c:forEach>
4 <!-- 迭代固定次数 -->
5 <c:forEach var="i" begin="1" end="10" step="3">
6     <c:out value="${i}" />
7 </c:forEach>
8 <!-- 这种循环相当于for(int i=1; i<10; i++), 其中step是指迭代的步长,默认为1. -->
    Struts2:
1 <s:iterator value="#users" status="stuts">                
2     <s:if test="#stuts.odd == true">   <!-- 判断是否为奇数行 -->
3         <s:property value="userName" />
4     </s:if>
5     <s:else>
6         <s:property value="passWord" />
7     </s:else>
8 </s:iterator>

3. URL相关标签
    JSTL:
 1 <!-- 绝对路径 -->
 2 <c:import url="http://127.0.0.1:8080/hello/hello.jsp" />
 3 <!-- 相对路径 -->
 4 <c:import url="hello.jsp" />
 5 <!-- Encode -->
 6 <href="<c:url value='hello.jsp'><c:param name='userName' value='cyanbomb' /></c:url>"></a>
 7 <!-- 传递参数到指定的URL -->
 8 <c:import url="hello.jsp" charEncoding="gb2312" >
 9     <c:param name="userName" value="cyanbomb" />
10 </c:import>
11 <!-- URL重定向 -->
12 <c:redirect url="${myurl}" />
13 <!-- 构造URL -->
14 <c:url value="myurl" var="hello.jsp" scope="session">
15     <c:param name="userName" value="cyanbomb" />
16 </c:url>
    Struts2:
1 <href='<s:url value="/hello.jsp" />'>Hello</a><br />
2 <s:url id="url" value="/hello.jsp">
3     <s:param name="name">cyanbomb</s:param>
4 </s:url>        
5 <s:a href="%{url}">Hello</s:a>

解除的疑问,list遍历问题

像这样一个list,里面有3条记录,每条记录包含两个对象,我把结果集(lstRooms)request到了页面,想遍历显示RrmRooms里的id,和RrmRoomType里的name.
我用JSTL实现如下:
1 <table>
2     <c:forEach var="rm" items="${lstRooms}">
3         <tr>
4             <td>${rm[0].id}</td>
5             <td>${rm[1].name}</td>
6         <tr>
7     </c:forEach>
8 </table>
STRUTS2实现如下:
1<table>
2     <s:iterator value="#lstRooms" status="stat">
3         <tr>
4             <td><s:property value="#lstRooms[#stat.index][0].id" /></td>
5             <td><s:property value="#lstRooms[#stat.index][1].name" /></td>
6         <tr>
7     </s:iterator>
8</table>
posted @ 2008-07-30 09:02 brock 阅读(284) | 评论 (0)编辑 收藏

利用w3c的dom:

 

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
  DocumentBuilder builder;
  
try   {
   builder 
=  factory.newDocumentBuilder();
   Document doc 
=  builder.parse( new  ByteArrayInputStream(str.getBytes())); 
  }
  catch  (ParserConfigurationException e)  {
   
//  TODO Auto-generated catch block
   e.printStackTrace();
  }
  catch  (SAXException e)  {
   
//  TODO Auto-generated catch block
   e.printStackTrace();
  }
  catch  (IOException e)  {
   
//  TODO Auto-generated catch block
   e.printStackTrace();
  }
 


利用1 dom4j

SAXReader saxReader = new SAXReader();
        Document document;
        
try {
            document 
= saxReader.read(new ByteArrayInputStream(str.getBytes()));
            Element incomingForm 
= document.getRootElement();
        }
 catch (DocumentException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }


利用 2 dom4j :


String text = "<person> <name>James</name> </person>";
Document document = DocumentHelper.parseText(text);
posted @ 2008-07-29 11:17 brock 阅读(169) | 评论 (0)编辑 收藏

Weblogic 中报Ora-01483

数据库 oralce 9i 版本9.2.0.1.0
Server: Weblogic 814
数据库连接方式:Hibernate3+DataSource + ConnectionPool

问题:
往数据库中某表插入Blog对象时偶尔(并不是每次都,现象是第一次不出错,之后每次都出错)出错,错误异常:
{org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: Could not execute JDBC batch update: encountered SQLException [ORA-01483: invalid length for DATE or NUMBER bind variable]; nested exception is java.sql.BatchUpdateException: ORA-01483: invalid length for DATE or NUMBER bind variable.
java.sql.BatchUpdateException: ORA-01483: invalid length for DATE or NUMBER bind variable

原因分析:
出现这个问题后,使用spring提供的org.springframework.jdbc.datasource.DriverManagerDataSource连数据库执行相同的操作并没有问题,由于使用的是server上配置的DataSource+ConnectionPool,数据库驱动的获取是server选择的。经查找,server选择的是%bea_home%/weblogic81/server/lib/ojdbc14.jar (version 10.1.0.6.0)。用类路径里的驱动替代,该问题不再出现。

解决办法:使用version为10.1.0.4.0的ojdbc.jar代替%bea_home%/weblogic81/server/lib/ojdbc14.jar。

转载 
我的weblogic9
ojdbc14.jar 从orcale 10中找一个来odbc14.jar
posted @ 2008-05-04 17:12 brock 阅读(2337) | 评论 (0)编辑 收藏

oracle的分析函数over 及开窗函数
一:分析函数over
Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是
对于每个组返回多行,而聚合函数对于每个组只返回一行。
下面通过几个例子来说明其应用。                                       
1:统计某商店的营业额。        
     date       sale
     1           20
     2           15
     3           14
     4           18
     5           30
    规则:按天统计:每天都统计前面几天的总额
    得到的结果:
    DATE   SALE       SUM
    ----- -------- ------
    1      20        20           --1天           
    2      15        35           --1天+2天           
    3      14        49           --1天+2天+3天           
    4      18        67            .          
    5      30        97            .
     
2:统计各班成绩第一名的同学信息
    NAME   CLASS S                         
    ----- ----- ----------------------
    fda    1      80                     
    ffd    1      78                     
    dss    1      95                     
    cfe    2      74                     
    gds    2      92                     
    gf     3      99                     
    ddd    3      99                     
    adf    3      45                     
    asdf   3      55                     
    3dd    3      78              
   
    通过:   
    --
    select * from                                                                       
    (                                                                            
    select name,class,s,rank()over(partition by class order by s desc) mm from t2
    )                                                                            
    where mm=1
    --
    得到结果:
    NAME   CLASS S                       MM                                                                                        
    ----- ----- ---------------------- ----------------------
    dss    1      95                      1                      
    gds    2      92                      1                      
    gf     3      99                      1                      
    ddd    3      99                      1          
   
    注意:
    1.在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果          
    2.rank()和dense_rank()的区别是:
      --rank()是跳跃排序,有两个第二名时接下来就是第四名
      --dense_rank()l是连续排序,有两个第二名时仍然跟着第三名
     
     
3.分类统计 (并显示信息)
    A   B   C                      
    -- -- ----------------------
    m   a   2                      
    n   a   3                      
    m   a   2                      
    n   b   2                      
    n   b   1                      
    x   b   3                      
    x   b   2                      
    x   b   4                      
    h   b   3
   select a,c,sum(c)over(partition by a) from t2                
   得到结果:
   A   B   C        SUM(C)OVER(PARTITIONBYA)      
   -- -- ------- ------------------------
   h   b   3        3                        
   m   a   2        4                        
   m   a   2        4                        
   n   a   3        6                        
   n   b   2        6                        
   n   b   1        6                        
   x   b   3        9                        
   x   b   2        9                        
   x   b   4        9                        
  
   如果用sum,group by 则只能得到
   A   SUM(C)                            
   -- ----------------------
   h   3                      
   m   4                      
   n   6                      
   x   9                      
   无法得到B列值       
  
=====

select * from test

数据:
A B C
1 1 1
1 2 2
1 3 3
2 2 5
3 4 6


---将B栏位值相同的对应的C 栏位值加总
select a,b,c, SUM(C) OVER (PARTITION BY B) C_Sum
from test

A B C C_SUM
1 1 1 1
1 2 2 7
2 2 5 7
1 3 3 3
3 4 6 6



---如果不需要已某个栏位的值分割,那就要用 null

eg: 就是将C的栏位值summary 放在每行后面

select a,b,c, SUM(C) OVER (PARTITION BY null) C_Sum
from test

A B C C_SUM
1 1 1 17
1 2 2 17
1 3 3 17
2 2 5 17
3 4 6 17

 

求个人工资占部门工资的百分比

SQL> select * from salary;

NAME DEPT SAL
---------- ---- -----
a 10 2000
b 10 3000
c 10 5000
d 20 4000

SQL> select name,dept,sal,sal*100/sum(sal) over(partition by dept) percent from salary;

NAME DEPT SAL PERCENT
---------- ---- ----- ----------
a 10 2000 20
b 10 3000 30
c 10 5000 50
d 20 4000 100

二:开窗函数           
      开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:
1:     
   over(order by salary) 按照salary排序进行累计,order by是个默认的开窗函数
   over(partition by deptno)按照部门分区
2:
  over(order by salary range between 5 preceding and 5 following)
   每行对应的数据窗口是之前行幅度值不超过5,之后行幅度值不超过5
   例如:对于以下列
     aa
     1
     2
     2
     2
     3
     4
     5
     6
     7
     9
   
   sum(aa)over(order by aa range between 2 preceding and 2 following)
   得出的结果是
            AA                       SUM
            ---------------------- -------------------------------------------------------
            1                       10                                                      
            2                       14                                                      
            2                       14                                                      
            2                       14                                                      
            3                       18                                                      
            4                       18                                                      
            5                       22                                                      
            6                       18                                                                
            7                       22                                                                
            9                       9                                                                 
             
   就是说,对于aa=5的一行 ,sum为   5-1<=aa<=5+2 的和
   对于aa=2来说 ,sum=1+2+2+2+3+4=14     ;
   又如 对于aa=9 ,9-1<=aa<=9+2 只有9一个数,所以sum=9    ;
              
3:其它:
     over(order by salary rows between 2 preceding and 4 following)
          每行对应的数据窗口是之前2行,之后4行
4:下面三条语句等效:           
     over(order by salary rows between unbounded preceding and unbounded following)
          每行对应的数据窗口是从第一行到最后一行,等效:
     over(order by salary range between unbounded preceding and unbounded following)
           等效
     over(partition by null)
posted @ 2007-11-26 10:54 brock 阅读(481) | 评论 (0)编辑 收藏

在JDK1.4中使用JAXP1.3
由于JDK1.5以上已经自带jaxp了,而jdk1.4以下版本需要自己添加jaxp库文件。
 
1。下载
因为jwsdp-1.5中带的jaxp是1.26版本,因此需要单独重新下载jaxp
https://jaxp.dev.java.net/files/documents/913/7831/JAXP_RI_20041025.class
 
参考:
https://jaxp.dev.java.net
http://java.sun.com/xml/jaxp/index.jsp
 
2.安装:
JAXP_RI_20041025.class所在的目录下,进入命令行,
运行:java -cp . JAXP_RI_20041025
然后屏幕上列出所有解压出来的文件名字。
此时,在当前目录下会有一个叫jaxp-1_3的目录,里面有jaxp的jar文件和api文档。
 
3.jaxp需要用到的jar为(都在jaxp-1_3目录下):
dom.jar,jaxp-api.jar,sax.jar,xalan.jar,xercesImpl.jar
 
4.接下来就可以根据自己需要来使用jaxp1.3了
 
5.由于sun默认使用的解析器是经过其包装后的(基于Xerces version 2.6.0 和 XSLTC version 2.5.2),比如:
com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl(可查看javax.xml.parsers.SAXParserFactory 的源代码),
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl(可查看javax.xml.transform.TransformerFactory 的源代码).
因此在需要使用其它解析器的时候,需要通过设置系统属性值的方式,
或者在$java.home/lib/jaxp.properties进行配置($java.home为System.getProperty("java.home")所得到的路径,具体可以查看javax.xml.parsers.FactoryFinder源代码中的 static Object find(String factoryId, String fallbackClassName) 方法)来选择具体的解析器实现。
jaxp.properties中支持以下属性.
 
示例文件如下(实际就是jaxp的默认值):
javax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
javax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl javax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
javax.xml.datatype.DatatypeFactory=com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl
 
假如需要使用apache的解析器,那么如下操作 。
a.下载http://www.apache.org/dist/xml/xerces-j/Xerces-J-bin.2.6.2.zip
http://www.eu.apache.org/dist/xml/xalan-j/binaries/xalan-j_2_6_0-bin.zip
(均为当前最新版本)
b.解压获得相应的jar文件,放入classpath中。
3.配置jaxp.properties为:
javax.xml.transform.TransformerFactory=org.apache.xalan.xsltc.trax.TransformerFactoryImpl
#也可以使用
#javax.xml.transform.TransformerFactory=org.apache.xalan.processor.TransformerFactoryImpl
javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl
javax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
javax.xml.datatype.DatatypeFactory=org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl
 
 
 
 
 
6.需要关于jaxp的调试信息,设置系统属性jaxp.debug为1即可
   System.setProperty("jaxp.debug","1");
或者运行时的命令为: java -Djaxp.debug=1 com.lizongbo.TestJAXP
 
 
 
几篇非常好的资料:
 
JAXP 专述 Sun 的 Java API for XML 语法分析
JAXP 再述 Sun 的 Java API for XML Parsing,1.1 版
http://www-128.ibm.com/developerworks/cn/xml/jaxp1/index.html
 
JAXP 1.3 的新特性,第 1 部分
技术综述,考察解析 API 的变化和新的验证 API
http://www-128.ibm.com/developerworks/cn/xml/x-jaxp13a.html
JAXP 1.3 的新特性,第 2 部分
XPath 功能、支持名称空间的工具和其他改进
http://www-128.ibm.com/developerworks/cn/xml/x-jaxp13b.html
JAXP 全面介绍,第 1 部分
XML 处理工具包使解析和验证变得更容易
http://www-128.ibm.com/developerworks/cn/xml/x-jaxp/index.html
 
Factory模式和Abstract Factory模式
http://www.netbei.com/Article/jsp/jsp6/200409/2771.html
 
Java中关于XML的API一瞥
http://www.matrix.org.cn/article/1073.html
 
 


Trackback: http://tb.donews.net/TrackBack.aspx?PostId=418679

posted @ 2007-10-31 14:51 brock 阅读(292) | 评论 (0)编辑 收藏

 1select
 2 a.tsjbxx_djrq,
 3 b.sqxz_desc,
 4 a.TSJBXX_TSNR,
 5 a.TSJBXX_SSQX,
 6 c.wtxz_mc,
 7 decode(a.tsjbxx_Bjcsjg,'01','结案',
 8        '02','跟踪',
 9        '03','改派',
10        '04','续办',
11        '05','督办',
12        a.tsjbxx_Bjcsjg) tsjbxx_Bjcsjg
13
14/*
15(CASE 
16WHEN a.TSJBXX_BJCSJG='01' THEN '结案'
17WHEN a.TSJBXX_BJCSJG='02' THEN '跟踪'
18WHEN a.TSJBXX_BJCSJG='03' THEN '改派'
19ELSE a.tsjbxx_Bjcsjg
20END
21)
22*/

23
24from tsgl_tsjbxx a ,code_sqxz b , code_wtxz c
25
26where a.Tsjbxx_Wgxzfl= b.sqxz_code(+)
27       and  a.TSJBXX_WGWTFL=c.wtxz_id(+)



------------------------------------
--select DISTINCT t.tsjbxx_blbm  from tsgl_tsjbxx t
--select  t.tsjbxx_blbm  from tsgl_tsjbxx t group by tsjbxx_blbm
--------------------------------------------
posted @ 2007-10-30 12:07 brock 阅读(152) | 评论 (0)编辑 收藏

 

问?: 
表:
col1 col2 col3
1.5 a
1.5 b
2.5 c
2.5 d
5.5 e
5.5 f
1.2 g
1.2 h
1.2 i
1.1 j

我想取得这样的结果:
1.5 a,b
2.5 c,d
1.1 J
1.2 i
5.5 e,f
1.2 h

也就是按col1、col2分组统计,将col3的值用“,”连接起来。

其中col1 是 字符型 col2是数字型。这两个字段的唯一值的个数是未知的

不知该如何才能做到,请各位高手帮忙。


答!: 
1:
id name
1 aa
2 bb
3 cc
4 dd
1 ee
1 xxx
ID相同的行只显示一条记录并把相同ID的NAME加起来用,隔开
怎么搞
???
我需要的结果集是: 
id name
1 aa,ee,xxx
2 bb
3 cc
4 dd
---------------------------------
假设你的table 是 tmp_1;
--------------------------------------------
create table tmp_2 as select 
* from tmp_1 where 1=2;
insert into tmp_2 select distinct id,
null from tmp_1;
declare
i number(
4);
cursor c_v is select 
* from ttmp_1;
begin 
for v_n in c loop
select count(
*) into i from ttmp_2 b where b.name is not null and b.id=v_n.id;
if i=0 then
update ttmp_2 a set name 
= v_n.name where a.id=v_n.id;
else
update ttmp_2 a set name 
= name||','||v_n.name where a.id=v_n.id;
end 
if;
end loop;
end;
/
------------------------------------
或许以下的更有帮助

给你看看duanzilin (寻)的文章吧,一个强贴,地址忘记了,还好有保存


主  题: 原创+突发奇想+分享+散分-----关于分组后字段拼接的问题

作  者: duanzilin (寻) 
信 誉 值: 
120 
所属论坛: Oracle 基础和管理 
问题点数: 
200 
回复次数: 
29 
发表时间: 
2005-7-22 11:52:56 





最近在论坛上,经常会看到关于分组后字段拼接的问题,
大概是类似下列的情形:
SQL
> select no,q from test
2 /

NO Q
---------- ------------------------------
001 n1
001 n2
001 n3
001 n4
001 n5
002 m1
003 t1
003 t2
003 t3
003 t4
003 t5
003 t6

12 rows selected

最后要得到类似于如下的结果:
001 n1;n2;n3;n4;n5
002 m1
003 t1;t2;t3;t4;t5;t6

通常大家都认为这类问题无法用一句SQL解决,本来我也这么认为,可是今天无意中突然有了灵感,原来是可以这么做的:
前几天有人提到过sys_connect_by_path的用法,我想这里是不是也能用到这个方法,如果能做到的话,不用函数或存贮过程也可以做到了;要用到sys_connect_by_path,首先要自己构建树型的结构,并且树的每个分支都是单根的,例如1
-2-3-4,不会存在1-21-〉3的情况;
我是这么构建树,很简单的,看下面的结果就会知道了:
SQL
> select no,q,rn,lead(rn) over(partition by no order by rn) rn1
2 from (select no,q,row_number() over(order by no,q desc) rn from test)
3 /

NO Q RN RN1
---------- ------------------------------ ---------- ----------
001 n5 1 2
001 n4 2 3
001 n3 3 4
001 n2 4 5
001 n1 5 
002 m1 6 
003 t6 7 8
003 t5 8 9
003 t4 9 10
003 t3 10 11
003 t2 11 12
003 t1 12 

12 rows selected

有了这个树型的结构,接下来的事就好办了,只要取出拥有全路径的那个path,问题就解决了,先看no
=001’的分组:
select no,sys_connect_by_path(q,
';') result from 
(select no,q,rn,lead(rn) over(partition by no order by rn) rn1 
from (select no,q,row_number() over(order by no,q desc) rn from test)
)
start with no 
= '001' and rn1 is null connect by rn1 = prior rn
SQL
> 
6 /

NO RESULT
---------- --------------------------------------------------------------------------------
001 ;n1
001 ;n1;n2
001 ;n1;n2;n3
001 ;n1;n2;n3;n4
001 ;n1;n2;n3;n4;n5

上面结果的最后1条就是我们要得结果了
要得到每组的结果,可以下面这样

select t.
*,
(
select max(sys_connect_by_path(q,
';')) result from 
(select no,q,rn,lead(rn) over(partition by no order by rn) rn1 
from (select no,q,row_number() over(order by no,q desc) rn from test)
)
start with no 
= t.no and rn1 is null connect by rn1 = prior rn
) value
from (select distinct no from test) t

SQL
> 
10 /

NO VALUE
---------- --------------------------------------------------------------------------------
001 ;n1;n2;n3;n4;n5
002 ;m1
003 ;t1;t2;t3;t4;t5;t6

对上面结果稍加处理就可以了,希望对大家有帮助:) 
答!: 
2:
注意注意 

sys_connect_by_path有长度限制,不能超过4K 
posted @ 2007-09-13 10:14 brock 阅读(542) | 评论 (0)编辑 收藏

1问题: hibernate不用外键作查询:
1.1最终解办法: 利用hibernate 的视图功能
Hibernate3增加了视图功能

1. 定义hbm

    <class name="Customer" table="customer">        
        
<id name="id" unsaved-value="0" column="id">
            
<generator class="hilo"/>
        
</id>        
        
<property name="name"  not-null="true"/>        
    
</class>
    
    
<class name="Supplier" table="supplier">        
        
<id name="id" unsaved-value="0" column="id">
            
<generator class="hilo"/>
        
</id>
        
<property name="name" not-null="true"/>            
    
</class>
    
    
<class name="All" mutable="false">    
        <subselect>
            select id, name from customer
            union 
            select id, name from supplier
        
</subselect>
        
        
<synchronize table="customer"/>
        
<synchronize table="supplier"/>
        
        
<id name="id" unsaved-value="0" column="id">
            
<generator class="hilo"/>
        
</id>        
        
<property name="name"/>        
    
</class>


2. 定义POJO

pulic class Customer {
    
public Integer id;
    
public String name;
}


pulic 
class Supplier {
    
public Integer id;
    
public String name;
}


pulic 
class All {
    
public Integer id;
    
public String name;
}


3. 查询

List all = session.createQuery("from All").list();
注意:黄色地区


解决办法二

1.2 在数据表里 建视图, 把视图当表操作.

解决办法三
1.3 设外键=没说,,哈哈

总结,不用外键.为了建表方便.  

To Be Continued……



posted @ 2007-09-04 11:02 brock 阅读(303) | 评论 (0)编辑 收藏

仅列出标题
共15页: First 上一页 5 6 7 8 9 10 11 12 13 下一页 Last