当前位置: 代码迷 >> Oracle开发 >> 请问oracle中存储过程
  详细解决方案

请问oracle中存储过程

热度:251   发布时间:2016-04-24 08:03:56.0
请教oracle中存储过程
我想请问一下 我现在需要写一个存储过程 用于判断一个月有几周 例如(201004月就有5周 20100401-20100402 20100405-20100409 20100412-20100416 20100419-20100423 20100426-20100430)
 我现在有表如下:
  create table test(
  Id number not null, --ID
  weedNo number not null, --周号(1,2,3)
  beginDay varchar(20) not null,--开始时间
  endDay varchar(20) not null, --结束时间
  )
  
  我现在需要写一个存储过程 输入一个年份和月份就调用此存储过程 在数据库中添加多条记录
  请教高手 多谢!!

------解决方案--------------------
代码迷推荐解决方案:oracle存储过程,http://www.daimami.com/search?q=177537
------解决方案--------------------
SQL code
select trunc(next_day(sysdate,1),'mm') 第一周开始,trunc(next_day(sysdate,1),'dd') 第一周结束,trunc(next_day(sysdate,1),'dd')+1 第二周开始,trunc(next_day(sysdate,1)+7) 第二周结束 from dual;结果:第一周开始    第一周结束    第二周开始    第二周结束2010-05-01    2010-05-02    2010-05-03    2010-05-09
------解决方案--------------------
SQL code
SQL> select week_of_year + 1 - min(week_of_year) over() week_no_of_month,  2         first_day_of_week,  3         last_day_of_week  4    from (  5          select min(the_day) first_day_of_week,  6                 max(the_day) last_day_of_week,  7                 to_char(the_day, 'IW') week_of_year  8            from (  9                  --把一个月的日期都列出来 10                  select start_date + rownum - 1 the_day 11                    from ( 12                          select to_date('201004' || '01', 'yyyymmdd') start_date, 13                                 add_months(to_date('201004' || '01', 'yyyymmdd'), 1) - 1 end_date 14                            from dual 15                         ) 16                    connect by (start_date + rownum - 1) <= end_date 17                  ) t 18            group by to_char(the_day, 'IW') 19          ) 20  / WEEK_NO_OF_MONTH FIRST_DAY_OF_WEEK LAST_DAY_OF_WEEK---------------- ----------------- ----------------               1 2010/4/1          2010/4/4               2 2010/4/5          2010/4/11               3 2010/4/12         2010/4/18               4 2010/4/19         2010/4/25               5 2010/4/26         2010/4/30
------解决方案--------------------
判断一个月有几周的函数
SQL code
CREATE OR REPLACE FUNCTION weeknumOfMonth(p_month IN VARCHAR2)RETURN NUMBERASweeknum NUMBER;beginSELECT count(DISTINCT to_char(to_date(p_month,'yyyymm')+ROWNUM-1,'iw'))  into weeknumFROM dualCONNECT BY ROWNUM<=add_months(to_date(p_month,'yyyymm'),1)-to_date(p_month,'yyyymm');RETURN weeknum;exceptionWHEN others THEN  RETURN -1;END;
------解决方案--------------------
CREATE OR REPLACE PACKAGE SP_WEEK IS
-- 功能 : 一个月有几周,开始时间和结束时间
TYPE CUR IS REF CURSOR;
PROCEDURE SP_WEEK(P_YEARMONTH VARCHAR2,
C OUT CUR);
END SP_WEEK;

CREATE OR REPLACE PACKAGE BODY SP_WEEK IS
PROCEDURE SP_WEEK( P_YEARMONTH VARCHAR2,
C OUT CUR) IS
BEGIN
IF LENGTH(P_YEARMONTH)=6 THEN
OPEN C FOR
SELECT week_of_year + 1 - min(week_of_year) over() week_no_of_month,
first_day_of_week,
last_day_of_week
from (
select min(the_day) first_day_of_week,
max(the_day) last_day_of_week,
to_char(the_day, 'IW') week_of_year
from (
--把一个月的日期都列出来
select start_date + rownum - 1 the_day
from (
select to_date(P_YEARMONTH || '01', 'yyyymmdd') start_date,
add_months(to_date(P_YEARMONTH || '01', 'yyyymmdd'), 1) - 1 end_date
from dual
)
connect by (start_date + rownum - 1) <= end_date
  相关解决方案