断点

每天进步一点点!
posts - 174, comments - 56, trackbacks - 0, articles - 21

视图:一个虚表,也是一个子查询,是存储在数据字典里的一条select语句。
视图:基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改,视图基于的表称为基表。


视图的优点:
1、对数据库的访问,可以有选择性的选取数据库里的一部分信息,整张表的信息不对外开放。2.用户通过简单的查询可以从复杂查询中得到结果。
视图的缺点:
如果一个表的结构改了,相应的视图如果用到了该表的字段,也要进行修改,增加维护工作量


简单视图:只从单表里获取数据,不包含函数和数据组,可以实现DML操作。
复杂视图:从多表获取数据,包含函数和数据组,不可以DML操作。

视图的创建:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]

其中:
OR REPLACE:若所创建的试图已经存在,ORACLE自动重建该视图;
FORCE:不管基表是否存在ORACLE都会自动创建该视图;
NOFORCE:只有基表都存在ORACLE才会创建该视图:
alias:为视图产生的列定义的别名;
subquery:一条完整的SELECT语句,可以在该语句中定义别名;
WITH CHECK OPTION :插入或修改的数据行必须满足视图定义的约束;
WITH READ ONLY :该视图上不能进行任何DML操作。


例如:
       CREATE OR REPLACE VIEW dept_sum_vw
               (name,minsal,maxsal,avgsal)
       AS SELECT d.dname,min(e.sal),max(e.sal),avg(e.sal)
       FROM    emp e,dept d
       WHERE e.deptno=d.deptno
       GROUP BY d.dname;
查询视图:select * from user_views;
修改视图:通过OR REPLACE 重新创建同名视图即可。
删除视图:DROP VIEW VIEW_NAME;

视图的定义原则:
1.视图的查询可以使用复杂的SELECT语法,包括连接/分组查询和子查询;
2.在没有WITH CHECK OPTION和 READ ONLY 的情况下,查询中不能使用ORDER BY 子句;
3.如果没有为CHECK OPTION约束命名,系统会自动为之命名,形式为SYS_Cn;
4.OR REPLACE选项可以不删除原视图便可更改其定义并重建,或重新授予对象权限。

视图上的DML操作,应遵循的原则:
1.简单视图可以执行DML操作;
2.在视图包含GROUP 函数,GROUP BY子句,DISTINCT关键字时不能删除数据行;
3.在视图不出现下列情况时可通过视图修改基表数据或插入数据:
   a.视图中包含GROUP 函数,GROUP BY子句,DISTINCT关键字;
   b.使用表达式定义的列;
   c .ROWNUM伪列。
  d.基表中未在视图中选择的其他列定义为非空且无默认值。


WITH CHECK OPTION 子句限定:
通过视图执行的INSERTS和UPDATES操作不能创建该视图检索不到的数据行,因为它会对插入或修改的数据行执行完整性约束和数据有效性检查。
例如:
           CREATE OR REPLACE VIEW vw_emp20
           AS SELECT * FROM emp
           WHERE deptno=20
           WITH CHECK OPTION constraint vw_emp20_ck;
          视图 已建立。
            查询结果:
           SELECT empno,ename,job FROM vw_emp20;
          EMPNO                ENAME                JOB
---------------------           --------------          -------------
              7369                 SMITH                CLERK
              7566                 JONES               MANAGER
              7902                 FORD                ANALYST
          修改:
                UPDATE vw_emp20
                SET        deptno=20
                WHERE   empno=7902;
           将产生错误:
               UPDATE vw_emp20
                              *
               ERROR 位于第一行:
               ORA-01402:视图WITH CHECK OPTION 违反WHERE 子句

posted @ 2010-07-17 11:03 断点 阅读(220) | 评论 (0)编辑 收藏

索引:--像字典里面的索引。

表建立索引后在插入数据时,一要把数据写入表里,二要把该数据记入索引里面,因此查询效率高、但插入效率低。

create index idx_stu_email on stu(email,class);  --组合索引,查询效率高。
drop index idx_stu_email;
select * from user_indexes; -- 查询索引

posted @ 2010-07-17 10:54 断点 阅读(198) | 评论 (0)编辑 收藏

Oracle的数据库对象分为五种:表,视图,序列,索引和同义词。

select * from  user_tables  -- 当前用户下有多少张表
select * from  user_views  -- 当前用户下有多少张视图
select * from user_sequences; --查询序列
select * from user_indexes; -- 查询索引

select * from  user_constraints  -- 当前用户下有多少约束
select * from  dictionary  --数据字典表的表

posted @ 2010-07-17 10:52 断点 阅读(198) | 评论 (0)编辑 收藏

DDL(data definition language):DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。

数据类型:VARCHAR2(50)最大4K(4096字节)、CHAR(1)最大2k、NUMBER(10,6)、NUMBER(6)、DATE、
LONG 变长字符串,最大长度达2G。

 

约束条件有5个:非空、唯一、主键、外键、check。

create table stu
(
id number(6), --primary key
name varchar2(20) constraint stu_name_nn not null, --stu_name_nn别名
sex number(1),
age number(3),
sdate date,
grade number(2) default 1,
class number(4), --references class(id)
email varchar2(50),
--email varchar2(50) unique  --字段级约束,不能有重复值
constraint stu_name_email_uni unique(name,email), --表级约束
constraint stu_id_pk primary key(id),        --表级约束
constraint stu_class_fk foreign key(class) references class(id) --被参考字段必须是主键
);

create table class
(
id number(4) primary key,
name varchar2(20) not null
)


alter table stu add(addr varchar2(100)); --对已存在的表新增字段
alter table stu modify(addr varchar2(150)); --对字段修改
alter table stu drop (addr); --删除一个字段
alter table stu drop constraint stu_class_fk;
delete from class;
drop table class;

posted @ 2010-07-17 09:43 断点 阅读(228) | 评论 (0)编辑 收藏

SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。

DML(data manipulation language):它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言。

conn sys/sys as sysdba;
drop user pcisv6 cascade;
exp --备份scott用户下的表
--创建用户,identified为认证相当是密码,quota配额就是分配空间。
create user pcisv6 identified by 11 default tablespace core6 quota 10M on corev6
grant create session,create table,create view to pcisv6;   --授权,session是用于登录的
imp --导入scott用户下的表

SELECT:
select rownum r,ename from emp;    --rownum行数,目前只能使用<、<=, 而没有直接>、=的写法。
select ename, sal     --求薪水最高的前5人
 from (select ename, sal from emp order by sal desc)
 where rownum <= 5;

--求薪水最高的前6到10人
select ename,sal,rownum r from emp order by sal desc; --r 排序混乱
select ename,sal,rownum r from (select ename,sal from emp order by sal desc); --此时r序号按新表排序
select ename, sal    -- 此处为结果
  from (select ename, sal, rownum r
          from (select ename, sal from emp order by sal desc))
 where r >= 6
   and r <= 10;


INSERT:
insert into dept values(50,'game','bj');    --整条记录
rollback;
create table dept2 as selet * from emp; --创建dept2表
insert into dept2(deptno,dname) values(60,'game2');    --有选择的字段插入
insert into dept2 select * from dept;    --插入一个表, 2个表结构一样


UPDATE:
update emp2 set sal=sal*12,ename=ename||'-' where deptno=10;

DELETE:
delete from dept2 where deptno<25;
rollback;

TRANSACTION:
transaction 起始一条dml语句,在commit、rollback时完成。
transaction 在执行dml后,在其后有执行了ddl、dcl时,事务自动提交。
在正常退出exit时,事务自动提交。
在非正常退出时,事务回滚。

------------------------------------------------------------
例子:
有3个表S,C,SC
S(SNO,SNAME)代表(学号,姓名)
C(CNO,CNAME,CTEACHER)代表(课号,课名,教师)
SC(SNO,CNO,SCGRADE)代表(学号,课号成绩)
问题:
1,找出没选过“黎明”老师的所有学生姓名。
2,列出2门以上(含2门)不及格学生姓名及平均成绩。
3,即学过1号课程有学过2号课所有学生的姓名。
请用标准SQL语言写出答案,方言也行(请说明是使用什么方言)。

1.
select sname froms
  join sc on (s.sno = sc.sno)
  join c(c.cno = sc.cno)
 where c.cteacher <> 'liming';
2.
select sname
 where sno in (select sno
                 from sc
                where scgrade < 60
                group by sno
               having count(*) >= 2);
3.
select sname
 where sno in (select sno
                 from sc
                where cno = 1
                  and sno in (select sno from sc where cno = 2));


posted @ 2010-07-11 15:43 断点 阅读(232) | 评论 (0)编辑 收藏

错误原因:在Oracle新建了一个表,名为“QueryHistory",用来保存用户的查询记录,这时,再用"Select * from QueryHistory"来查询,报 "ORA-00942: 表或视图不存在 "。

错误分析:利用Google搜索找到了原因,
 oracle是大小写敏感的,如果定义表名称或列名称的时候没有用引号引起来的话 oracle会把他们全部转换为大写,这时就会出现错误了。

解决方法:将语句改为"Select * from "QueryHistory" 或是语句全部大写。

posted @ 2010-07-10 17:36 断点 阅读(632) | 评论 (0)编辑 收藏

PCIS[2010-07-08 18:08:02,531]>>ERROR>> [BizControllerImpl异常堆栈{事务ID/用户代码}:[1278583679437325]/[00000210]:com.fwk.service.BusinessServiceException: com.fwk.dao.DaoException: 保存保单,saveOrUpdatePolicy()时出错; nested exception is org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
 at com.pcis.policy.dm.PolicyDAO.saveOrUpdatePolicy(PolicyDAO.java:193)
 at com.pcis.policy.app.newbusiness.service.PolicyAppService.savePolicy(PolicyAppService.java:343)
 at com.pcis.policy.app.underwrite.bm.UnderwriteBM.submitUnderwrite(UnderwriteBM.java:139)
 at com.pcis.policy.app.underwrite.action.UnderwriteBizAction.submitUnderwrite(UnderwriteBizAction.java:548)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 ...
Caused by: org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
 at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:624)
 at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
 at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:379)
 at org.springframework.orm.hibernate3.HibernateTemplate.flush(HibernateTemplate.java:841)
 at com.fwk.dao.BaseDao.flush(Unknown Source)
 at com.pcis.policy.dm.PolicyDAO.saveOrUpdatePolicy(PolicyDAO.java:174)
 ... 80 more
Caused by: java.sql.BatchUpdateException: ORA-00001: unique constraint (PCISV6_TS.UI_PLY_CVRG) violated
 at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:602)
 at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:9350)
 at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:210)
 at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
 at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
 at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
 ... 90 more

分析及解决:
在页面保存的时候,后台提示是违反唯一索引,通过UI_PLY_CVRG 查询相应的表,
select * from user_indexes  where index_name='UI_PLY_CVRG'
该表是WEB_PLY_CVRG ,而该表的唯一索引UI_PLY_CVRG 是由该表的3个字段组成C_PLY_NO、N_EDR_PRJ_NO、 N_SEQ_NO,然后看下页面发现是N_SEQ_NO有4个重复,删除多余的记录即可保存成功。

 

posted @ 2010-07-10 16:55 断点 阅读(7260) | 评论 (0)编辑 收藏

在项目中经常需要处理一些输入字符,往往我们也需要对其进行校验,而使用正则表达式是一个很好的处理方法。下面介绍一款处理正则表达式的软件 Match Tracer v2.0,MTracer最有用的特性是中文的正则式分析树。

下载地址:http://www.52z.com/down/30160.Html
官网:http://www.regexlab.com/zh/mtracer/

posted @ 2010-07-10 16:06 断点 阅读(161) | 评论 (0)编辑 收藏

在平时的项目中,经常需要开一下别人写的源码,而此时别人提供的往往是jar文件,根本看不了,很是不爽。最近很偶然的看见一个同事在eclipse下查看class文件,很是兴奋。下面讲下是如何安装下插件的。

打开class文件,我目前了解的有2种类型的软件:
一、在eclipse外部打开jar文件。
Java Decompiler.exe,主页JD home page: http://java.decompiler.free.fr ,该软件可以打开整个jar包,功能很强大。

二、在eclipse内部打开jar文件。
net.sf.jadclipse_3.3.0.jar、jad158g.win.zip,需要这两个文件。
准备工作:
1、下载jad.exe文件:http://www.varaneckas.com/jad
2、下载jadeclipse插件:http://sourceforge.net/projects/jadclipse/files/

安装如下:

1、将jadeclipse插件net.sf.jadclipse_3.3.0.jar 拷贝到myeclipse安装目录E:\MyEclipse 6.0\eclipse\myplugins\jad\eclipse\plugins目录下,并在目录E:\MyEclipse 6.0\eclipse\links下新建文件jad.link,内容如下path=E:\\MyEclipse 6.0\\eclipse\\myplugins\\jad\\ 

2、将jad.exe解压到指定目录。如:D:\tools 

3、在eclipse窗口下,点击Window > Preferences > Java > JadClipse > Path to Decompiler。(设置jad的绝对路径,如 D:\tools\jad\jad.exe)。Use Eclipse code formatter(overrides Jad formatting instructions)选项打勾,与格式化出来的代码样式一致。

4、在eclipse窗口下,点击Window > Preferences > Java > JadClipse > Misc,将Convert Unicode strings into ANSI strings选项打勾,避免反编译后可能出现的中文乱码。

5、重新启动myeclipse,eclipse自动将JadClipse Class File Viewer设置成class文件的缺省打开方式。如果没有默认,可以在Eclipse的Window > Preferences >General >Editors> File Associations中修改“*.class”默认关联的编辑器为“JadClipse Class File Viewer”。设置完成后,双击*.class文件,eclipse将自动反编译。

posted @ 2010-07-10 15:31 断点 阅读(5888) | 评论 (2)编辑 收藏

select e1.ename,e2.ename from emp e1 join emp e2 on (e1.mgr=e2.empno); --自连接,从e2中取出e1的经理人。
select ename,dname from emp e left join dept d on (e.deptno=d.deptno);   --左外连接
select ename,dname from emp e right outer join dept d on (e.deptno=d.deptno);   --右外连接
select ename,dname from emp e full join dept d on (e.deptno=d.deptno);    --全连接


--求部门中哪些人的薪水最高
select ename,sal from emp
join (select max(sal) max_sal,deptno from emp group by deptno) t
on (emp.sal = t.max_sal and emp.deptno = t.deptno);

--求部门平均薪水的等级
select deptno,avg_sal,grade from
(select deptno,avg(sal) avg_sal from emp group by deptno) t
join salgrade s on (t.avg_sal between s.losal and s.hisal);


--求部门平均的薪水等级
select avg(grade) from
(select deptno,ename,grade from emp join salgrade s on (emp.sal between s.losal and s.hisal )) t
group by deptno;

--雇员中有哪些人是经理人
select ename from emp where empno in (select distinct mgr from emp);


--不准用组函数,求薪水的最高值。采用的是自连接。
select distinct sal from emp where sal not in
(select distinct e1.sal from emp e1 join emp e2 on (e1.sal < e2.sal));


--求平均薪水最高的部门的部门编号。嵌套的组函数。
select deptno,avg_sal from
(select avg(sal) avg_sal,deptno from emp group by deptno)
where avg_sal =
(select max(avg(sal)),deptno from emp group by deptno;

 

--求平均薪水的等级最低的部门的部门名称。
select dname,t1.deptno,grade,avg_sal from
  (
   select deptno,grade,avg_sal from
     (select deptno,avg(sal) avg_sal from emp group by deptno) t
     join salgrade s on (t.avg_sal between s.losal and s.hisal)
  )
   t1
   join dept on (t1.deptno = dept.deptno)
)
where t1.grade =
(
 select min(grade) from
     (select deptno,grade,avg_sal from
  (select deptno,grade,avg(sal) avg_sal from emp group by deptno) t
   join salgrade s on (t.avg_sal between s.losal and s.hisal)
     )
)


--求平均薪水的等级最低的部门的部门名称。采用视图。
conn sys/sys as sysdba;
grant create table,create view to scott;

create view v$_dept_avg_sal_info as
select deptno,grade,avg_sal from
  (select deptno,grade,avg(sal) avg_sal from emp group by deptno) t
   join salgrade s on (t.avg_sal between s.losal and s.hisal);

select dname,t1.deptno,grade,avg_sal from
   v$_dept_avg_sal_info t1
   join dept on (t1.deptno = dept.deptno)
)
where t1.grade =
(
 select min(grade) from  v$_dept_avg_sal_info
)

-- 比普通员工的最高薪水还要高的经理人名称。
select ename from emp
where empno in (select distinct mgr from emp where mgr is not null)
and sal >
(
  select max(sal) from emp where empno not in
  (select distinct mgr from emp where mgr is not null)
)

 

posted @ 2010-07-06 23:25 断点 阅读(526) | 评论 (0)编辑 收藏

仅列出标题
共18页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last