|
SELECT *
FROM (SELECT COUNT (c_nme_en) as cus , c_nme_en
FROM web_prod
WHERE c_prod_no = '0325' AND c_tab_no != '0040'
GROUP BY c_nme_en)
WHERE cus > 1
order by c_nme_en
这个就是对c_nme_en列的不同内容进行统计。
可以参考:http://www.w3school.com.cn/sql/sql_groupby.asp
posted @ 2009-06-03 11:11 断点 阅读(56) | 评论 (0)
数据类型:
数字类型:
Number用来表示可变长的数值列,语法为Number(p, s),p是指所有有效数字的位数,s是指小数点以后的位数;p和s的取值分别是p=1 to 38,s=-84 to 127;
有效数位:从左边第一个不为0的数算起,小数点和负号不计入有效位数。
p>0,对s分3种情况:
1. s>0
精确到小数点右边s位,并四舍五入。然后检验有效数位是否<=p;如果s>p,小数点右边至少有s-p个0填充。
2. s<0
精确到小数点左边s位,并四舍五入。然后检验有效数位是否<=p+|s|
3.s是0或者未指定,四舍五入到最近整数。
注意:当p小于s时候,表示数字是绝对值小于1的数字,且从小数点右边开始的前s-p 位必须是0,保留s位小数。
比如
Value Datatype Stored Value
123.2564 NUMBER 123.2564
1234.9876 NUMBER(6) 1235
1234.9876 NUMBER(6,2) 1234.99
12345.12345 NUMBER(6,2) Error
12345.345 NUMBER(5,-2) 12300
1234567 NUMBER(5,-2) 1234600
12345678 NUMBER(5,-2) Error
12345.58 NUMBER(*, 1) 12345.6
0.1 NUMBER(4,5) Error
0.01234567 NUMBER(4,5) 0.01235
0.09999 NUMBER(4,5) 0.09999
0.099996 NUMBER(4,5) <>
用法如下:
create table t_n(id number(5,2));
insert into t_n values(123.455);
insert into t_n values(1.234);
insert into t_n values(.001);
select * from t_n 结果为:
Number类型存储实数,PLS_Integer和BINARY_Integer只能存储整数。
字符类型:
Char表示定长的字符串,语法Char(L),L是可选的。如果没有指定L值,默认为1;最大长度为32767。
VarChar2用来存储可变的字符串,语法VarChar2(L),L是必须的。最大长度为32767。
布尔类型:
Boolean类型的合法赋值为True、False和Null。
类型转换:
To_Char:可以将Number和Date类型转换为Varchar2类型;
To_Date:将Char类型转换Date类型;
To_Number:将Char类型转换Number类型;
变量和常量:
变量名称:1.必须以字母开头;2.其后可以跟一个或多个字母、数字(0~9)、特殊字符$、#或_ ;
3.变量长度不超过30个字符;4.变量名中不能有空格。
1.变量的声明:
DECLARE
v_StudentName VARCHAR2(20),
v_CurrentDate DATE;
v_NumberCredits NUMBER(3);
2.自定义的数据类型:
DECLARE
TYPE t_StudentRecord IS RECORD (FirstName Varchar2(10),LastName Varchar2(10),
CurrentCredits NUMBER(3));
v_Student t_StudentRecord;
3.变量属性:
下面介绍常见的几种复合数据类型变量的定义。
(1)使用%type定义变量
为了让PL/SQL中变量的类型和数据表中的字段的数据类型一致,Oracle 9i提供了%type定义方法。这样当数据表的字段类型修改后,PL/SQL程序中相应变量的类型也自动修改。如下:
declare
mytable emp.empno%type;
begin
select a.empno into mytable
from emp a
where a.ename='SCOTT';
dbms_output.put_line(mytable);
end;
(2)使用%rowtype定义变量
使用%type可以使变量获得字段的数据类型,使用%rowtype可以使变量获得整个记录的数据类型。
比较两者定义的不同:变量名 数据表.列名%type,变量名 数据表%rowtype。
declare
mytable emp%rowtype;
begin
select * into mytable
from emp a
where a.ename='SCOTT';
dbms_output.put_line(mytable.empno||' '||mytable.job);
end;
流程控制:
待续。。。
posted @ 2009-02-03 11:33 断点 阅读(176) | 评论 (0)
SELECT b.c_dpt_cde as CDptCde,
a.c_prod_no as CProdNo,
a.c_ply_no as CPlyNo,
a.c_edr_no as CEdrNo,
a.c_insrnt_cde as CInsrntCde,
a.c_bs_cur as CBsCur,
a.n_bs_amt as NBsAmt,
a.n_exch_rate as NExchRate,
a.c_rp_cur as CRpCur,
a.n_rp_amt as NRpAmt,
a.n_orig_cur_amt as NOrigCurAmt,
a.c_main_con_cde as CMainConCde,
a.c_sls_cde as CSlsCde,
a.c_cha_cls as CChaCls,
a.c_cha_cde as CChaCde,
b.c_oper_cde as COperCde,
b.t_cav_tm as TCavTm,
b.t_upd_tm as TUpdTm,
a.c_cav_pk_id as CCavPkId,
c.c_rp_type as CRpType,
b.c_check_cde as CCheckCde,
b.t_check_tm as TCheckTm,
b.c_check_flag as CCheckFlag,
b.c_check_memo as CCheckMemo,
a.c_prmdue_pk_id as CPrmduePkId,
a.c_paydue_pk_id as CPayduePkId,
a.c_clmdue_pk_id as CClmduePkId,
a.c_cavdoc_pk_id as CCavdocPkId,
a.c_clm_no as CClmNo,
a.c_bill_flag as CBillFlag,
a.c_feetyp_cde as CFeetypCde
FROM web_fin_cav_doc a
left join web_fin_cav_bill b on a.c_cav_pk_id = b.c_cav_pk_id
left join web_fin_cav_rptyp c on a.c_cav_pk_id = c.c_cav_pk_id
WHERE 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1
AND 1 = 1;
上面实现的是三个数据表之间的左连接。以前看见过两个表的左连接,而要实现三个表之间的左连接,还真有点困难,搞了半天才做出来。。。
posted @ 2009-02-27 09:50 断点 阅读(356) | 评论 (0)
1.集合操作:
Union 用第二个查询结果合并第一个查询结果,同时不显示重复的行。
Union all 检索出所有的行,包括重复的行。
intersect 返回两个查询所检索出的共有行。
minus 返回将第二个查询检索出的行从第一个查询检索出的行中减去之后剩余的行。
select ename,dname,job
from dept t,emp p
where t.deptno=p.deptno and t.dname='SALES'
union/intersect/minus
select ename,dname,job
from dept t,emp p
where t.deptno=p.deptno and p.job='MANAGER';
2.子查询:
可以在一个select语句中嵌入另一个完整的select语句,但此句的子查询的返回结果只能有一个,如想返回多个可用 in 。
select ename,dname,job
from dept t,emp p
where t.deptno=p.deptno and t.dname=
(
select dname
from dept t,emp p
where t.deptno=p.deptno and p.sal=1600.00
);
select ename,dname,job
from dept t,emp p
where t.deptno=p.deptno and t.dname in
(
select dname
from dept t,emp p
where t.deptno=p.deptno and p.sal>3000.00
);
3.表的连接:
select t.dname
from emp p,dept t
where p.deptno=t.deptno and p.ename='SMITH';
由于实施了关系连接的两表是任何连接的,所有需要在where子句中设置主关键字等于外部关键字的条件,否则查询结果不对。
4.case语句:
*简单case语句,使用表达式确定返回值,但case后的变量只有一个;
select t.dname,t.loc,t.deptno,
case t.deptno
when 10 then 'ACCOUNTING'
when 20 then 'RESEARCH'
when 30 then 'SALES'
else 'T'
end
from dept t;
*搜索case语句,使用条件确定返回值,但when后面可以跟多个条件。
select t.dname,t.loc,t.deptno,
case
when t.deptno=10 and t.loc='CHICAGO' then 'ACCOUNTING'
when t.deptno=20 then 'RESEARCH'
when t.deptno=30 then 'SALES'
else 'T'
end
from dept t;
5.decode函数:
decode(value,search_value,result,default_value)
如果value和search_value相等,则返回result,否则返回default_value。
select t.dname,t.loc,t.deptno,
decode(t.deptno,
10,'ACCOUNTING',
20,'RESEARCH',
30,'SALES',
'T'
)
from dept t;
posted @ 2009-01-13 17:15 断点 阅读(240) | 评论 (0)
1.在where子句中使用比较运算符:= ,!=(不等于) , <> (不等于), < ,> ,<= ,>= ,like。
2.使用比较运算符like:%通配符可以匹配任何长度的字符;_每个下划线匹配一个字母。
3.or:或的意思。
4.and:连接的两个条件必须同时满足。
5.not 非:select * from web_fin_dcr t where not t.n_item_no in(1,2);
6.between...and:指定某个范围内的所有值,包括指定值本身。
7.in用来指定一条列值:select * from web_fin_dcr t where t.n_item_no in(1,2);
8.order by:对检索到的数据进行排序,默认为升序asc(ascend),降序为desc(descend)。
select * from web_fin_dcr t where t.n_item_no in(1,2,3) order by t.n_item_no desc;
9.distinct来检索唯一的表列值,也就是检索哪些不同的数据:
select distinct t.c_cav_flag from web_fin_dcr t where t.n_item_no in(1,2,3);
posted @ 2009-01-12 16:19 断点 阅读(61) | 评论 (0)
<beans>
<bean id="person" class="org.spring.bean.Person">
<property name="name">
<value>zhangsan</value>
/property>
<property name="age">
<value>23</value>
</property>
</bean>
</beans>
注意:配置bean的开始,注意在property里name的属性值要和你在bean类里面的那个name成员变量一样。
从上面.xml的文档说明我们可以知道id属性是一个bean的唯一标示符,这个id在管理Bean的BeanFactory或者ApplicationContext中必须是唯一的标示符。用法如下
Person p = (Person) a.getBean("person");在getBean()方法里所传递的参数就是bean的id属性值。
当然我们也可以使用name属性来指定Bean的id演示代码如下:
<beans>
<bean name="person,user" class="org.spring.bean.Person">
<property name="name">
<value>zhangsan</value>
</property>
<property name="age">
<value>23</value>
</property>
</bean>
</beans>
使用bean的id和name来指定bean的id的区别:
id属性允许我们指定一个Bean的id,并且它在XML DTD中作为一个真正的XML元素的ID属性被标记,所以XML解析器能够在其他元素指向它的时候做一些额外的效验;name属性则与id相反,如果我们在开发中有必要使用一些非法的字符,那么我们可以通过name属性指定一个或多个id。当我们指定多个id时要用逗号(,)或者(;)来进行分隔。
用法如下:Person p = (Person) a.getBean("person"); 或改写为Person p = (Person) a.getBean("user");
posted @ 2009-02-11 10:35 断点 阅读(1005) | 评论 (0)
数据库使用锁(lock)来保证任何给定时刻最多只有一个事务在修改给定的一段数据。实质上讲,正是锁机制才使并发控制成为可能。
ORACLE的封锁策略:
1、只有当修改时,Oracle在行级上锁定数据,不要把锁定上升到块或表级。
2、Oracle决不会为读取而锁定数据,简单读取不能在数据行上设置锁定。
3、数据的写入器不会阻塞数据读取器。
4、只有当另一个数据写入器已经锁定了某行数据后,才阻塞其他人对该行数据的写入。数据的读取器决不会阻塞数据的写入器。
-------------------------------------------------------------------------
Oracle并发处理机制的简单看法。http://www.51testing.com/html/97/n-131297.html
转载内容如下:
在Oracle开发过程中,如果你只是独立地测试你的应用,然后部署,并交给数十个并发用户使用,就很有可能痛苦地遭遇原先未能检测到的并发问题。例如,2个用户同时修改某张订单,首先他们会查询这张订单存在不存在,如果存在,那么修改它的状态。在并发操作中,用户1会很奇怪的发现他的修改丢失了。当然,除此之外,在未能够很好的处理并发问题可能遭遇的情况还有:
◆破坏数据的完整性。
◆随着用户数的增多,应用的运行速度减慢。
◆不能很好地扩缩应用来支持大量用户。
为解决这些问题。首先要引入的是ORACLE的锁机制。数据库使用锁(lock)来保证任何给定时刻最多只有一个事务在修改给定的一段数据。实质上讲,正是锁机制才使并发控制成为可能。对ORACLE的锁机制可以查看ORACLE官方文档介绍。以下是对ORACLE锁的一点总结。
Oracle只在修改时才对数据加行级锁。正常情况下不会升级到块级锁或表级锁(不过两段提交期间的一段很短的时间内除外,这是一个不常见的操作)。
◆如果只是读数据,Oracle绝不会对数据锁定。不会因为简单的读操作在数据行上锁定。
◆写入器(writer)不会阻塞读取器(reader)。换种说法:读(read)不会被写(write)阻塞。这一点几乎与其他所有数据库都不一样。在其他数据库中,读往往会被写阻塞。尽管听上去这个特性似乎很不错(一般情况下确实如此),但是,如果你没有充分理解这个思想,而且想通过应用逻辑对应用施加完整性约束,就极有可能做得不对。
◆写入器想写某行数据,但另一个写入器已经锁定了这行数据,此时该写入器才会被阻塞。读取器绝对不会阻塞写入器。
开发人员要尽可能的考虑以上因素。而且还要意识到这些事ORACLE独有的。针对其他数据库,在锁的应用上略有不同。
以DB2为例
1.Oracle通过具有意向锁的多粒度封锁机制进行并发控制,保证数据的一致性。其DML锁(数据锁)分为两个层次(粒度):即表级和行级。通常的DML操作在表级获得的只是意向锁(RS或RX),其真正的封锁粒度还是在行级;DB2也是通过具有意向锁的多粒度封锁机制进行并发控制,保证数据的一致性。
其DML锁(数据锁)分为两个层次(粒度):即表级和行级。通常的DML操作在表级获得的只是意向锁(IS,SIX或IX),其真正的封锁粒度也是在行级;另外,在Oracle数据库中,单纯地读数据(SELECT)并不加锁,这些都提高了系统的并发程度,Oracle强调的是能够“读”到数据,并且能够快速的进行数据读取。而DB2的锁强调的是“读一致性”,进行读数据(SELECT)时会根据不同的隔离级别(RR,RS,CS)而分别加S,IS,IS锁,只有在使用UR隔离级别时才不加锁。从而保证不同应用程序和用户读取的数据是一致的。
2. 在支持高并发度的同时,DB2和Oracle对锁的操纵机制有所不同:Oracle利用意向锁及数据行上加锁标志位等设计技巧,减小了Oracle维护行级锁的开销,使其在数据库并发控制方面有着一定的优势。而DB2中对每个锁会在锁的内存(locklist)中申请分配一定字节的内存空间,具体是X锁64字节内存,S锁32字节内存(注:DB2 V8之前是X锁72字节内存而S锁36字节内存)。
3. Oracle数据库中不存在锁升级,而DB2数据库中当数据库表中行级锁的使用超过locklist*maxlocks会发生锁升级。
4. 在Oracle中当一个session对表进行insert,update,delete时候,另外一个session仍然可以从Orace回滚段或者还原表空间中读取该表的前映象(before image); 而在DB2中当一个session对表进行insert,update,delete时候,另外一个session仍然在读取该表数据时候会处于lock wait状态,除非使用UR隔离级别可以读取第一个session的未提交的值;所以Oracle同一时刻不同的session有读不一致的现象,而DB2在同一时刻所有的session都是“读一致”的。
posted @ 2009-11-28 17:50 断点 阅读(24) | 评论 (0)
今天在选择一条记录进行做删除操作时,碰见index失败的问题,如下:
处理失败!错误信息:[SQLException ORA-01502 index VHL_V6.PK_WEB_APP_TGT_OBJ or partition of such index is in unusable state ]
在网上查询了下,知道原因,就上数据库查了一下,结果如下:
1 PK_WEB_APP_TGT_OBJ NORMAL VHL_V6 TABLE UNUSABLE。
显然是UNUSABLE状态,那也就知道原因了,呵呵,解决!
以下为参考文件:
SQL> create table t(a number);
Table created.
1、现在,我们建立一个唯一索引来看看:
SQL> create unique index idx_t on t(a);
Index created.
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='T';
no rows selected
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_T';
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_T NORMAL DATA_DYNAMIC TABLE VALID
SQL> insert into t values(1);
1 row created.
SQL> commit;
Commit complete.
2、将索引手工修改为unusable状态(模拟发生索引失效的情况):
SQL> alter index idx_t unusable;
Index altered.
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_T';
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_T NORMAL DATA_DYNAMIC TABLE UNUSABLE
我们看到这是,已经不能正常往表中插入数据:
SQL> insert into t values(2);
insert into t values(2)
*
ERROR at line 1:
ORA-01502: index 'MISC.IDX_T' or partition of sUCh index is in unusable state
3、首先,我们通过重建索引(rebuild index)的方法来解决问题:
SQL> alter index idx_t rebuild;
Index altered.
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_T';
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_T NORMAL DATA_DYNAMIC TABLE VALID
SQL> insert into t values(2);
1 row created.
SQL> commit;
Commit complete.
SQL>
4、现在我们再次模拟索引失效(unusable状态):
SQL> alter index idx_t unusable;
Index altered.
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_T';
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_T NORMAL DATA_DYNAMIC TABLE UNUSABLE
SQL> insert into t values(3);
insert into t values(3)
*
ERROR at line 1:
ORA-01502: index 'MISC.IDX_T' or partition of such index is in unusable state
5、然后,看看是否可以通过设置参数skip_unusable_indexes=true来解决问题:
SQL> alter session set skip_unusable_indexes=true;
Session altered.
SQL> insert into t values(3);
insert into t values(3)
*
ERROR at line 1:
ORA-01502: index 'MISC.IDX_T' or partition of such index is in unusable state
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_T';
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_T NORMAL DATA_DYNAMIC TABLE UNUSABLE
SQL> alter index idx_t rebuild;
Index altered.
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_T';
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_T NORMAL DATA_DYNAMIC TABLE VALID
SQL> insert into t values(3);
1 row created.
SQL> commit;
Commit complete.
SQL>
总结:对于unique index,通过简单的设置参数是不能解决问题的,要解决unique index 失效的问题,只能通过重建索引来实现。
资料引用:http://www.knowsky.com/388811.html
posted @ 2009-09-26 21:36 断点 阅读(80) | 评论 (0)
1、用户
查看当前用户的缺省表空间:SQL>select username,default_tablespace from user_users;
查看当前用户的角色:SQL>select * from user_role_privs;
查看当前用户的系统权限和表级权限
SQL>select * from user_sys_privs;
SQL>select * from user_tab_privs;
显示当前会话所具有的权限:SQL>select * from session_privs;
显示指定用户所具有的系统权限:SQL>select * from dba_sys_privs where grantee='GAME';
显示特权用户:select * from v$pwfile_users;
显示用户信息(所属表空间)
select default_tablespace,temporary_tablespace
from dba_users where username='GAME';
显示用户的PROFILE :select profile from dba_users where username='GAME';
2、表
查看用户下所有的表 SQL>select * from user_tables;
查看名称包含log字符的表
SQL>select object_name,object_id from user_objects where instr(object_name,'LOG')>0;
查看某表的创建时间
SQL>select object_name,created from user_objects where object_name=upper('&table_name');
查看某表的大小
SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
where segment_name=upper('&table_name');
查看放在ORACLE的内存区里的表
SQL>select table_name,cache from user_tables where instr(cache,'Y')>0;
3、索引
查看索引个数和类别
SQL>select index_name,index_type,table_name from user_indexes order by table_name;
查看索引被索引的字段
SQL>select * from user_ind_columns where index_name=upper('&index_name');
查看索引的大小
SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
where segment_name=upper('&index_name');
4、序列号
查看序列号,last_number是当前值
SQL>select * from user_sequences;
5、视图
查看视图的名称 SQL>select view_name from user_views;
查看创建视图的select语句
SQL>set view_name,text_length from user_views;
SQL>set long 2000; 说明:可以根据视图的text_length值设定set long 的大小
SQL>select text from user_views where view_name=upper('&view_name');
6、同义词
查看同义词的名称
SQL>select * from user_synonyms;
7、约束条件
查看某表的约束条件
SQL>select constraint_name, constraint_type,search_condition, r_constraint_name
from user_constraints where table_name = upper('&table_name');
SQL>select c.constraint_name,c.constraint_type,cc.column_name
from user_constraints c,user_cons_columns cc
where c.owner = upper('&table_owner') and c.table_name = upper('&table_name')
and c.owner = cc.owner and c.constraint_name = cc.constraint_name
order by cc.position;
8、存储函数和过程
查看函数和过程的状态
SQL>select object_name,status from user_objects where object_type='FUNCTION';
SQL>select object_name,status from user_objects where object_type='PROCEDURE';
查看函数和过程的源代码
SQL>select text from all_source where owner=user and name=upper('&plsql_name');
转载:http://www.javaeye.com/topic/264639
posted @ 2009-09-14 17:29 断点 阅读(28) | 评论 (0)
最近看C语言的程序,程序里面带有sql语句,其中就有这么一句:
EXEC SQL select upper(nvl(c_grant_dpt_cde,'0')),nvl(C_CTCT_CDE,'0') into :sGrantCde,:sCtctCde from t_department where c_dpt_cde = :sDptCde;
if (sqlca.sqlcode!=0) {
printf("[ppPlyNewCountPrm]ERROR:sqlca.sqlerrmc = %s\n", sqlca.sqlerrm.sqlerrmc);
return(SetUserError(lpInBuffer,2,"取机构部门归属错误!"));
}
不明白 sqlca.sqlcode = 0 是什么意思,搜了搜,记录一下sqlca.sqlcode的各种取值的意义:
0 ——最近一次sql语句执行成功
-1 ——最近一次sql语句执行失败
100 ——最近一次sql语句没有返回数据
posted @ 2009-09-10 19:59 断点 阅读(129) | 评论 (0)
|