FOR循环、游标、时间值函 数、转换函数题目

本文介绍如何使用Oracle SQL及PL/SQL实现基于日期的产量统计。通过FOR循环、游标、时间值函数等,计算特定日期的产量、昨天产量、本月产量、本年产量及去年同期产量,并提供具体实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ORACLE  <http://duyiwuer.javaeye.com/blog/356754> 的FOR循环、游标、时间值函

数、转换函数题目

 

 

 

 

 题目:假如输入变量是cur_date  varchar2

    统计以下变量:

        今天的产量  cur_date

        昨天的产量  to_char(to_date(cur_date,'yyyymmdd')-1,'yyyymmdd')

        本月的产量  substr(cur_date,1,6)

        本年的产量  substr(cur_date,1,4)

        去年同期的产量 to_char(add_months(to_date(cur_date,'yyyymmdd'),-12),

'yyyymmdd')

    1)用基本SQL来实现

 

    用FOR循环游标来实现

    考核的知识点:FOR循环,游标,时间值函数,转换函数,DECODE/CASE用法

 

这个题还需各位高手。

 

参考答案如下:

 

Sql代码 

 

1. select *  

2.    from factory  

3.    select to_char(to_date('20080602','yyyymmdd') -1,'yyyymmdd')  

4.    from dual    

5.    select

to_char(add_months(to_date(f.cur_date,'yyyymmdd'),-12),'yyyymmdd')  

6.    from dual  

7.    create table temp  

8.    as    

9.    select cur_date,(select   

10.                     sum(case when cur_date=f.cur_date then

cur_perout  

11.                     else 0  

12.                     end)  

13.                     from factory) a,  

14.                     (select   

15.                     sum(case when

cur_date=to_char(to_date(f.cur_date,'yyyymmdd') -1,'yyyymmdd')  

16.                     then cur_perout else 0  

17.                     end)  

18.                     from factory) b ,  

19.                     (select   

20.                     sum(case when

substr(cur_date,1,6)=substr(f.cur_date,1,6) then cur_perout  

21.                     else 0  

22.                     end)  

23.                     from factory) c,  

24.                     (select  

25.                      sum(case when

substr(cur_date,1,4)=substr(f.cur_date,1,4) then cur_perout  

26.                      else 0  

27.                     end)  

28.                     from factory) d,  

29.                     (select  

30.                     sum(case when

cur_date=to_char(add_months(to_date(f.cur_date,'yyyymmdd'),-12),'yyyymmdd')

 

31.                        then cur_perout else 0  

32.                     end)  

33.                     from factory) e  

34.                       

35.    from factory f  

36.    where rownum <1  

37.   -- where cur_date='20080602';  

38. begin   

39.  for temstr in (select * from factory) loop  

40.  insert into temp  

41.  select temstr.cur_date,--游标(不带字段/常量)  

42.         sum(case when cur_date=temstr.cur_date then cur_perout  

43.             else 0  

44.             end),  

45.         sum(case when

cur_date=to_char(to_date(temstr.cur_date,'yyyymmdd') -1,'yyyymmdd')   

46.         then cur_perout  

47.             else 0  

48.             end),  

49.         sum(case when

substr(cur_date,1,6)=substr(temstr.cur_date,1,6) then cur_perout  

50.             else 0  

51.             end),  

52.         sum(case when

substr(cur_date,1,4)=substr(temstr.cur_date,1,4) then cur_perout  

53.             else 0  

54.             end),  

55.         sum(case when

cur_date=to_char(add_months(to_date(temstr.cur_date,'yyyymmdd'),-12),'yyyymm

dd') then cur_perout  

56.             else 0  

57.             end)  

58.         from factory;   

59.  end loop;  

60. end;  

61.  select * from temp  

 

 

第4关:单循环游标 100 学习内容 记录 评论 任务描述 基础知识 游标的使用 注意事项 任务描述 编写一个单循环游标的存储过程,并调用它,打印表Student中所有学生的名字(Sname)年龄(Sage)两个字段的信息。 并将所有学生的信息使用","连接为一个字符串。 其中每个学生的信息格式如下: 姓名:Sname 年龄:Sage 如学生“张三”年龄为28,该学生的信息为 学生:张三 年龄:28 将信息存入result时可以使用concat函数,如果要将'我是字符串'字28连接到result的尾部,可使用以下语句: set result = concat(result, '我是字符串', 28) 在具体使用过程中可以将对应的常量替换为变量名。 注意:每个学生的信息中姓名年龄之间用空格隔开,学生信息之间用英文逗号隔开 基础知识 在 MySQL 中,存储过程或函数中的查询有时会返回多条记录,而使用简单的 SELECT 语句,没有办法得到第一行、下一行或前十行的据,这时可以使用游标来逐条读取查询结果集中的记录。游标在部分资料中也被称为光标。 关系据库管理系统实质是面向集合的,在 MySQL 中并没有一种描述表中单一记录的表达形式,除非使用关键字来限制只有一条记录被选中。所以有时我们必须借助于游标来进行单条记录的据处理。 游标的使用 下列语句是游标的声明语句,其中sql_select_statement的内容为查找的内容 DECLARE cursor_name CURSOR FOR sql_select_statement; 声明游标后,在使用游标逐行取据之前需要打开游标,语法如下: open cursor_name; 然后使用fetch关键字取据: fetch cursor_name into attri1, attr2...attrn; 每取一条据,可以按照需求使用一定的语句处理据了。在处理完成后,需要关闭游标: close cursor_name; 注意事项 在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令。如输入下面的语句: select * from table_name; 然后回车,那么MySQL将立即执行该语句。但比如存储过程、触发器、函数等很多场合下,根据需要不希望MySQL这么做。在为可能输入较多的语句,且语句中包含有分号。我们期望把它们作为一个整体,这时候可以使用关键字delimiter。这种情况下,就需要事先把delimiter换成其它符号,如//或。这样只有当//或出现之后,mysql解释器才会执行这段语句。 如下图的例子,在使用该关键字后,sql语句并不会马上进行解释执行。即便是语句内容,甚至语法不正确,系统也不会有任何反馈。当遇到终止符号后,系统马上执行封装好的多条语句,这是才报据错误。 delimiter use StuDB; -- 编写一个单循环游标的存储过程,并调用它,打印表Student中所有学生的名字(Sname)年龄(Sage)两个字段的信息。 -- 并将所有学生的信息使用","连接为一个字符串。 -- 其中每个学生的信息格式如下: -- 姓名:Sname 年龄:Sage -- 如学生“张三”年龄为128,该学生的信息为 -- 学生:张三 年龄:128 -- 将信息存入result时可以使用concat函数,如果要将'我是字符串'字128连接到result的尾部,可使用以下语句: -- set result = concat(result, '我是字符串', 128) -- 在具体使用过程中可以将对应的常量替换为变量名。 -- 注意:每个学生的信息中姓名年龄之间用空格隔开,学生信息之间用英文逗号隔开 drop procedure if exists proc_cursor; delimiter $$ create procedure proc_cursor() begin declare stdname varchar(100); declare stdage int; declare result varchar(4000) default ''; #将打印内容存入result中 #实现游标 #TODO end $$ call proc_cursor();
06-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值