??xml version="1.0" encoding="utf-8" standalone="yes"?>国产永久av在线,国产在线色视频,99在线视频精品http://www.aygfsteel.com/algz/articles/366838.html紫蝶∏飛揚↗紫蝶∏飛揚↗Tue, 20 Dec 2011 06:10:00 GMThttp://www.aygfsteel.com/algz/articles/366838.htmlhttp://www.aygfsteel.com/algz/comments/366838.htmlhttp://www.aygfsteel.com/algz/articles/366838.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/366838.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/366838.html
Hibernate Annotation几种兌映射
一对一(One-To-One)
使用@OneToOne注解建立实体Bean之间的一对一兌。一对一兌有三U情况:(1).兌的实体都׃n同样的主键,(2).其中一个实体通过外键兌到另一个实体的主键(注意要模拟一对一兌必须在外键列上添加唯一U束)Q?3).通过兌表来保存两个实体之间的连接关p?要模拟一对一兌必须在每一个外键上d唯一U束)?/div>
 
1.׃n主键的一对一兌映射Q?/div>
@Entity
@Table(name="Test_Body")
public class Body {
   private Integer id;
   private Heart heart;
   @Id
   public Integer getId() {
      return id;
   }
   public void setId(Integer id) {
      this.id = id;
   }
   @OneToOne
   @PrimaryKeyJoinColumn
   public Heart getHeart() {
      return heart;
   }
   public void setHeart(Heart heart) {
      this.heart = heart;
   }
}
@Entity
@Table(name="Test_Heart")
public class Heart {
   private Integer id;
   @Id
   public Integer getId() {
      return id;
   }
   public void setId(Integer id) {
      this.id = id;
   }
}
通过@PrimaryKeyJoinColumnҎ定义了一对一兌
 
2.使用外键q行实体一对一兌Q?/div>
@Entity
@Table(name="Test_Trousers")
public class Trousers {
   @Id
   public Integer id;
   @OneToOne
   @JoinColumn(name = "zip_id")
   public TrousersZip zip;
}
@Entity
@Table(name="Test_TrousersZip")
public class TrousersZip {
   @Id
   public Integer id;
   @OneToOne(mappedBy = "zip")
   public Trousers trousers;
}
上面的例子是指Trousers通过Trousers的外键列zip_id和TrousersZip兌Q@JoinColumnҎ定义了联接列Q该Ҏ和@ColumnҎ有点cMQ但是多了一个名为referencedColumnName的参数。该参数定义了所兌目标实体中的联接列,注意Q当referencedColumnName兌到非主键列的时候,兌的目标类必须实现SerializableQ还要注意的是所映像的属性对应单个列Q否则映无效)
一对一兌可能是双向的Q在双向兌中,有且仅有一端作Z体(ownerQ端存在Q主体端负责l护联接列(x斎ͼQ对于不需要维护这U关pȝ从表则通过mappedNy属性进行声明。mappedBy的值指向主体的兌属性。例子中QmappedBy的gؓzip。最后,不必也不能再在被兌端(ownedsideQ定义联接列了,因ؓ已经在主体端声明了?/div>
如果在主体没有声明@JoinColumnQ系l自动进行处理:在主表(owner tableQ中创接列Q列名ؓQ主体的兌属性名+下划U?被关联端的主键列名。上面的例子中是zip_id,因ؓTrousers中的兌属性名为zipQTrousersZip的主键是id?/div>
 
3.通过兌表定义一对一兌
@Entity
@Table(name="Test_People")
public class People {
   @Id
   public Integer id;
   @OneToOne
   @JoinTable(name ="TestPeoplePassports",
      joinColumns =@JoinColumn(name="people_fk"),
      inverseJoinColumns =@JoinColumn(name="passport_fk")
   )
   public Passport passport;
}
@Entity
@Table(name="Test_Passport")
public class Passport {
   @Id
   public Integer id;
   @OneToOne(mappedBy = "passport")
   public People people;
}
People通过名ؓTestPeoplePassports的关联表和Passport兌。该兌表拥有名为passport_fk的外键列Q该外键指向Passport表,该信息定义ؓinverseJoinColoumns的属性|而people_fk外键列指向People表,该信息定义ؓjoinColumns的属性倹{?/div>
q种兌可能是双向的Q在双向兌中,有且仅有一端作Z体(ownerQ端存在Q主体端负责l护联接列(x斎ͼQ对于不需要维护这U关pȝ从表则通过mappedNy属性进行声明。mappedBy的值指向主体的兌属性。例子中QmappedBy的gؓpassport。最后,不必也不能再在被兌端(ownedsideQ定义联接列了,因ؓ已经在主体端声明了?/div>
以上是一对一兌的三UŞ式,下面介绍多对一兌?/div>
 
 
 
多对一(Many-to-One)
使用@ManyToOneҎ来实现多对一兌?/div>
@ManyToOneҎ有一个名为targetEntity的参敎ͼ该参数定义了目标实体名,通常不需要定义该参数Q因为在大部分情况下默认?表示兌关系的属性类?可以很好的满需求了。不q下面这U情况下q个参数显得有意义了:使用接口作ؓq回D不是常见的实体?/div>
@ManyToOne(targetEntity=CompanyImpl.class)
@JoinColoumn(name=”COPM_ID”)
Public Company getCompany(){
   return company;
}
多对一的配|方式有两种Q?1)通过@JoinColoumn映像(2)通过兌表的方式来映?/div>
 
(1)           通过@JoinColoumn映射
SRD Framework中Company,Category例子Q?/div>
CompanyQ?/div>
@ManyToOne
   @JoinColumn(name = "CATEGORY_OPTION_ID")
   private Category category = null;
   CategoryQ?/div>
@DiscriminatorValue("Category")
public class Category extends Option {
}
(2)           通过兌表映?/div>
通过@JoinTableҎ定义兌表,该关联表包含了指回实体表的外?通过@JoinTable.joinColoumns)以及指向目标实体表的外键(通过@JoinTable.inverseJoinColoumns)
@Entity
@Table(name="Test_TreeType")
public class TreeType {
   private Integer id;
   private String name;
   private ForestType forestType;
   @ManyToOne(fetch = FetchType.LAZY)
   @JoinTable(name="Test_Tree_Forest",
      joinColumns = @JoinColumn(name="tree_id"),
      inverseJoinColumns = @JoinColumn(name="forest_id") )
public ForestType getForestType() {// forestType的getterQsetterҎ必须在这里,否则会出?/div>
      return forestType;
   }
   public void setForestType(ForestType forestType) {
      this.forestType = forestType;
   }
   @Id
   @GeneratedValue
   public Integer getId() {
      return id;
   }
   public void setId(Integer id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}
@Entity
@Table(name="Test_ForestType")
public class ForestType {
   private Integer id;
   private String name;
   private Set<TreeType> trees;
   @OneToMany(mappedBy="forestType")
public Set<TreeType> getTrees() {// trees的getterQsetterҎ必须在这里,否则会出?/div>
      return trees;
   }
   public void setTrees(Set<TreeType> trees) {
      this.trees = trees;
   }
   @Id @GeneratedValue
   public Integer getId() {
      return id;
   }
   public void setId(Integer id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}
 
一对多(One-to-Many)
使用@OneToManyҎ可定义一对多兌Q一对多兌可以是双向关联?/div>
在EJB3规范中多对一q端几乎L双向兌中的M(owner)端,而一对多q端兌Ҏ为@OneToMany(mappedBy...)
@Entity
Public class Troop{
   @OneToMany(mappedBy=”troop”)
Public Set<Soldier> getSoldiers(){
......
}
@Entity
Public class Soldier{
   @ManyToOne
   @JoinColumn(name=”troop_fk”)
Public Troop getTroop(){
......
}
Troop通过troop属性和Soldier建立一对多的双向关联,在mappedBy端不必也不能再定义Q何物理映?/div>
对于一对多的双向映,如果要一对多q一端维护关联关p,你需要删除mappedBy元素q将多对一q端的@JoinColoumn的insertable和updatabel讄为false。这U方案不会得C么明昄优化Q而且q会增加一些附加的UPDATE语句?/div>
 
单向Q?/div>
通过在被拥有的实体端(owned entity)增加一个外键列来实C对多单向兌是很见的,也是不推荐的Q徏议通过一个联接表来实现这U关?下面会讲??/div>
@JoinColoumnҎ来描q这U单向关联关p?/div>
@Entity
Public class Customer{
   @OneToMany
@JoinColoumn(name=”CUST_ID”)
Public Set<ticket> getTickets() {
......
}
@Entity
Public class Ticket{
   ...
}
Customer通过CUST_ID列和Ticket建立了单向关联关p?/div>
通过兌表处理单向关联:
通过联接表处理单向一对多兌是首选方式,q种兌通过@JoinTableҎq行描述
@Entity
Public class Trainer{
@OneToMany
@JoinTable(
   name = "TrainedMonkeys",
   jonColumns = {@JoinColumn(name = "trainer_id")},
   inverseJoinColumns = @JoinColumn(name = "monkey_id")
   )
public Set<Monkey> getTrainedMonkeys() {
      return trainedMonkeys;
   }
......
}
@Entity
public class Monkey {
...//no bidir
}
上面q个例子中,Trainer通过TrainedMonkeys表和Monkey建立了单向关联,其中外键trainer_id兌到Trainer(joinColoumn),而外键monkey_id兌到Monkey(inversejionColoumns)
默认处理机制Q?/div>
通过联接表来建立单向一对多兌不需要描qCQ何物理映像,表名׃下三个部分组成:主表(ownertable)表名+从表(the other side table)表名Q指向主表的外键名:主表表名+下划U?主表主键列名Q指向从表的外键名:主表所对应实体的属性名+下划U?从表主键列名Q指向从表的外键定义为唯一U束Q用来表CZ对多的关联关pR?/div>
@Entity
public class Trainer{
   @OneToMany
   Public Set<Tiger> getTrainedTigers(){
... ...
}
@Entity
public class Tiger{
.. ..//no bidir
}
上面q个例子中,Trainer和Tiger通过联接表Trainer_Tiger建立单向兌关系Q其中外键trainer_id兌到Trainer,而外键trainedTigers_id兌到Tiger
 
多对?Many-to-Many)
使用@ManyToManyҎ可定义多对多兌Q同Ӟ你也许要通过Ҏ@JoinTable描述兌表和兌条g。如果是双向兌Q其中一D必d义ؓOwnerQ另一端必d义ؓinverse(在对兌表进行更新操作时q一端将被忽?
@Entity()
public class Employer implements Serializable {
   private Integer id;
   private Collection employees;
   @ManyToMany(
targetEntity = org.hibernate.test.annotations.manytomany.Employee.class,
      cascade = {CascadeType.PERSIST, CascadeType.MERGE}
   )
   @JoinTable(
         name = "EMPLOYER_EMPLOYEE",
         joinColumns = {@JoinColumn(name = "EMPER_ID")},
         inverseJoinColumns = {@JoinColumn(name = "EMPEE_ID")}
   )
   public Collection getEmployees() {
      return employees;
   }
...
}
@Entity()
public class Employee implements Serializable {
   @ManyToMany(
         cascade = {CascadeType.PERSIST, CascadeType.MERGE},
         mappedBy = "employees"
         targetEntity = Employer.class
   )
public Collection<Employer> getEmployers() {
      return employers;
   }
.. ..
}
@JoinTableҎ定义了联接表的表名,联接列数l,以及invers联接列数l,后者是兌表中兌到Employee主键的列(the “other side”)?/div>
被关联端不必也不能描q物理映:只需要一个简单的mappedBy参数Q该参数包含了主体端的属性名Q这样就l定了双方的关系?/div>
默认|
和其它许多批注一P在多对多兌中很多值是自动生成Q党双向多对多关联中没有定义M物理映射ӞHibernateҎ以下规则生成相应的|兌表名Q主表表?下划U?从表表名Q关联到主表的外键名Q主表名+下划U?主表中的主键列名Q关联到从表的外键名Q主表中用于兌的属性名+下划U?从表的主键列名,以上规则对于双向一对多兌同样一栗?/div>
 
以上是整理的一点简单的几种映射Q可参考EJB3.pdf中P111——P131Qhibernate_annotation.pdf W二?/div>
在这里没有具体的例子Q有很多内容q需要仔l查看文档?/div>


]]>[转] 关于oracle with table as 创徏临时表的用法CZhttp://www.aygfsteel.com/algz/articles/365688.html紫蝶∏飛揚↗紫蝶∏飛揚↗Tue, 06 Dec 2011 08:47:00 GMThttp://www.aygfsteel.com/algz/articles/365688.htmlhttp://www.aygfsteel.com/algz/comments/365688.htmlhttp://www.aygfsteel.com/algz/articles/365688.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/365688.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/365688.html1、with table as 相当于徏个时表Q用于一个语句中某些中间l果攑֜临时表空间的SQL语句Q,Oracle 9i 新增WITH语法Q可以将查询中的子查询命名,攑ֈSELECT语句的最前面?/span>

语法是
with tempname as (select ....)
select ...

例子Q?/span>
with t as (select * from emp where depno=10)
select * from t where empno=xxx

with
wd as (select did,arg(salary) q_工资 from work group by did),
em as (select emp.*,w.salary from emp left join work w on emp.eid = w.eid)
select * from wd,em where wd.did =em.did and wd.q_工资>em.salary;



2、何时被清除
临时表不都是会话l束p动被PGA清除? 但with as临时表是查询完成后就被清除了Q?/span>
23:48:58 SCOTT@orcl> with aa as(select * from dept)
23:57:58   2  select * from aa;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

已用旉:  00: 00: 00.12
23:58:06 SCOTT@orcl> select * from aa;
select * from aa
              *
W?1 行出现错?
ORA-00942: 表或视图不存?/span>


已用旉:  00: 00: 00.02
23:58:14 SCOTT@orcl>

3、就q一功能来说Q子查询可以达到啊Qؓ什么要用with呢? 用with有什么好处?
都能写,但执行计划不同的。当有多个相似子查询的时候,用with写公共部分,因ؓ子查询结果在内存临时表中Q执行效率当然就高啦~

4、问题:
有张表数据如下:
aaa ?/span>
bbb ?/span>
aaa ?/span>
aaa ?/span>
bbb ?/span>
bbb ?/span>
需要得C列结?
  ??/span>
aaa 2 1
bbb 1 2
?SQL 语句怎么写?Q?/span>

{案Q?/span>
with tt as (
  select 'aaa' id, '? value from dual union all
  select 'bbb' id, '? value from dual union all
  select 'aaa' id, '? value from dual union all
  select 'aaa' id, '? value from dual union all
  select 'bbb' id, '? value from dual union all
  select 'bbb' id, '? value from dual)
SELECT id,
       COUNT(decode(VALUE, '?, 1)) ?
       COUNT(decode(VALUE, '?, 1)) ?/span>
  FROM tt
 GROUP BY id;
===================================================================
扩展Q?/span>
Oracle9i新增WITH语法Q可以将查询中的子查询命名,攑ֈSELECT语句的最前面?/span>

  一个简单的例子:

SQL> WITH
2 SEG AS (SELECT SEGMENT_NAME, SUM(BYTES)/1024 K FROM USER_SEGMENTS GROUP BY SEGMENT_NAME),
3 OBJ AS (SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS)
4 SELECT O.OBJECT_NAME, OBJECT_TYPE, NVL(S.K, 0) SIZE_K
5 FROM OBJ O, SEG S
6 WHERE O.OBJECT_NAME = S.SEGMENT_NAME (+)
7 ;
OBJECT_NAME OBJECT_TYPE SIZE_K
------------------------------ ------------------- ----------
DAIJC_TEST TABLE 128
P_TEST PROCEDURE 0
IND_DAIJC_TEST_C1 INDEX 128

  通过WITH语句定义了两个子查询SEG和OBJQ在随后的SELECT语句中可以直接对预定义的子查询进行查询。从上面的例子也可以看出Q用WITH语句Q将一个包含聚集、外q接{操作SQL清晰的展现出来?/span>

  WITH定义的子查询不仅可以使查询语句更加简单、清晎ͼ而且WITH定义的子查询q具有在SELECT语句的Q意层均可见的特点?/span>

  即是在WITH的定义层中,后定义的子查询都可以使用前面已经定义好的子查?

SQL> WITH
2 Q1 AS (SELECT 3 + 5 S FROM DUAL),
3 Q2 AS (SELECT 3 * 5 M FROM DUAL),
4 Q3 AS (SELECT S, M, S + M, S * M FROM Q1, Q2)
5 SELECT * FROM Q3;
S M S+M S*M
---------- ---------- ---------- ----------
8 15 23 120

  利用WITH定义查询中出现多ơ的子查询还能带来性能提示。Oracle会对WITHq行性能优化Q当需要多ơ访问WITH定义的子查询ӞOracle会将子查询的l果攑ֈ一个时表中,避免同样的子查询多次执行Q从而有效的减少了查询的IO数量?/span>

WITH能用在SELECT语句中,UPDATE和DELETE语句也是支持WITH语法的,只是需要版本支?
http://www.oracle.com.cn/viewthread.php?tid=83530

=============================================================================
with
sql1 as (select to_char(a) s_name from test_tempa),
sql2 as (select to_char(b) s_name from test_tempb where not exists (select s_name from sql1 where rownum=1))
select * from sql1
union all
select * from sql2
union all
select 'no records' from dual
       where not exists (select s_name from sql1 where rownum=1)
       and not exists (select s_name from sql2 where rownum=1);

再D个简单的例子

with a as (select * from test)

select * from a;

其实是把一大堆重复用到的SQL语句攑֜with as 里面Q取一个别名,后面的查询就可以用它

q样对于大批量的SQL语句起到一个优化的作用Q而且清楚明了


q是搜烦到的英文文档资料(说得比较?但是本h英文特菜,q没具体了解?希望各高手具体谈谈这个with
as 的好?

About Oracle WITH clause
Starting in Oracle9i release 2 we see an incorporation of the SQL-99 “WITH clause”, a tool for materializing subqueries to save Oracle from having to re-compute them multiple times.

The SQL “WITH clause” is very similar to the use of Global temporary tables (GTT), a technique that is often used to improve query speed for complex subqueries. Here are some important notes about the Oracle “WITH clause”:

   ? The SQL “WITH clause” only works on Oracle 9i release 2 and beyond.
   ? Formally, the “WITH clause” is called subquery factoring
   ? The SQL “WITH clause” is used when a subquery is executed multiple times
   ? Also useful for recursive queries (SQL-99, but not Oracle SQL)

To keep it simple, the following example only references the aggregations once, where the SQL “WITH clause” is normally used when an aggregation is referenced multiple times in a query.
We can also use the SQL-99 “WITH clause” instead of temporary tables. The Oracle SQL “WITH clause” will compute the aggregation once, give it a name, and allow us to reference it (maybe multiple times), later in the query.

The SQL-99 “WITH clause” is very confusing at first because the SQL statement does not begin with the word SELECT. Instead, we use the “WITH clause” to start our SQL query, defining the aggregations, which can then be named in the main query as if they were “real” tables:

WITH
subquery_name
AS
(the aggregation SQL statement)
SELECT
(query naming subquery_name);

Retuning to our oversimplified example, let’s replace the temporary tables with the SQL “WITH  clause”:

WITH
sum_sales AS
  select /*+ materialize */
    sum(quantity) all_sales from stores
number_stores AS
  select /*+ materialize */
    count(*) nbr_stores from stores
sales_by_store AS
  select /*+ materialize */
  store_name, sum(quantity) store_sales from
  store natural join sales
SELECT
   store_name
FROM
   store,
   sum_sales,
   number_stores,
   sales_by_store
where
   store_sales > (all_sales / nbr_stores)
;

Note the use of the Oracle undocumented “materialize” hint in the “WITH clause”. The Oracle materialize hint is used to ensure that the Oracle cost-based optimizer materializes the temporary tables that are created inside the “WITH” clause. This is not necessary in Oracle10g, but it helps ensure that the tables are only created one time.

It should be noted that the “WITH clause” does not yet fully-functional within Oracle SQL and it does not yet support the use of “WITH clause” replacement for “CONNECT BY” when performing recursive queries.

To see how the “WITH clause” is used in ANSI SQL-99 syntax, here is an excerpt from Jonathan Gennick’s great work “Understanding the WITH Clause” showing the use of the SQL-99 “WITH clause” to traverse a recursive bill-of-materials hierarchy

The SQL-99 “WITH clause” is very confusing at first because the SQL statement does not begin with the word SELECT. Instead, we use the “WITH clause” to start our SQL query, defining the aggregations, which can then be named in the main query as if they were “real” tables:

WITH
subquery_name
AS
(the aggregation SQL statement)
SELECT
(query naming subquery_name);

Retuning to our oversimplified example, let’s replace the temporary tables with the SQL “WITH” clause”:


]]>
Hibernate 注解映射 讄默认值的异常及解x?/title><link>http://www.aygfsteel.com/algz/articles/365534.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Mon, 05 Dec 2011 01:21:00 GMT</pubDate><guid>http://www.aygfsteel.com/algz/articles/365534.html</guid><wfw:comment>http://www.aygfsteel.com/algz/comments/365534.html</wfw:comment><comments>http://www.aygfsteel.com/algz/articles/365534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/algz/comments/commentRss/365534.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/algz/services/trackbacks/365534.html</trackback:ping><description><![CDATA[<div><div>Oracle 数据?<br />Hibernate annotation :<br /><div><div><span style="white-space:pre"> </span>@Column(name="NUMBERS",columnDefinition="NUMBER(20,3) default 0 ")</div><div><span style="white-space:pre"> </span>public BigDecimal getNumbers() {</div><div><span style="white-space:pre"> </span>return numbers;</div><div><span style="white-space:pre"> </span>}<br /><br />异常:</div></div>Caused by: org.hibernate.HibernateException: Wrong column type: NUMBERS, expected: NUMBER(20,3) default 0 </div><div><span style="white-space:pre"> </span>at org.hibernate.mapping.Table.validateColumns(Table.java:261)</div><div><span style="white-space:pre"> </span>at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1083)</div><div><span style="white-space:pre"> </span>at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:116)</div><div><span style="white-space:pre"> </span>at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:317)</div><div><span style="white-space:pre"> </span>at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)</div><div><span style="white-space:pre"> </span>at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:915)</div><div><span style="white-space:pre"> </span>at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:730)</div><div><span style="white-space:pre"> </span>... 122 more<br />解决Ҏ:<br /><div><div><span style="white-space:pre"> </span>@Column(name="NUMBERS",columnDefinition="number(20,3) default 0 ")</div><div><span style="white-space:pre"> </span>public BigDecimal getNumbers() {</div><div><span style="white-space:pre"> </span>return numbers;</div><div><span style="white-space:pre"> </span>}<br />原因:hibernate 在列定义选项?数据库中的所有类型应为小写number. hibernate在此直接面对数据?所以区分大写.</div></div></div></div><img src ="http://www.aygfsteel.com/algz/aggbug/365534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-12-05 09:21 <a href="http://www.aygfsteel.com/algz/articles/365534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Oracle 语法?OVER (PARTITION BY ..) 及开H函?/title><link>http://www.aygfsteel.com/algz/articles/365263.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Thu, 01 Dec 2011 02:00:00 GMT</pubDate><guid>http://www.aygfsteel.com/algz/articles/365263.html</guid><wfw:comment>http://www.aygfsteel.com/algz/comments/365263.html</wfw:comment><comments>http://www.aygfsteel.com/algz/articles/365263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/algz/comments/commentRss/365263.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/algz/services/trackbacks/365263.html</trackback:ping><description><![CDATA[<span id="wmqeeuq" class="Apple-style-span" style="color: #454545; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 12px; line-height: 14px; background-color: #ffffff; "><div>oracle的分析函数over 及开H函?/div><div><font size="2">一Q分析函?strong style="color: black; background-color: #a0ffff; ">over</strong><br /><strong style="color: black; background-color: #ffff66; ">Oracle</strong>?.1.6开始提供分析函敎ͼ分析函数用于计算Zl的某种聚合|它和聚合函数的不同之处是<br />对于每个l返回多行,而聚合函数对于每个组只返回一行?nbsp;<br />下面通过几个例子来说明其应用?nbsp;                                      </font><div><font size="2">1Q统计某商店的营业额?nbsp;       </font></div><div><font size="2">     date       sale<br />     1           20<br />     2           15<br />     3           14<br />     4           18<br />     5           30<br />    规则Q按天统计:每天都统计前面几天的总额<br />    得到的结果:<br />    DATE   SALE       SUM<br />    ----- -------- ------<br />    1      20        20           --1?nbsp;          <br />    2      15        35           --1天+2?nbsp;          <br />    3      14        49           --1天+2天+3?nbsp;          <br />    4      18        67            .          <br />    5      30        97            .<br />     <br />2:l计各班成WW一名的同学信息</font></div><div><font size="2">    NAME   CLASS S                         <br />    ----- ----- ---------------------- <br />    fda    1      80                     <br />    ffd    1      78                     <br />    dss    1      95                     <br />    cfe    2      74                     <br />    gds    2      92                     <br />    gf     3      99                     <br />    ddd    3      99                     <br />    adf    3      45                     <br />    asdf   3      55                     <br />    3dd    3      78              <br />   <br />    通过Q?nbsp;  <br />    --<br />    select * from                                                                       <br />    (                                                                            <br />    select name,class,s,rank()<strong style="color: black; background-color: #a0ffff; ">over</strong>(partition by class order by s desc) mm from t2<br />    )                                                                            <br />    where mm=1 <br />    --<br />    得到l果Q?br />    NAME   CLASS S                       MM                                                                                        <br />    ----- ----- ---------------------- ---------------------- <br />    dss    1      95                      1                      <br />    gds    2      92                      1                      <br />    gf     3      99                      1                      <br />    ddd    3      99                      1          <br />   <br />    注意Q?br />    1.在求W一名成l的时候,不能用row_number()Q因为如果同班有两个q列W一Qrow_number()只返回一个结?nbsp;         <br />    2.rank()和dense_rank()的区别是Q?br />      --rank()是蟩跃排序,有两个第二名时接下来是W四?br />      --dense_rank()l是连l排序,有两个第二名时仍然跟着W三?br />     <br />     <br />3.分类l计 (q显CZ?</font></div><div><font size="2">    A   B   C                      <br />    -- -- ---------------------- <br />    m   a   2                      <br />    n   a   3                      <br />    m   a   2                      <br />    n   b   2                      <br />    n   b   1                      <br />    x   b   3                      <br />    x   b   2                      <br />    x   b   4                      <br />    h   b   3</font></div><div><font size="2">   select a,c,sum(c)<strong style="color: black; background-color: #a0ffff; ">over</strong>(partition by a) from t2                <br />   得到l果Q?br />   A   B   C        SUM(C)<strong style="color: black; background-color: #a0ffff; ">OVER</strong>(PARTITIONBYA)      <br />   -- -- ------- ------------------------ <br />   h   b   3        3                        <br />   m   a   2        4                        <br />   m   a   2        4                        <br />   n   a   3        6                        <br />   n   b   2        6                        <br />   n   b   1        6                        <br />   x   b   3        9                        <br />   x   b   2        9                        <br />   x   b   4        9                        <br />  <br />   如果用sumQgroup by 则只能得?br />   A   SUM(C)                            <br />   -- ---------------------- <br />   h   3                      <br />   m   4                      <br />   n   6                      <br />   x   9                      <br />   无法得到B列?nbsp;      <br />  <br />Q=Q=Q?/font></div><div><div><p><font face="verdana, arial, helvetica" size="2"><span id="wmqeeuq" class="javascript" id="text2200299" style="font-size: 12px; ">select * from test<br /><br />数据:<br />A B C <br />1 1 1 <br />1 2 2 <br />1 3 3 <br />2 2 5 <br />3 4 6 <br /><br /><br />---B栏位值相同的对应的C 栏位值加?br />select a,b,c, SUM(C) OVER (PARTITION BY B) C_Sum<br />from test<br /><br />A B C C_SUM <br />1 1 1 1 <br />1 2 2 7 <br />2 2 5 7 <br />1 3 3 3 <br />3 4 6 6 <br /><br /><br /><br />---如果不需要已某个栏位的值分?那就要用 null<br /><br />eg: 是C的栏位值summary 攑֜每行后面<br /><br />select a,b,c, SUM(C) OVER (PARTITION BY null) C_Sum<br />from test<br /><br />A B C C_SUM <br />1 1 1 17 <br />1 2 2 17 <br />1 3 3 17 <br />2 2 5 17 <br />3 4 6 17</span></font></p><p><font face="verdana, arial, helvetica" size="2"></font> </p><p><font face="verdana, arial, helvetica" size="2"><span id="wmqeeuq" class="javascript" style="font-size: 12px; ">求个人工资占部门工资的百分比</span></font></p><font face="verdana, arial, helvetica" size="2"><p><font face="verdana, arial, helvetica" size="2"><span id="wmqeeuq" class="javascript" id="text3005546" style="font-size: 12px; ">SQL> select * from salary;<br /><br />NAME DEPT SAL<br />---------- ---- -----<br />a 10 2000<br />b 10 3000<br />c 10 5000<br />d 20 4000<br /><br />SQL> select name,dept,sal,sal*100/sum(sal) over(partition by dept) percent from salary;<br /><br />NAME DEPT SAL PERCENT<br />---------- ---- ----- ----------<br />a 10 2000 20<br />b 10 3000 30<br />c 10 5000 50<br />d 20 4000 100</span></font></p></font></div></div><div><font size="2">二:开H函?nbsp;          <br />      开H函数指定了分析函数工作的数据窗口大,q个数据H口大小可能会随着行的变化而变化,举例如下Q?nbsp;<br />1Q?nbsp;    <br />   <strong style="color: black; background-color: #a0ffff; ">over</strong>Qorder by salaryQ?按照salary排序q行累计Qorder by是个默认的开H函?br />   <strong style="color: black; background-color: #a0ffff; ">over</strong>Qpartition by deptnoQ按照部门分?br />2Q?br />  <strong style="color: black; background-color: #a0ffff; ">over</strong>Qorder by salary range between 5 preceding and 5 followingQ?br />   每行对应的数据窗口是之前行幅度g过5Q之后行q度g过5<br />   例如:对于以下?br />     aa<br />     1<br />     2<br />     2<br />     2<br />     3<br />     4<br />     5<br />     6<br />     7<br />     9<br />   <br />   sum(aa)<strong style="color: black; background-color: #a0ffff; ">over</strong>Qorder by aa range between 2 preceding and 2 followingQ?br />   得出的结果是<br />            AA                       SUM<br />            ---------------------- ------------------------------------------------------- <br />            1                       10                                                      <br />            2                       14                                                      <br />            2                       14                                                      <br />            2                       14                                                      <br />            3                       18                                                      <br />            4                       18                                                      <br />            5                       22                                                      <br />            6                       18                                                                <br />            7                       22                                                                <br />            9                       9                                                                 <br />             <br />   是_对于aa=5的一?Qsum?nbsp;  5-1<=aa<=5+2 的和<br />   对于aa=2来说 Qsum=1+2+2+2+3+4=14     Q?br />   又如 对于aa=9 Q?-1<=aa<=9+2 只有9一个数Q所以sum=9    Q?br />              <br />3Q其它:<br />     <strong style="color: black; background-color: #a0ffff; ">over</strong>Qorder by salary rows between 2 preceding and 4 followingQ?br />          每行对应的数据窗口是之前2行,之后4?nbsp;<br />4Q下面三条语句等效:           <br />     <strong style="color: black; background-color: #a0ffff; ">over</strong>Qorder by salary rows between unbounded preceding and unbounded followingQ?br />          每行对应的数据窗口是从第一行到最后一行,{效Q?br />     <strong style="color: black; background-color: #a0ffff; ">over</strong>Qorder by salary range between unbounded preceding and unbounded followingQ?br />           {效<br />     <strong style="color: black; background-color: #a0ffff; ">over</strong>(partition by null)</font></div></div></span><img src ="http://www.aygfsteel.com/algz/aggbug/365263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-12-01 10:00 <a href="http://www.aygfsteel.com/algz/articles/365263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sql plus操作oracel(windowsq_)基础之简易新手篇 http://www.aygfsteel.com/algz/articles/356201.html紫蝶∏飛揚↗紫蝶∏飛揚↗Wed, 10 Aug 2011 03:29:00 GMThttp://www.aygfsteel.com/algz/articles/356201.htmlhttp://www.aygfsteel.com/algz/comments/356201.htmlhttp://www.aygfsteel.com/algz/articles/356201.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/356201.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/356201.html

?dSQLPLUS时报?如下:
误入用户名:  system
输入口o:
ERROR:
ORA-12560: TNS: 协议适配器错?br />原因:
是ORCAL实例没启?net [start/stop] 服务?.与Linux相反,不在SQLPLUS中启动实?

q_: windows server 2003 Enterprise Editon , oracle 10g(10.02.00.01)

 

  1. q行"开?>E序\Oracle - OraDb10g_home1\配置和移植工?中的"Database Configuration Assistant"Q创Z个数据库?
  2. 创徏成功后,q行"开?>E序\Oracle - OraDb10g_home1\应用E序开?中的"SQL Plus".用户名:sys 密码Q?23456 as sysdba(密码后面要加I格asI格sysdba) L字符Ԍ如果是本机可不填?
  3. 从命令提C符下用sql*plus
    sqlplus/nolog
    conn 用户?密码 as sysdba 出现”已连?#8220;后就是成功了?br />

    
  接下来,我们在SQL*Plus中实战一下,为我们下面将要做的打好基?br />  用system登陆到SQL*Plus后,我们做如下操?q次没有截图Q有详细的说?
-----------如登陆成功此1-3步不必做Q直接做W??---------------
  1. SQL>create user maxuan identified by max; #创徏口o为max的用户maxuan
  2. SQL>grant connect,resource to maxuan; #为用户maxuan授权
  3. SQL>conn maxuan/max; #以用户maxuanq行q接
  4. SQL>create table test(a number); #建立一个名为test的表Q只有字D名为A的一列,数据cd为数?
  5. SQL>insert into test values(1); #插入一条记?
  6. SQL>select * from test; #查询记录Q此时A列的W一行ؓ1
  7. SQL>update test set a=2; #更改记录Q此时A列的W一行已改ؓ2
  8. SQL>commit; #提交.在完成数据库的插入,删除和修Ҏ作时Q只有当事务提交到数据库才算完成?
  9. SQL>delete from test; #删除test表中所有的记录Q此时test表中没有记录
  10. SQL>roll; #回滚到提交前Q此时再查询test表,A列第一行值又回复?
  
  oracle的数据类?/strong>
  在数据库中创建数据表的时候,我们需要定义表中所有字D늚cdQ数据类型大致分为:character,numberic,date,lob和raw{,q些是最基本的数据类型。当然在oracle中也允许自定义数据类型!
  
  在oracle中提供的character数据cd:
  char():固定长度字符Ԍ最大长度ؓ2000字节Q如果不指定长充Q缺省ؓ1个字节长?br />  varchar2():可变长度的字W串Q最大长度ؓ4000字节Q具体定义时指明最大长度,q咱cd可以放数字、字母以及ASCII码字W集(或者EBCDIC{数据库pȝ接受的字W集标准)中的所有符受如果数据长度没有达到最大|oracle会根据数据大自动调节字D长度。是
  
  最长用的数据类型?br />  nchar():Ҏ字符集而定的固定长度字W串Q最大长?000字节?br />  nvarchar2():Ҏ字符集而定的可变长度字W串Q最大长?000字节?br />  long:可变长字W列Q最大长度限制ؓ2GBQ用于不需要作字符串搜索的长串数据。此cd是一个遗留下来的而且来不会被支持的数据cdQ逐渐被BLOBQCLOBQNCLOB{大的数据类型所取代?br />  
  numberic数据cd用来存储负的和正的整敎ͼ分数和Q点型数据Q在oracle中提供的numberic数据cdQ?br />  number(,):可变长的数值列Q允?、正值及负|m是所有的有效数字的位敎ͼn是小数点以后的位数?br />  
  在oracle中提供的date数据cd:
  date:~省格式是dd-mon-yy(??q?
  
  在oracle中提供的lob数据cd:
  blob、clob、nclobQ三U大型对?lob)Q用来保存较大的囑Ş文g或带格式的文本文Ӟ如word文档Q以及音频、视频等非文本文Ӟ最大长充是4GB。晕些数据存储在数据库内部保存?br />  bfile:在数据库外部保存的大型二q制对象文gQ最大长度是4GBQ这U外部的LOBcdQ通过数据库记录变化情况,但是数据的具体保存是在数据库外部q行的?br />  
  在oracle中提供的raw数据cd:
  raw():可变长二q制数据Q具体定义字D|必须指明最大长度,q种格式用来保存较小的图形文件或带格式的文本文gQ它也是一U较老的数据cdQ将被lob数据cd所取代?br />  long raw:可变长二q制数据Q最大长度是2GBQ可以用来保存较大的囑Ş或带格式的文本文Ӟ以及音频、视频等非文本文Ӟq也是一U较老的数据cdQ将被lob数据cd所取代?br />  
  其它的数据类型:
  rowid:q是oracle数据表中的一个伪例,它是数据表中每行数据内在的唯一标识
  integer:整数cd
  
补充知识Q?br />SQL(Structure Query Language)语言是结构化查询语言Q是数据库的核心语言Q是面向集合的描q性非q程化语a。SQL语言共分为四大类Q数据查询语aDQL,数据操纵语言DMLQ数据定义语aDDL,数据库控制语aDCL?br />  
  1.数据查询语言DQL的基本结构是由select子句Qfrom子句Qwhere子句l成的查询块Q?br />  select <字段名表> from <表或视图?gt; where <查询条g>
  
  2.数据操纵语言DML完成在数据库中确定、修攏V添加、删除某一数据值的d(以下是部分常用DML语句):
  insert  增加数据行到?br />  delete  从表中删除数据行
  Update  更改表中数据
  
  3.数据定义语言DDL完成定义数据库的l构Q包括数据库本n、数据表、目录、视囄数据库元?以下是部分常用DDL语句)
  create table  创徏?br />  create index  创徏索引
  create view  创徏视图
  alter table  增加表列Q重定义表列Q更改存储分?br />  drop table  删除?br />  drop index  删除索引
  
  4.数据库控制语aDCL用来授予或回收访问数据库的某U特权,q控制数据库操纵事务发生的时间及效果Q对数据库实行监视等。如Q?br />  grant    权限或角色授予用户或其它角?br />  revoke    回收用户权限
  roll    回滚Q是当某个对话更改了数据库中的数据后Q由于某U原因用户不x交此更改Ӟoracle所采取的保护操作。这是一个把信息恢复到用户update、insert、delete前最后提交的状态?br />  commit    提交。在完成数据库的插入Q删除和修改操作Ӟ只有当事务提交到数据库才完成,有提交前只有操作数据库的本h才能看到Q别人只有在最后提交完成才可以看到?br />
  一?strong>购物|站后台数据?/strong>实例Q?br />  现在我们回到用J2EE体系开发购物网站的主题Q开始实战徏购物|站的后台数据库?br />  Z实现购物|站的基本的功能Q我们需要徏立四个表Q商品列?products)、商品类型表(item)、订单列?orders)和管理员列表(admin)。表l构如下所C:
  
  item表结构(商品cd?
  字段名称  数据cd    允许I  主键/外键  备注  
  type_id  INTEGER(自动~号) 否  主键   商品cdID标记
  type   varchar2(30)   否    商品cd名称
  
  product表结?商品列表)
  字段名称   数据cd   允许I  主键/外键  备注
  product_id INTEGER(自动~号) 否   主键  商品ID标记
  title   varchar2(30)   否     商品名称
  type_id   INTEGER    否   外键  商品cd标记
  info   varchar2(80)   是     商品?br />  price   number(16,2)   否     商品h
  
  orders表结?订单列表)
  字段名称  数据cd    允许I  主键/外键  备注
  order_id  INTEGER(自动~号) 否   主键  订单ID标记
  name   varchar2(20)   否     ֮姓名
  address   varchar2(100)   是     发货地址
  tel   number(16)  是     联系电话
  email   varchar2(30)  否     联系email
  btime   date    是     订购日期
  product_id  INTEGER   否   外键  商品标记
  uword   varchar2(100) 是     ֮留言
  
  admin表结?理员列?
  字段名称  数据cd    允许I  主键/外键  备注
  admin_id  INTEGER(自动~号) 否   主键   理员ID标记
  adminname  varchar2(20)   否     理员名U?br />  password  varchar2(20)   否     理员密?br />  
  设计完表l构后,我们p开始创Z?br />  创徏表我惛_l不是什么难事了Q那么我们要注意的是product、item、ordersq三个表之间的关联,q有自动~号?br />  
  下面是完整的SQL语句Q在后面我会l出详细的说明,你可以在SQL*Plus里对照着输入Q也可以它存ؓSQL脚本文gQ在SQL*Plus或SQLPlus Worksheet里执行。当然也可以把代码直接拷贝到SQL*Plus里执行!
  
  代码Q?br />  rem ///BY MAXUAN 开?//
  create table item(
  type_id integer not null,
  type varchar2(30),
  constraint item_pk primary key(type_id)
  );
  
  create table product(
  product_id integer not null,
  title varchar2(30) not null,
  type_id integer not null,
  info varchar2(80),
  price number(16,2) not null,
  constraint product_pk primary key (product_id),
  constraint product_fk foreign key(type_id) references item(type_id)
  );
  
  create table orders(
  order_id integer not null,
  name varchar2(20) not null,
  address varchar2(100),
  tel number(16),
  email varchar2(30) not null,
  btime date,
  product_id integer not null,
  uword varchar2(100),
  constraint orders_pk primary key(order_id),
  constraint orders_fk foreign key(product_id) references product(product_id)
  );
  
  create table admin(
  admin_id integer not null,
  adminname varchar2(20) not null,
  password varchar2(20) not null,
  constraint admin_pk primary key(admin_id)
  );


]]>spring 什么情况下q行事务回滚(面试?http://www.aygfsteel.com/algz/articles/352796.html紫蝶∏飛揚↗紫蝶∏飛揚↗Wed, 22 Jun 2011 03:53:00 GMThttp://www.aygfsteel.com/algz/articles/352796.htmlhttp://www.aygfsteel.com/algz/comments/352796.htmlhttp://www.aygfsteel.com/algz/articles/352796.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/352796.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/352796.htmlspring事务回滚.默认情况,unchecked异常,卌行时异常runntimeException回滚事务;checked异常,即Exception可try{}捕获的不会回?当然也可配置spring参数让其回滚.

]]>
spring ?jdbcTemplate 快速数据库开?/title><link>http://www.aygfsteel.com/algz/articles/352789.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Wed, 22 Jun 2011 02:16:00 GMT</pubDate><guid>http://www.aygfsteel.com/algz/articles/352789.html</guid><wfw:comment>http://www.aygfsteel.com/algz/comments/352789.html</wfw:comment><comments>http://www.aygfsteel.com/algz/articles/352789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/algz/comments/commentRss/352789.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/algz/services/trackbacks/352789.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> execSQL(String fileName) {<br />        <br />        File myFile </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> File(fileName);<br />        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (</span><span style="color: #000000; ">!</span><span style="color: #000000; ">myFile.exists()) {<br />            System.err.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Can't Find </span><span style="color: #000000; ">"</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; "> fileName);<br />            </span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br />        }<br />        </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {<br />            DriverManagerDataSource dataSource</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> DriverManagerDataSource();<br />            dataSource.setDriverClassName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">org.hsqldb.jdbcDriver</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />            dataSource.setUrl(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">jdbc:hsqldb:hsql://localhost/algz</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />            dataSource.setUsername(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">sa</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />            dataSource.setPassword(</span><span style="color: #000000; ">""</span><span style="color: #000000; ">);<br />            JdbcTemplate jt</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> JdbcTemplate();<br />            jt.setDataSource(dataSource);<br />            <br />                    <br />            BufferedReader in </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> BufferedReader(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> FileReader(myFile));<br />            String sql;<br />            </span><span style="color: #0000FF; ">while</span><span style="color: #000000; "> ((sql </span><span style="color: #000000; ">=</span><span style="color: #000000; "> in.readLine()) </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {<br />                jt.execute(sql);<br />                System.out.print(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">.</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />            }<br />            <br />            in.close();<br />            System.out.println();<br />        } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (IOException e) {<br />            e.getStackTrace();<br />        }<br />    }</span></div><img src ="http://www.aygfsteel.com/algz/aggbug/352789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-06-22 10:16 <a href="http://www.aygfsteel.com/algz/articles/352789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 存储q程基本语法及问?/title><link>http://www.aygfsteel.com/algz/articles/352675.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Mon, 20 Jun 2011 09:12:00 GMT</pubDate><guid>http://www.aygfsteel.com/algz/articles/352675.html</guid><wfw:comment>http://www.aygfsteel.com/algz/comments/352675.html</wfw:comment><comments>http://www.aygfsteel.com/algz/articles/352675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/algz/comments/commentRss/352675.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/algz/services/trackbacks/352675.html</trackback:ping><description><![CDATA[<div><div>存储q程</div><div>?: </div><div>(1)在procedure中想用ddlQ就必须用execute   immediat 'create table text1(id int not null primary key)';</div><div>且必L授权(grant create any table to 用户?,否则?insufficient privileges',无权?</div><div>(2)每条语句都需?;'l尾.</div><div></div><div>1.基本语法 : 创徏一个存储过E?如果存在p?  (?as/is没区?只是兼容别的SQL而已)</div><div>create or replace procedure  q程?参数1 in number ,参数2 in number) is</div><div>变量1 integer:=0;</div><div>变量2 date;</div><div>exp   exception;  --定义异常</div><div>begin</div><div>    --存储q程中调用DDL,必须用动态SQLҎ</div><div>    execute  immediate ' create table testtable (testid int not null primary key,testname varchar2(10) ) ';</div><div>    execute   immediate   'insert   into   testtable values(1,110) '; </div><div></div><div>   raise   exp;    --抛出异常</div><div>exception        --异常处理</div><div>    when   exp   then </div><div>    dbms_output.put_line( '执行成功1 ');    --控制台打?/div><div>    when   others   then </div><div>    dbms_output.put_line( '执行p|0 '); </div><div></div><div>end;</div><div></div><div>2.基本语句:</div><div>(1)变量赋?/div><div><1>变量初始化赋?=?</div><div><2>变量赋? select ....into... from ....;     --select ... from ... Ҏ在存储过E中时的格式</div><div>select name1,name2 into var1,var2 from table1 </div><div></div><div>(2)For 循环</div><div>For ... in ... LOOP</div><div>--执行语句</div><div>end LOOP;</div><div></div><div><1>循环遍历游标</div><div>create or replace procedure test() as</div><div>    Cursor cursor is select name from student; name varchar(20);</div><div>begin</div><div>    for name in cursor LOOP</div><div>    begin</div><div>        dbms_output.putline(name); </div><div>    end;</div><div>    end LOOP;</div><div>end test;</div><div></div><div><2>循环遍历数组</div><div> create or replace procedure test(varArray in myPackage.TestArray) as</div><div>--(输入参数varArray 是自定义的数l类型,定义方式见标?)</div><div>i number;</div><div>begin</div><div>i := 1;  --存储q程数组是v始位|是?开始的Q与java、C、C++{语a不同。因为在Oracle中本是没有数l?/div><div></div><div>的概늚Q数l其实就是一?/div><div>--?Table),每个数组元素是表中的一个记录,所以遍历数l时q当于从表中的W一条记录开始遍?/div><div>for i in 1..varArray.count LOOP     </div><div>dbms_output.putline(&apos;The No.&apos;|| i || &apos;record in varArray is:&apos;||varArray(i));   </div><div> end LOOP;</div><div>end test;</div><div></div><div>3.代码抛出异常用raise (异常?;</div><div></div><div>4.游标 : </div><div>(1)pȝU游?cursor SYS_REFCURSOR;只能通过openҎ打开和赋?/div><div>OPEN cursor FOR select name1,name2 from table1 where a='1';  --sql语法</div><div>LOOP</div><div>    FETCH cursor INTO name1,name2;    --只能通过fetch into 打开和遍?/div><div>    exit when cursor%NOTFOUND;         --可用三个状?%NOTFOUND(未找到记?;%FOUND(扑ֈ?/div><div></div><div>?;%ROWCOUNT(当前游标指向的行位置)</div><div></div><div>     dbms_output.putline(name1||name2);</div><div>END LOOP;</div><div></div><div>5.q接q算W?: || ,?ABC'||'123' : ABC123</div><div></div><div>6.单行注释: --;多行:/**/;</div></div><img src ="http://www.aygfsteel.com/algz/aggbug/352675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-06-20 17:12 <a href="http://www.aygfsteel.com/algz/articles/352675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql 解决中文qhttp://www.aygfsteel.com/algz/articles/351345.html紫蝶∏飛揚↗紫蝶∏飛揚↗Mon, 30 May 2011 08:15:00 GMThttp://www.aygfsteel.com/algz/articles/351345.htmlhttp://www.aygfsteel.com/algz/comments/351345.htmlhttp://www.aygfsteel.com/algz/articles/351345.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/351345.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/351345.html一看就明了.与数据库的连接采用UTF-8.

]]>
[转]sql的left join 命o详解http://www.aygfsteel.com/algz/articles/228220.html紫蝶∏飛揚↗紫蝶∏飛揚↗Wed, 10 Sep 2008 13:58:00 GMThttp://www.aygfsteel.com/algz/articles/228220.htmlhttp://www.aygfsteel.com/algz/comments/228220.htmlhttp://www.aygfsteel.com/algz/articles/228220.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/228220.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/228220.html 例表a
aid adate
1 a1
2 a2
3 a3
表b
bid bdate
1 b1
2 b2
4 b4
两个表a,b相连?要取出id相同的字D?
select * from a inner join b on a.aid = b.bidq是仅取出匹配的数据.
此时的取出的?
1 a1 b1
2 a2 b2
那么left join ?
select * from a left join b on a.aid = b.bid
首先取出a表中所有数?然后再加上与a,b匚w的的数据
此时的取出的?
1 a1 b1
2 a2 b2
3 a3 I字W?
同样的也有right join
指的是首先取出b表中所有数?然后再加上与a,b匚w的的数据
此时的取出的?
1 a1 b1
2 a2 b2
4 I字W?b4

LEFT JOIN ?LEFT OUTER JOIN?
左向外联接的l果集包?LEFT OUTER 子句中指定的左表的所有行Q而不仅仅是联接列所匚w的行。如果左表的某行在右表中没有匚w行,则在相关联的l果集行中右表的所有选择列表列均为空倹{?br />
                   ------------http://www.phpweblog.net/zwws/archive/2007/02/23/944.html


]]>
[转]SQL中的left outer join,inner join,right outer join用法http://www.aygfsteel.com/algz/articles/228219.html紫蝶∏飛揚↗紫蝶∏飛揚↗Wed, 10 Sep 2008 13:55:00 GMThttp://www.aygfsteel.com/algz/articles/228219.htmlhttp://www.aygfsteel.com/algz/comments/228219.htmlhttp://www.aygfsteel.com/algz/articles/228219.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/228219.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/228219.html 1 关系代数
合ƈ数据集合的理论基是关pM敎ͼ它是由E.F.Codd?970q提出的?br /> 在关pM数的形式化语a中:
?          用表、或者数据集合表C关pL者实体?br /> ?          用行表示元组?br /> ?          用列表示属性?br /> 关系代数包含以下8个关p运符
?          选取――返回满x定条件的行?br /> ?          投媄――从数据集合中返回指定的列?br /> ?          W卡积――是关系的乘法,它将分别来自两个数据集合中的行以所有可能的方式q行l合?br /> ?          q――关pȝ加法和减法,它可以在行的方向上合q两个表中的数据Q就像把一个表垒在另一个表之上一栗?br /> ?          交――返回两个数据集合所共有的行?br /> ?          差――返回只属于一个数据集合的行?br /> ?          q接――在水^方向上合q两个表Q其Ҏ是:两个表中在共同数据上怺匚w的那些行合ƈh?br /> ?          除――返回两个数据集之间的精匹配?br /> 此外Q作ZU实现现代关pM数运的ҎQSQLq提供了Q?br /> ?          子查询――类gq接Q但更灵z;在外部查询中Q方式可以用表辑ּ、列表或者数据集合的地方都可以用子查询的结果?br /> 本章主要讲q多U类型的q接、简单的和相关的子查询、几U类型的q、关p除以及其他的内宏V?br /> 2 使用q接
2.1 q接cd
在关pMCQ连接运是׃个笛卡尔U运和一个选取q算构成的。首先用W卡积完成对两个数据集合的乘运,然后对生成的l果集合q行选取q算Q确? 只把分别来自两个数据集合q且h重叠部分的行合ƈ在一赗连接的全部意义在于在水qx向上合ƈ两个数据集合Q通常是表Q,q生一个新的结果集合,其方 法是一个数据源中的行于另一个数据源中和它匹配的行组合成一个新元组?br /> SQL提供了多U类型的q接方式Q它们之间的区别在于Q从怺交叠的不同数据集合中选择用于q接的行时所采用的方法不同?br /> q接cd          定义
内连?nbsp;         只连接匹配的?br /> 左外q接          包含左边表的全部行(不管双的表中是否存在与它们匚w的行Q,以及双表中全部匚w的行
叛_q接          包含双表的全部行(不管左边的表中是否存在与它们匚w的行Q,以及左边表中全部匚w的行
全外q接          包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行?br /> (H)(theta)q接          使用{g外的条g来匹配左、右两个表中的行
交叉q接          生成W卡积Q它不用Q何匹配或者选取条gQ而是直接一个数据源中的每个行与另一个数据源的每个行都一一匚w
在INFORMIX中连接表的查?br /> 如果FROM子句指定了多于一个表引用Q则查询会连接来自多个表的行。连接条件指定各列之_每个表至一列)q行q接的关pR因为正在比较连接条件中的列Q所以它们必d有一致的数据cd?br /> SELECT语句的FROM子句可以指定以下几种cd的连?br /> FROM子句关键?nbsp;         相应的结果集
CROSS JOIN          W卡乘U(所有可能的行对Q?br /> INNER JOIN          仅对满q接条g的CROSS中的?br /> LEFT OUTER JOIN          一个表满条g的行Q和另一个表的所有行
RIGHT OUTER JOIN          ?strong style="color: black; background-color: #ffff66;">LEFT
相同Q但两个表的角色互换
FULL OUTER JOIN        LEFT OUTER ?RIGHT OUTER中所有行的超?br />
2.2 内连接(Inner JoinQ?br /> 内连接是最常见的一U连接,它页被称为普通连接,而E.FCodd最早称之ؓ自然q接?br /> 下面是ANSI SQLQ?2标准
select *
from    t_institution i
inner join t_teller t
on i.inst_no = t.inst_no
where i.inst_no = "5801"
其中inner可以省略?br /> {h于早期的q接语法
select *
from t_institution i, t_teller t
where i.inst_no = t.inst_no
and i.inst_no = "5801"

2.3 外连?br /> 2.3.1          左外q接(Left Outer Jion)
select *
from    t_institution i
left outer join t_teller t
on i.inst_no = t.inst_no
其中outer可以省略?br /> 2.3.2          叛_q接(Rigt Outer Jion)
select *
from    t_institution i
right outer join t_teller t
on i.inst_no = t.inst_no
2.3.3          全外q接(Full Outer)
全外q接q回参与q接的两个数据集合中的全部数据,无论它们是否h与之相匹配的行。在功能上,它等价于对这两个数据集合分别q行左外q接和右外连接,然后再用消去重复行的ƈ操作上qC个结果集合ƈZ个结果集?br /> 在现实生zMQ参照完整性约束可以减对于全外连接的使用Q一般情况下左外q接p够了。在数据库中没有利用清晰、规范的U束来防范错误数据情况下Q全外连接就变得非常有用了,你可以用它来清理数据库中的数据?br /> select *
from    t_institution i
full outer join t_teller t
on i.inst_no = t.inst_no
2.3.4          外连接与条g配合使用
当在内连接查询中加入条g是,无论是将它加入到join子句Q还是加入到where子句Q其效果是完全一LQ但对于外连接情况就不同了。当把条件加入到join? 句时QSQL Server、Informix会返回外q接表的全部行,然后使用指定的条件返回第二个表的行。如果将条g攑ֈwhere子句中,SQL Server会首先q行q接操作Q然后用where子句对连接后的行q行{选。下面的两个查询展示了条件放|位子对执行l果的媄响:
条g?strong style="color: black; background-color: #99ff99;">join子句
select *
from    t_institution i
left outer join t_teller t
on i.inst_no = t.inst_no
and i.inst_no = “5801”
l果是:
inst_no      inst_name              inst_no      teller_no    teller_name
5801         天河?nbsp;                5801         0001         tom
5801         天河?nbsp;                5801         0002         david
5802         秀?br /> 5803         白云?br /> 条g在where子句
select *
from    t_institution i
left outer join t_teller t
on i.inst_no = t.inst_no
where i.inst_no = “5801”
l果是:
inst_no      inst_name              inst_no      teller_no    teller_name
5801         天河?nbsp;                5801         0001         tom
5801         天河?nbsp;                5801         0002         david

2.4 自nq接
自nq接是指同一个表自己与自p行连接。这U一元连接通常用于从自反关p(也称作递归关系Q中抽取数据。例如h力资源数据库中雇员与老板的关pR?br /> 下面例子是在机构表中查找本机构和上机构的信息?br /> select s.inst_no superior_inst, s.inst_name sup_inst_name, i.inst_no, i.inst_name
from t_institution i
join t_institution s
on i.superior_inst = s.inst_no

l果是:
superior_inst sup_inst_name          inst_no      inst_name
800             q州?nbsp;                5801         天河?br /> 800             q州?nbsp;                5802         秀?br /> 800             q州?nbsp;                5803         白云?br />
2.5 交叉(无限? q接
交叉q接用于对两个源表进行纯关系代数的乘q算。它不用连接条件来限制l果集合Q而是分别来自两个数据源中的行以所有可能的方式q行l合。数据集合中 一的每个行都要与数据集合二中的每一个行分别l成一个新的行。例如,如果W一个数据源中有5个行Q而第二个数据源中?个行Q那么在它们之间q行交叉q接 ׃产生20个行。h们将q种cd的结果集UCؓW卡乘U?br /> 大多C叉连接都是由于错误操作而造成的;但是它们却非帔R合向数据库中填充例子数据,或者预先创Z些空行以便ؓE序执行期间所要填充的数据保留I间?br /> select *
from    t_institution i
cross join t_teller t
在交叉连接中没有on条g子句

       -----http://hi.baidu.com/llscompazz/blog/item/dc5e23d9ce2b62eb39012fb4.html


]]>[转]SQL中的各种JOINQinner join,full outer join,left join,right join,cross join Q?/title><link>http://www.aygfsteel.com/algz/articles/228218.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Wed, 10 Sep 2008 13:53:00 GMT</pubDate><guid>http://www.aygfsteel.com/algz/articles/228218.html</guid><wfw:comment>http://www.aygfsteel.com/algz/comments/228218.html</wfw:comment><comments>http://www.aygfsteel.com/algz/articles/228218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/algz/comments/commentRss/228218.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/algz/services/trackbacks/228218.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt; color: #868374;"> <p style="margin: 0cm 0cm 0pt; line-height: 150%; text-align: left;" align="left"><font color="#000000"><strong><span style="font-size: 12pt; line-height: 150%;">SQL</span></strong><strong><span style="font-size: 12pt; line-height: 150%;">中的各种JOIN</span></strong><strong><span style="font-size: 12pt; line-height: 150%;">Q?span>inner join,full outer join,left join,right join,cross join </span>Q?/span></strong></font></p> <p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><font color="#000000" size="3">SQL</font><font color="#000000" size="3">中的q接可以分ؓ内连接,外连接,以及交叉q接 <span>(xW卡积</span></font><font size="3"><font color="#000000">) <br /> <br /> a. 交叉q接</font></font><font size="3"><font color="#000000"><span>CROSS JOIN<br /> </span>如果不带WHERE条g子句Q它会q回被连接的两个表的W卡积Q返回结果的行数{于两个表行数的乘积Q?/font></font><br /> <br /> <font color="#000000" size="3">举例,下列A、B?span>C </span>执行l果相同Q但是效率不一P</font><span><br /> <font size="3"><font color="#000000">A:SELECT * FROM table1 CROSS JOIN table2<br /> B:SELECT * FROM table1,table2</font></font></span></p> </span> <p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><font size="3"><font color="#000000">C:<span>select * from table1 a inner join table2 b</span></font></font></p> <p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><span><br /> <font color="#000000" size="3">A:select a.*,b.* from table1 a,table2 b where a.id=b.id<br /> B:select * from table1 a cross join table2 b where a.id=b.id (</font></span><span><font size="3"><font color="#000000">注:<span>cross join</span>后加条g只能用where,不能用on)</font></font></span><br /> <font color="#000000" size="3">C:</font><font size="3"><font color="#000000"><span>select * from table1 a inner join table2 b on a.id=b.id</span></font></font></p> <p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><br /> <font color="#000000" size="3">一般不使用Ҏ<span>A和BQ因为如果有WHERE子句的话Q往往会先生成两个表行CU的行的数据表然后才ҎWHERE条g从中选择?/span></font><font size="3"><font color="#000000"><span> <br /> </span>因此Q如果两个需要求交际的表太大Q将会非帔R常慢Q不使用?/font></font><br /> <br /> <font color="#000000" size="3">b. </font><font color="#000000" size="3">内连?/font><font size="3"><font color="#000000"><span>INNER JOIN<br /> </span>两边表同时符合条件的l合</font></font></p> <p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><span><font color="#000000" size="3">如果仅仅使用</font><span><br /> <font size="3"><font color="#000000">SELECT * FROM table1 INNER JOIN table2</font></font></span></span></p> <p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><font color="#000000" size="3">内连接如果没有指定连接条件的话,和笛卡尔U的交叉q接l果一P但是不同于笛卡尔U的地方是,没有W卡积那么复杂要先生成行数乘积的数据表Q内q接的效率要高于W卡积的交叉连接?/font><span><br /> <br /> <font size="3"><font color="#000000">但是通常情况下,使用<span>INNER JOIN</span>需要指定连接条件?/font></font></span></p> <p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><font size="3"><font color="#000000">***************关于{D接和自然q接</font></font></p> <p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><font size="3"><font color="#000000">{D?span>(=号应用于q接条g<span>, </span>不会去除重复的列)</span></font></font></p> <p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><font size="3"><font color="#000000">自然q接(会去除重复的?</font></font></p> <p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><font color="#000000" size="3">数据库的q接q算都是自然q接Q因Z允许有重复的行(元组Q存在?/font><br /> <font size="3"><font color="#000000">例如Q?/font></font></p> <p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><span><font color="#000000" size="3">SELECT * FROM table1 AS a INNER JOIN table2 AS b on a.column=b.column<br /> <br /> c. </font></span><span><font color="#000000" size="3">外连?/font><font size="3"><font color="#000000"><span>OUTER JOIN<br /> </span>指定条g的内q接Q仅仅返回符合连接条件的条目?/font></font><br /> <font color="#000000" size="3">外连接则不同Q返回的l果不仅包含W合q接条g的行Q而且包括左表(左外q接?span>), </span>双(双接时)或者两边连?全外q接?的所有数据行?/font><br /> <br /> <font color="#000000" size="3">1)</font><font color="#000000" size="3">左外q接</font><font size="3"><font color="#000000"><span>LEFT [OUTER] JOIN <br /> </span>昄W合条g的数据行Q同时显C左Ҏ据表不符合条件的数据行,双没有对应的条目显C?/font></font><font size="3"><font color="#000000">NULL<br /> 例如</font></font><span><br /> <font color="#000000" size="3">SELECT * FROM table1 AS a LEFT [OUTER] JOIN ON a.column=b.column<br /> 2)</font></span><font color="#000000" size="3">叛_q接</font><font size="3"><font color="#000000"><span>RIGHT [OUTER] JOIN<br /> </span>昄W合条g的数据行Q同时显C右Ҏ据表不符合条件的数据行,左边没有对应的条目显C?/font></font><font size="3"><font color="#000000">NULL<br /> 例如</font></font><span><br /> <font color="#000000" size="3">SELECT * FROM table1 AS a RIGHT [OUTER] JOIN ON a.column=b.column<br /> 3)</font></span><font color="#000000" size="3">全外q接</font><font size="3"><font color="#000000"><span>full [outer] join<br /> </span>昄W合条g的数据行Q同时显C左右不W合条g的数据行Q相应的左右两边昄NULLQ即昄左连接、右q接和内q接的ƈ?/font></font></span></p>                            ------http://hi.baidu.com/magickerr/blog/item/393c0a01aa13290b7aec2c63.html <img src ="http://www.aygfsteel.com/algz/aggbug/228218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-09-10 21:53 <a href="http://www.aygfsteel.com/algz/articles/228218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 外键兌的问题解x?/title><link>http://www.aygfsteel.com/algz/articles/197804.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Fri, 02 May 2008 14:55:00 GMT</pubDate><guid>http://www.aygfsteel.com/algz/articles/197804.html</guid><wfw:comment>http://www.aygfsteel.com/algz/comments/197804.html</wfw:comment><comments>http://www.aygfsteel.com/algz/articles/197804.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/algz/comments/commentRss/197804.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/algz/services/trackbacks/197804.html</trackback:ping><description><![CDATA[一.h外键的表?  HQL查询---"from Ac?报错.<br /> 解决Ҏ:  不能模糊查询,需指定查询的属?  ?  "select 别名.属?from Ac?as 别名".<br /> (?有时候问题就是那么的奇?如遇Cq问?可以试试q个Ҏ.MYSQL6.0好像没这问题;5.0好像?)<br /> <br /> ?A表的外键定义B表的非主?  HQL查询q回l果为空值或报空指针错误或类型{换失?<br /> 解决Ҏ:  因ؓHibernate 默认外键的关联是主键,  所以需加上<many-to-one  property-ref="兌cȝ属? ......> <br /> 兌c?HBM.XML---        <br />        <set name="as" inverse="true"><br />             <key property-ref="content"><br />              <column name="bc" length="45" not-null="true" /><br />             </key><br />             <one-to-many class="com.a.A" /><br />         </set> <img src ="http://www.aygfsteel.com/algz/aggbug/197804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-05-02 22:55 <a href="http://www.aygfsteel.com/algz/articles/197804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>主表的键是从表的外键,外键的?http://www.aygfsteel.com/algz/articles/191218.html紫蝶∏飛揚↗紫蝶∏飛揚↗Mon, 07 Apr 2008 04:05:00 GMThttp://www.aygfsteel.com/algz/articles/191218.htmlhttp://www.aygfsteel.com/algz/comments/191218.htmlhttp://www.aygfsteel.com/algz/articles/191218.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/191218.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/191218.html 从表:  N?
主表的键删除,从表与之对应的外键也删除.
从表的外键删?主表无反?
ON DELETE/UPDATE CASCADE,在外键定义时加上.

以下内容摘自:http://www.jianglb.com/2007/09/02/mysql-foreign-key.html

外键的作用:

保持数据一致性,完整性,主要目的是控制存储在外键表中的数据?使两张表形成兌Q外键只能引用外表中的列的|
例如Q?br /> a b 两个?br /> a表中存有 客户P客户名称
b表中存有 每个客户的订?br /> 有了外键?br /> 你只能在信b 表中没有客户x的订单后Q才可以在a表中删除客户x

建立外键的前提: 本表的列必须与外键类型相?外键必须是外表主??

指定主键关键字: foreign key(列名)

引用外键关键字: references <外键表名>(外键列名)

事g触发限制: on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(讄|,set DefaultQ设默认|,[默认]no action

例如Q?

outTable?主键 id cd int

创徏含有外键的表Q?br /> create table temp(
id int,
name char(20),
foreign key(id) references outTable(id) on delete cascade on update cascade);

说明Q把id?设ؓ外键 参照外表outTable的id?当外键的值删?本表中对应的列筛?当外键的值改?本表中对应的列值改变?



]]>
[转]在MySQL中利用外键实现联删除!http://www.aygfsteel.com/algz/articles/191215.html紫蝶∏飛揚↗紫蝶∏飛揚↗Mon, 07 Apr 2008 04:00:00 GMThttp://www.aygfsteel.com/algz/articles/191215.htmlhttp://www.aygfsteel.com/algz/comments/191215.htmlhttp://www.aygfsteel.com/algz/articles/191215.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/191215.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/191215.html
下面Q我们先创徏以下试用数据库表:


CREATE TABLE `roottb` (
  `id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,
  `data` VARCHAR(100) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) TYPE=InnoDB;

CREATE TABLE `subtb` (
  `id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,
  `rootid` INT(11) UNSIGNED NOT NULL DEFAULT '0',
  `data` VARCHAR(100) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  INDEX (`rootid`),
  FOREIGN KEY (`rootid`) REFERENCES roottb(`id`) ON DELETE CASCADE
) TYPE=InnoDB;


注意Q?
1、必M用InnoDB引擎Q?
2、外键必d立烦引(INDEXQ;
3、外键绑定关p这里用了“ ON DELETE CASCADE”Q意思是如果外键对应数据被删除,关联数据完全删除,更多信息请参考MySQL手册中关于InnoDB的文档;

好,接着我们再来插入试数据Q?


INSERT INTO `roottb` (`id`,`data`)
  VALUES ('1', 'test root line 1'),
         ('2', 'test root line 2'),
         ('3', 'test root line 3');

INSERT INTO `subtb` (`id`,`rootid`,`data`)
  VALUES ('1', '1', 'test sub line 1 for root 1'),
         ('2', '1', 'test sub line 2 for root 1'),
         ('3', '1', 'test sub line 3 for root 1'),
         ('4', '2', 'test sub line 1 for root 2'),
         ('5', '2', 'test sub line 2 for root 2'),
         ('6', '2', 'test sub line 3 for root 2'),
         ('7', '3', 'test sub line 1 for root 3'),
         ('8', '3', 'test sub line 2 for root 3'),
         ('9', '3', 'test sub line 3 for root 3');
  

我们先看一下当前数据表的状态:


mysql>; show tables;
+----------------+
| Tables_in_test |
+----------------+
| roottb         |
| subtb          |
+----------------+
2 rows in set (0.00 sec)

mysql>; select * from `roottb`;
+----+------------------+
| id | data             |
+----+------------------+
|  1 | test root line 1 |
|  2 | test root line 2 |
|  3 | test root line 3 |
+----+------------------+
3 rows in set (0.05 sec)

mysql>; select * from `subtb`;
+----+--------+----------------------------+
| id | rootid | data                       |
+----+--------+----------------------------+
|  1 |      1 | test sub line 1 for root 1 |
|  2 |      1 | test sub line 2 for root 1 |
|  3 |      1 | test sub line 3 for root 1 |
|  4 |      2 | test sub line 1 for root 2 |
|  5 |      2 | test sub line 2 for root 2 |
|  6 |      2 | test sub line 3 for root 2 |
|  7 |      3 | test sub line 1 for root 3 |
|  8 |      3 | test sub line 2 for root 3 |
|  9 |      3 | test sub line 3 for root 3 |
+----+--------+----------------------------+
9 rows in set (0.01 sec)


嗯,一切都正常Q好Q下面我们要试验我们的联删除功能了?

我们只删除roottb表中id?的数据记录,看看subtb表中rootid?的相兛_U录是否会自动删除:


mysql>; delete from `roottb` where `id`='2';
Query OK, 1 row affected (0.03 sec)

mysql>; select * from `roottb`;
+----+------------------+
| id | data             |
+----+------------------+
|  1 | test root line 1 |
|  3 | test root line 3 |
+----+------------------+
2 rows in set (0.00 sec)

mysql>; select * from `subtb`;
+----+--------+----------------------------+
| id | rootid | data                       |
+----+--------+----------------------------+
|  1 |      1 | test sub line 1 for root 1 |
|  2 |      1 | test sub line 2 for root 1 |
|  3 |      1 | test sub line 3 for root 1 |
|  7 |      3 | test sub line 1 for root 3 |
|  8 |      3 | test sub line 2 for root 3 |
|  9 |      3 | test sub line 3 for root 3 |
+----+--------+----------------------------+
6 rows in set (0.01 sec)


嗯,看subtb表中对应数据实自动删除了,试成功?

l论Q在MySQL中利用外键实现联删除成功!

                                                                    -----------转帖:http://www.chinaunix.net/jh/17/462977.html

]]>
վ֩ģ壺 ľ| | | | | | | | | ʳ| | ˰| | | ʯɽ| | ֣| ֽ| | | | | | Զ| ʯ| | ͭϿ| | | | | | ͩ®| ˳| | | | º| ī񹤿| | ʶ|