TEMPOARY TABLESPACE TEMPDATA;
GRANT CONNECT , CREATE TABLE , RESOURCE TO KAIFA
2.在做报表统计时,需要根据报表日期和币种从概要表中查询本期余额。
概要表(CCB_GYB)信息如下:
ACCOUNTING_DATE | DATE | 报表日期(唯一索引) |
RMB_YTD_BALANCE | NUMBER | 人民币余额 |
CNY_YTD_BALANCE | NUMBER | 本位币余额 |
USD_YTD_BALANCE | NUMBER | 外币折美元余额 |
人民币
本位币
外币折美元
如果币种为RMB,则取出人民币余额作为本期余额;为CNY,则取本位币余额;为USD
则取外币折美元余额。
请编写一个函数GetCurrBal(
qrp_rq IN VARCHAR2, --报表日期
qrp_code IN VARCHAR2 --币种
)
CREATE OR REPLACE FUNCTION GetCurrBal(
Vqrp_rq Date , --报表日期
Vqrp_code VARCHAR2 --币种
)
RETURN NUMBER
IS
VAMOUNT NUMBER ;
VDATE Date;
BEGIN
SELECT ACCOUNTING_DATE INTO VDATE FROM CCB_GYB
Where ACCOUNTING_DATE = Vqrp_rq;
IF Vqrp_code = 'RMB' THEN
SELECT RMB_YTD_BALANCE INTO VAMOUNT FROM CCB_GYB WHERE Vqrp_code= 'RMB'
AND ACCOUNTING_DATE= VDATE;
ELSE
IF Vqrp_code = 'CNY' THEN
SELECT CNY_YTD_BALANCE INTO VAMOUNT FROM CCB_GYB WHERE Vqrp_code= 'CNY';
ELSE
SELECT USD_YTD_BALANCE INTO VAMOUNT FROM CCB_GYB WHERE Vqrp_code= 'USD';
END IF ;
END IF ;
COMMIT;
RETURN VAMOUNT;
END;
---对多行处理,用游标
---多单行处理,用SELECT
实现此功能,并能在sqlplus里调用。
其中建表语句如下:
create table CCB_GYB
(
ACCOUNTING_DATE DATE,
RMB_YTD_BALANCE NUMBER,
CNY_YTD_BALANCE NUMBER,
USD_YTD_BALANCE NUMBER
);
创建索引:create unique index CCB_GYB_IDX on CCB_GYB (ACCOUNTING_DATE);
3.假设有张学生成绩表(CJ)如下
[姓名] [学科] [成绩]
张三 语文 80
张三 数学 86
张三 英语 75
李四 语文 78
李四 数学 85
李四 英语 78
现有需求如下:
(1)要求统计分数段的人数。显示结果为:
[成绩] [人数]
0<成绩<60 0
60<成绩<80 0
80<成绩<100 5
CREATE OR REPLACE Procedure SCOUNT
Is
VCOUNT1 Varchar2(10);
VCOUNT2 Varchar2(10);
VCOUNT3 Varchar2(10);
Begin
Select Count(*) Into VCOUNT1 From CJ Where SCORE Between 0 And 60;
Select Count(*) Into VCOUNT2 From CJ Where SCORE Between 61 And 80;
Select Count(*) Into VCOUNT3 From CJ Where SCORE Between 81 And 100;
dbms_output.put_line ('分数'|| ‘ ‘|| ‘人数’);
dbms_output.put_line ('0<成绩<60'|| ‘ ‘||VCOUNT1);
dbms_output.put_line ('60<成绩<80'|| ‘ ‘|| VCOUNT2);
dbms_output.put_line ('81<成绩<100'|| ‘ ‘|| VCOUNT3);
End;
(2)要求根据姓名,把各科成绩显示在一条记录里。显示结果如下:
姓名 语文 数学 英语 总成绩
---------- ---------- ---------- ---------- ----------
李四 78 85 78 241
张三 80 86 75 241
总分 158 171 153 482
(Select D.SSNAME,D.SSOCRE 数学,D.YSCORE 语文,D.ESCORE 英语 ,Sum(D.SSOCRE+D.YSCORE+D.ESCORE) 总成绩 From
(Select A.SNAME SSNAME ,A.SCORE SSOCRE,B.SCORE YSCORE,C.SCORE ESCORE From CJ A ,CJ B ,CJ C Where A.SNAME=B.SNAME
And C.SNAME=A.SNAME And A.XK='语文' And B.XK='数学' And C.XK='英语')D
Group By D.SSNAME,D.SSOCRE,D.YSCORE,D.ESCORE
)
Union All
(Select '总分' 姓名,Sum(FF.BB) 数学 ,Sum(FF.CC) 语文,Sum(FF.DD) 英语,Sum(FF.EE) 总成绩 From
(Select D.SSNAME AA,D.SSOCRE BB,D.YSCORE CC,D.ESCORE DD,Sum(D.SSOCRE+D.YSCORE+D.ESCORE) EE From
(Select A.SNAME SSNAME ,A.SCORE SSOCRE,B.SCORE YSCORE,C.SCORE ESCORE From CJ A ,CJ B ,CJ C Where A.SNAME=B.SNAME
And C.SNAME=A.SNAME And A.XK='语文' And B.XK='数学' And C.XK='英语') D
Group By D.SSNAME,D.SSOCRE,D.YSCORE,D.ESCORE
) FF)
行转列
Select SNAME ,SUM(DECODE(XK,'语文',SCORE,0)) 语文,Sum(DECODE(XK,'数学',SCORE,0)) 数学 ,Sum(DECODE(XK,'英语',SCORE,0)) 英语 , SUM(SCORE) AA From CJ
Group By SNAME
Union All
Select '总分' ,Sum(DECODE(XK,'语文',SCORE,0)) 语文,Sum(DECODE(XK,'数学',SCORE,0)) 数学 ,Sum(DECODE(XK,'英语',SCORE,0)) 英语 , SUM(SCORE) From CJ
使用SQL语句或存储过程(显示结果时可用dbms_output打印出来)实现这两个功能。
DBMS_OUTPUT.PUT_LINE(‘姓名’ ‘语文’ ‘数学’ ‘英语’ ‘总成绩’)
4.某一客户表包含如下信息:
INDIVIDUALID | 客户ID | VARCHAR2(20)(唯一键) |
BIRTHDATE | 出生日期 | Date |
GENDER | 性别 | VARCHAR2(10) |
SALARY | 月收入 | NUMBER(10,2) |
CERT-TYPE | 证件类型 | VARCHAR2(10) |
CERT-NO | 证件号码 | VARCHAR2(20) |
CREATED-TS | 进入系统的时间 | TIMESTAMP |
属性列 | 列长度 | 备注 |
INDIVIDUALID | 20 | |
BIRTHDATE | 8 | 格式为:yyyymmdd |
GENDER | 10 | |
SALARY | 13 | |
CERT-TYPE | 10 | |
CERT-NO | 20 | |
CREATED-TS | 17 | 格式为:yyyymmddhh24missff3 |
请编写程序实现该导出功能。
创建表脚本:
create table tb1010(
INDIVIDUALID VARCHAR2(20),
BIRTHDATE date,
GENDER VARCHAR2(10),
SALARY NUMBER(10,2),
CERT_TYPE VARCHAR2(10),
CERT_NO VARCHAR2(20),
CREATED_TS TIMESTAMP
);
5.某语音电话本表信息如下:
Call_book_info
MOBILE_ID | 移动号码 | VARCHAR2(12) |
CALLIN_TIME | 呼入时间 | Date |
CALLOUT_TIME | 呼出时间 | Date |
STATUS | 状态 | CHAR(1) |
要求如下:
(1)为保证删除的数据以后可查,在删除时要先做备份,备份不成功则不能进行删除。
(2)要有日志记录,比如删除所花时间,删除成功了多少条,失败多少条等操作信息。
(3)如果出现性能问题,要跟踪原因。生成trace文件进行分析,改进程序。
6.阅读下列说明,回答问题1至问题5。
【说明】
某工厂的信息管理数据库的部分关系模式如下所示:
职工(职工号,姓名,年龄,月工资,部门号,电话,办公室)
部门(部门号,部门名,负责人代码,任职时间)
关系模式的主要属性、含义及约束如表2-1所示,“职工”和“部门”的关系示例分别如表2-2和表2-3所示。
表2-1主要属性、含义及约束
表2-2 “职工”关系
表2-3“部门”关系
【问题1】
根据上述说明,由SQL定义的“职工”和“部门”的关系模式,以及统计各部门的人数C、工资总数Totals、平均工资Averages的D_S视图如下所示,请在空缺处填入正确的内容。(6分)
Create Table 部门(部门号 CHAR(1) (a) ,
部门名 CHAR(16),
负责人代码 CHAR(4),
任职时间 DATE,
(b) (职工号));
Create Table 职工(职工号 CHAR(4),
姓名 CHAR(8),
年龄 NUMDER(3),
月工资 NUMDER(4),
部门号 CHAR(1),
电话 CHAR(8),
办公室 CHAR(8),
(a) (职工号),
(c) (部门号),
CHECK( (d) ));
Create View D_S(D,C,Totals,Averages) As
(Select 部门号, (e)
from 职工
(f) ;
【问题2】
对于表2-2、表2-3所示的“职工”和“部门”关系,请指出下列各行是否可以插入,为什么?(3分)
(1) 1001 王新军 28 1000 1 8001234 主楼201
(2) 2003 李 力 28 1000
(3) 5802 赵晓啸 36 1500 6 8001568 3号楼503
【问题3】
在问题1定义的视图D_S上,下面哪个查询或更新是允许执行的,为什么?(3分)
(1) Update D_S set D=3 where D=4;
(2) Delete from D_S where C>4;
(3) Select D,Averages from D_S
where C>(Select C from D_S where D=:dept);
(4) Select D,C from D_S
where Totals>10000;
(5) Select * from D_S;
【问题4】
查询每个部门中月工资最高的“职工号”的SQL查询语句如下:
Select 职工号 from 职工 E
Where 月工资=(Select Max(月工资)
from 职工as M
where M.部门号=E.部门号)
(1)请用30字以内文字简要说明该查询语句对查询效率的影响。(3分)
(2)对该查询语句进行修改,使它既可以完成相同功能,又可以提高查询效率。(3分)【问题5】
假定分别在“职工”关系中的“年龄”和“月工资”字段上创建了索引,如下的Select查询语句可能不会促使查询优化器使用索引,从而降低查询效率,请写出既可以完成相同功能又可以提高查询效率的SQL语句(2分)
Select 姓名,年龄,月工资from 职工
where 年龄>45 or 月工资<1000;下载本文