当前位置:  数据库>oracle
本页文章导读:
    ▪Oracle的关于建表,约束,查询等的练习 - 流花飘原      从建立一个简单表,到实现一些复杂查询的例子, DROP TABLE grade;DROP TABLE item;DROP TABLE sporter;CREATE TABLE sporter( sporterid NUMBER(4) PRIMARY KEY NOT NULL, name  VARCHAR(50) NOT NULL,&n.........
    ▪ORACLE 小写金额转大写金额 - 水手哥      Create Or Replace Function Money2Chinese(Money In Number) Return Varchar2 Is strYuan Varchar2(150); strYuanFen Varchar2(152); numLenYuan Number; numLenYuanFen Number; strRstYuan Varchar2(600); strRstFen Varchar2(200); strRst .........
    ▪Oracle字符串函数 - 幕三少      Oracle字符串函数 平常我们用Oracle主要有两种字符串类型1.char始终为固定的长度,如果设置了长度小于char列的值,则Oracle会自动用空格填充的。当比较char时,Oracle用空格将其填充为等长,.........

[1]Oracle的关于建表,约束,查询等的练习 - 流花飘原
    来源:    发布时间: 2013-10-29

从建立一个简单表,到实现一些复杂查询的例子,

 

DROP TABLE grade;
DROP TABLE item;
DROP TABLE sporter;
CREATE TABLE sporter(
 sporterid NUMBER(4) PRIMARY KEY NOT NULL,
 name  VARCHAR(50) NOT NULL,
 sex  VARCHAR(2) NOT NULL,
 department VARCHAR(30) NOT NULL,
 CONSTRAINT sporter_sex_CK CHECK(sex IN('男','女'))
);

 

CREATE TABLE item(
 itemid  VARCHAR(4) PRIMARY KEY NOT NULL,
 itemname VARCHAR(50) NOT NULL,
 location VARCHAR(50) NOT NULL
);

CREATE TABLE grade(
 sporterid NUMBER(4),
 itemid  VARCHAR(4),
 mark  NUMBER(2),
 CONSTRAINT sport_grade_sporterid_fk FOREIGN KEY(sporterid) REFERENCES sporter(sporterid) ON DELETE CASCADE,
 CONSTRAINT item_grade_sporterid_fk FOREIGN KEY(itemid) REFERENCES item(itemid) ON DELETE CASCADE,
 CONSTRAINT grade_mark_CK CHECK(mark IN (6,4,2,0))
);

-- 测试数据

INSERT INTO sporter(sporterid,name,sex,department)
 VALUES(1001,'李明','男','计算机系');
INSERT INTO sporter(sporterid,name,sex,department)
 VALUES(1002,'王二','男','数学系');
INSERT INTO sporter(sporterid,name,sex,department)
 VALUES(1003,'张三','男','计算机系');
INSERT INTO sporter(sporterid,name,sex,department)
 VALUES(1004,'李四','男','物理系');
INSERT INTO sporter(sporterid,name,sex,department)
 VALUES(1005,'李娜','女','心理系');
INSERT INTO sporter(sporterid,name,sex,department)
 VALUES(1006,'孙俪','女','数学系');

INSERT INTO item(itemid,itemname,location)
 VALUES ('x001','男子五千米','一操场');
INSERT INTO item(itemid,itemname,location)
 VALUES ('x002','男子标枪','二操场');
INSERT INTO item(itemid,itemname,location)
 VALUES ('x003','男子跳远','二操场');
INSERT INTO item(itemid,itemname,location)
 VALUES ('x004','女子跳高','二操场');
INSERT INTO item(itemid,itemname,location)
 VALUES ('x005','女子三千米','三操场');


INSERT INTO grade(sporterid,itemid,mark)
 VALUES(1001,'x001',6);
INSERT INTO grade(sporterid,itemid,mark)
 VALUES(1002,'x001',4);
INSERT INTO grade(sporterid,itemid,mark)
 VALUES(1003,'x001',2);
INSERT INTO grade(sporterid,itemid,mark)
 VALUES(1004,'x001',0);
INSERT INTO grade(sporterid,itemid,mark)
 VALUES(1001,'x003',4);
INSERT INTO grade(sporterid,itemid,mark)
 VALUES(1002,'x003',6);
INSERT INTO grade(sporterid,itemid,mark)
 VALUES(1004,'x003',2);
INSERT INTO grade(sporterid,itemid,mark)
 VALUES(1005,'x004',6);
INSERT INTO grade(sporterid,itemid,mark)
 VALUES(1006,'x004',4);


要求:
1.求出目前总积分最高的系名,及其积分:
·所有的系名都在SPORTERID表之中
SELECT * FROM (
 SELECT s.department,SUM(g.mark) sum
 FROM sporter s,grade g
 WHERE s.sporterid=g.sporterid
 GROUP BY s.department
 ORDER BY sum DESC)
WHERE ROWNUM=1
;

·不使用ROWNUM
 ·求出最大的分数值
 SELECT MAX(SUM(g.mark)) max
 FROM sporter s,grade g
 WHERE s.sporterid=g.sporterid
 GROUP BY s.department
 ·把上面的最大分数值作为子查询作为子查询
 SELECT t.* FROM (
  SELECT s.department de,SUM(g.mark) sum
  FROM sporter s,grade g
  WHERE s.sporterid=g.sporterid
  GROUP BY s.department
  ORDER BY sum DESC) t
 WHERE t.sum=(
  SELECT MAX(SUM(g.mark)) max
  FROM sporter s,grade g
  WHERE s.sporterid=g.sporterid
  GROUP BY s.department)
 ;


2.找出在二操场进行比赛的各个项目名称,及其冠军的姓名
·求出最高成绩的 项目ID 和 分数
SELECT i.itemname,s.name,g.mark
FROM item i,grade g,sporter s
WHERE i.location='二操场'
AND i.itemid=g.itemid
AND s.sporterid=g.sporterid
;
·根据最高分得出
SELECT i.itemname,s.name,g.mark
FROM item i,grade g,sporter s
WHERE i.location='二操场'
AND i.itemid=g.itemid
AND s.sporterid=g.sporterid
AND g.mark IN(
 SELECT MAX(mark) FROM (
 SELECT i.itemname itemname,s.name name,g.mark mark
 FROM item i,grade g,sporter s
 WHERE i.location='二操场'
 AND i.itemid=g.itemid
 AND s.sporterid=g.sporterid
 )GROUP BY itemname
)
;


3.找出参加了张三所参加过的项目的其他同学的姓名
SELECT DISTINCT s.name FROM sporter s,grade g
WHERE s.sporterid=g.sporterid
AND s.name<>'张三'
AND g.itemid IN (
 SELECT g.itemid
 FROM sporter s,grade g
 WHERE s.sporterid=g.sporterid
 AND s.name='张三'
)
;


4.经查张三因为使用了违禁药品,其成绩都记为0分,做出修改
UPDATE grade SET mark=0
WHERE sporterid=(
 SELECT sporterid FROM sporter WHERE name='张三'
);


5.取消山粗女子跳高比赛项目
DELETE FROM item WHERE itemname='女子跳高';

 


本文链接:http://www.cnblogs.com/liuhuapiaoyuan/p/3177185.html,转载请注明。


    
[2]ORACLE 小写金额转大写金额 - 水手哥
    来源:    发布时间: 2013-10-29
Create Or Replace Function Money2Chinese(Money In Number) Return Varchar2 Is
strYuan Varchar2(150);
strYuanFen Varchar2(152);
numLenYuan Number;
numLenYuanFen Number;
strRstYuan Varchar2(600);
strRstFen Varchar2(200);
strRst Varchar2(800);
Type typeTabMapping Is Table Of Varchar2(2) Index By Binary_Integer;
tabNumMapping typeTabMapping;
tabUnitMapping typeTabMapping;
numUnitIndex Number;
i Number;
j Number;
charCurrentNum Char(1);
Begin
If Money Is Null Then
Return Null;
End If;
strYuan := TO_CHAR(FLOOR(Money));
If strYuan = '0' Then
numLenYuan := 0;
strYuanFen := lpad(TO_CHAR(FLOOR(Money * 100)), 2, '0');
Else
numLenYuan := length(strYuan);
strYuanFen := TO_CHAR(FLOOR(Money * 100));
End If;
If strYuanFen = '0' Then
numLenYuanFen := 0;
Else
numLenYuanFen := length(strYuanFen);
End If;
If numLenYuan = 0 Or numLenYuanFen = 0 Then
strRst := '零圆整';
Return strRst;
End If;
tabNumMapping(0) := '零';
tabNumMapping(1) := '壹';
tabNumMapping(2) := '贰';
tabNumMapping(3) := '叁';
tabNumMapping(4) := '肆';
tabNumMapping(5) := '伍';
tabNumMapping(6) := '陆';
tabNumMapping(7) := '柒';
tabNumMapping(8) := '捌';
tabNumMapping(9) := '玖';
tabUnitMapping(-2) := '分';
tabUnitMapping(-1) := '角';
tabUnitMapping(1) := '';
tabUnitMapping(2) := '拾';
tabUnitMapping(3) := '佰';
tabUnitMapping(4) := '仟';
tabUnitMapping(5) := '万';
tabUnitMapping(6) := '拾';
tabUnitMapping(7) := '佰';
tabUnitMapping(8) := '仟';
tabUnitMapping(9) := '亿';
For i In 1 .. numLenYuan Loop
j := numLenYuan - i + 1;
numUnitIndex := Mod(i, 8);
If numUnitIndex = 0 Then
numUnitIndex := 8;
End If;
If numUnitIndex = 1 And i > 1 Then
strRstYuan := tabUnitMapping(9) || strRstYuan;
End If;
charCurrentNum := substr(strYuan, j, 1);
If charCurrentNum <> 0 Then
strRstYuan := tabNumMapping(charCurrentNum) ||
tabUnitMapping(numUnitIndex) || strRstYuan;
Else
If (i = 1 Or i = 5) Then
If substr(strYuan, j - 3, 4) <> '0000' Then
strRstYuan := tabUnitMapping(numUnitIndex) || strRstYuan;
End If;
Else
If substr(strYuan, j + 1, 1) <> '0' Then
strRstYuan := tabNumMapping(charCurrentNum) || strRstYuan;
End If;
End If;
End If;
End Loop;
For i In -2 .. -1 Loop
j := numLenYuan - i;
ch
    
[3]Oracle字符串函数 - 幕三少
    来源:    发布时间: 2013-10-29
Oracle字符串函数

 

平常我们用Oracle主要有两种字符串类型
1.char始终为固定的长度,如果设置了长度小于char列的值,则Oracle会自动用空格填充的。当比较char时,Oracle用空格将其填充为等长,再进行比较。
2.VarChar2数据类型为可变长度,虽然与VarChar数据类型是同义的,但在今后的Oracle版本中也许会有变化,所以应该避免使用VarChar,优先使用VarChar2。
固定长度的字符串字段使用Char,而其他所有的字符串字段都应使用VarChar2.

下面列出部分Oracle针对字符串操作的一些函数,以下函数可以使用在字符串上,也可以使用在列名上:
1.LOWER(string) 将输入的字符串转换成小写
2.UPPER(string) 将输入的字符串转换成大写
3.INITCAP(string) 将输入的字符串单词的首字母转换成大写。PS:如果不是两个字母连在一起,则认为是新的单词,例:a_b a,b  a b  类似前面这些情况,都a和b都会转换成大写
4.连接符(||),将两个字符串用||连接起来,除此之外还可以使用Concat函数来连接字符串。例:select CONCAT(City,country) from Table
5.LPAD和RPAD,填充函数,这是两个十分相似的函数,使用方式完全一样。允许在列的左[右]边填充一组字符。例:RPAD(city,20,'.'),如果ciy的值没有小于长度20的话,则用'.'在右边补齐,补到20个,如果是用空格补齐,看上去就是像左对齐一样。
6.LTRIM,RTRIM和TRIM,他们的作用是从字符串的左边,右边,左右两边删除不需要的字符,默认时删除空格。
格式:RTRIM、LTRIM(字符串,'删除字符集') 第一个参数就是要进行删除的字符,第二个参数是一个字符集来的,如果填写的是'AB',Oracle会认为是A和B,然后反复检查字符串的右端,直到字符串中的每个字符都被删除了,也就是说,直到遇到被删除字符集中未出现的第一个字符时,才停止删除。这样讲可能有点不是很明白,看下面例子
原数据
1 AAA.
2 AAA."
3 AA.AAB
RTRIM(name,'.B"')
1 AAA
2 AAA
3 AA.AA
如果觉得不够明白的话,自己试多几次就明白了!我也觉得讲得好像不是很清楚一样!
TRIM格式有点不一样,直接看例子吧 select trim('A' from 列名) from tableName 或者trim(leading 'A' from 列名)或者trim(trailing 'A' from 列名) 等价于LTRIM和RTRIM函数一样,其实TRIM函数就只是为了简化代码而以。
7.LENGTH 该函数很简单,就是告诉用户一个字符串有多长,即字符串中有多少个字符,该函数本身并不是很好用,但可以做为其它函数的一部分,用于计算表格需要多少空格,或者做为orderby 子句的一部分。PS:您不能对一个使用LONG数据类型的列使用LENGTH之类的函数。
8.SUBSTR(string,start [,count]) 该函数告诉oracle提取出string一个子集,start开始位置,count提取长度,不指定count时,默认提取到该字符串的尾部。
  start同时也可以指定为负数,指定为正数的时候是从字符串的起始位置开始算(左边),指定负数时,是从末尾位置算(右边)。PS:负数不能使用于Char数据类型,因为Char是固定长度的,   所以将使用空格填充他们的值,直到扩展到列的全长。
9.INSTR 返回指定的字符串所在的位置
  INSTR(string,set[,start [,occurrence ] ] ) 如果指定start,oracle则跳过前面所有字符串到该位置开始搜索,occurence,是强迫instr跳过前几次与字符串匹配,给出下一次匹配的位置,如果occurence指定3,那就是匹配第三次的位置了。 例 instr('ABACAAA','A',2,2) 从ABACAAA中匹配A这个字符串,从2个位置开始匹配,匹配第2次A所在的位置。PS:如果set中不止有一个字符而是有几个字符组成的,则INSTR给出该字符集中的第一个字符的位置。
10.Chr和ascii函数在即席查询中很少使用。Chr把数值转换成等价的ascii字符串 例:select chr(70) from dual
        ascii函数执行的结果刚好是相反的,传递给他字符串,它将转换成对应的数值(只转换第一个字符串),如果需要同时转换多个字符串可以使用DUMP函数 DUMP(string)

PS:INSTR,REPLACE和SUBSTR的功能已经得到扩展,可以支持正则表达式。

通过以上函数可以单独使用或者组合使用,这是一个简单的过程,即将简单的逻辑步骤组合起来完成非常复杂的任务。


本文链接:http://www.cnblogs.com/smiler/p/3178506.html,转载请注明。


    
最新技术文章:
▪current online redo log缺失后的恢复
▪ORA-600 2662错误解决实例
▪ORA-00600 2662错误解决方法
▪Oracle Hidden Parameter:_allow_resetlogs_corruption
▪Oracle诊断事件列表
▪Oracle 隐含参数 _disable_logging 详解
▪ORA-00600 [2662]错误解决过程
▪Oracle里常见的执行计划
▪Oracle里另外一些典型的执行计划
▪Oracle服务器自动备份
▪Oracle固定SQL的执行计划(一)---SQL Profile
▪Oracle固定SQL的执行计划(二)---SPM
▪同一环境下新建Standby RAC库
▪Oracle快速克隆安装
▪Oracle单实例启动多个实例
▪Oracle的PLSQL别名中文出现乱码解决方法
▪ORA-00379: no free buffers available in buffer pool DEFAULT ...
▪RMAN-06023: no backup or copy of datafile 16 found to restor...
▪RMAN还原数据库报错问题解决案例
▪OEL6.8_X86平台部署Oracle 10gR2检测失败问题
▪Oracle 性能优化建议
▪Oracle SQL语句优化心得
▪Oracle慢SQL监控脚本实现
▪Oracle dblink 查询 tns:无法解析指定的连接标识...
▪Red Hat Enterprise Linux 6使用udev配置Oracle ASM总结...
▪Linux6.6及以上版本配置Oracle ASM共享储存-UDEV
▪Oracle 12C 开启数据库归档模式
▪Solairs系统中配置Oracle 12c 开机启动
▪重建DBMS_STATS解决ORA-31626 ORA-21633以及ORA-04063 ORA...
▪Oracle ASMM 与AMM之间相互切换
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3