视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
oracle_存储过程练习题
2025-09-27 11:46:56 责编:小OO
文档
1.创建用户kaifa(密码亦为kaifa), 并分配connect,create table,resource权限。

TEMPOARY TABLESPACE TEMPDATA;

GRANT CONNECT , CREATE TABLE , RESOURCE TO KAIFA

2.在做报表统计时,需要根据报表日期和币种从概要表中查询本期余额。

概要表(CCB_GYB)信息如下:

ACCOUNTING_DATEDATE报表日期(唯一索引)
RMB_YTD_BALANCENUMBER人民币余额
CNY_YTD_BALANCENUMBER本位币余额
USD_YTD_BALANCENUMBER外币折美元余额
其中币种代码如下:

 人民币

 本位币

 外币折美元

如果币种为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客户IDVARCHAR2(20)(唯一键)
BIRTHDATE出生日期Date
GENDER性别VARCHAR2(10)
SALARY月收入NUMBER(10,2)
CERT-TYPE证件类型VARCHAR2(10)
CERT-NO证件号码VARCHAR2(20)
CREATED-TS进入系统的时间TIMESTAMP
现要把该表数据导出成文件,导出的内容格式如下:

属性列列长度备注
INDIVIDUALID20
BIRTHDATE8格式为:yyyymmdd

GENDER10
SALARY13
CERT-TYPE10
CERT-NO20
CREATED-TS17格式为:yyyymmddhh24missff3

要求每个字段列的内容长度是固定的,不足部分由空格补齐,字符串左对齐(右补空格),数字右对齐。如果列的内容为null,需先进行处理,字符串默认为空格,数字默认为0,日期默认为99991231,时间戳默认为99991231000000000。

请编写程序实现该导出功能。

 

创建表脚本:

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)
在某次大批量操作后,数据记录达到100万,MOBILE_ID估计有2万个重复,现要求删除重复的号码(只保留一条),因为该表是业务表,删除时不能影响业务的正常使用。编写存储过程实现删除重复号码的功能。

要求如下:

(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;下载本文

显示全文
专题