最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

oracle_存储过程练习题

来源:动视网 责编:小OO 时间:2025-09-27 11:46:56
文档

oracle_存储过程练习题

1.创建用户kaifa(密码亦为kaifa),并分配connect,createtable,resource权限。TEMPOARYTABLESPACETEMPDATA;GRANTCONNECT,CREATETABLE,RESOURCETOKAIFA2.在做报表统计时,需要根据报表日期和币种从概要表中查询本期余额。概要表(CCB_GYB)信息如下:ACCOUNTING_DATEDATE报表日期(唯一索引)RMB_YTD_BALANCENUMBER人民币余额CNY_YTD_BALANCENUMBE
推荐度:
导读1.创建用户kaifa(密码亦为kaifa),并分配connect,createtable,resource权限。TEMPOARYTABLESPACETEMPDATA;GRANTCONNECT,CREATETABLE,RESOURCETOKAIFA2.在做报表统计时,需要根据报表日期和币种从概要表中查询本期余额。概要表(CCB_GYB)信息如下:ACCOUNTING_DATEDATE报表日期(唯一索引)RMB_YTD_BALANCENUMBER人民币余额CNY_YTD_BALANCENUMBE
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;

文档

oracle_存储过程练习题

1.创建用户kaifa(密码亦为kaifa),并分配connect,createtable,resource权限。TEMPOARYTABLESPACETEMPDATA;GRANTCONNECT,CREATETABLE,RESOURCETOKAIFA2.在做报表统计时,需要根据报表日期和币种从概要表中查询本期余额。概要表(CCB_GYB)信息如下:ACCOUNTING_DATEDATE报表日期(唯一索引)RMB_YTD_BALANCENUMBER人民币余额CNY_YTD_BALANCENUMBE
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top