执行一个获取某年月的工作日数。
从网上找了个代码执行CREATE OR REPLACE FUNCTION Get_WorkingDays(
  ny IN VARCHAR2
  ) RETURN INTEGER IS
  /*-----------------------------------------------------------------------------------------
  函数名称:Get_WorkingDays
  
  中文名称:求某一年月中共有多少工作日
  
  作者姓名: XINGPING
  
  编写时间: 2004-05-23
  
  输入参数:NY:所求包含工作日数的年月,格式为yyyymm,如200405 中国.网管联盟 
  
  返 回 值:整型值,包含的工作日数目。
  
  算法描述:使用Last_day函数计算出参数所给年月共包含多少天,根据这个值来构造一个循环。在这个循环中先求这个月的每一天和一个已知是星期天的日期(2001-12-30是星期天)的差,所得的差再对7求模。如果所求日期在2001-12-30以前,那么所得的差既是负数,求模后所得值范围为大于-6,小于0,如-1表示星期六,故先将求模的结果加7,再求7的模. 如过所得值不等于0和6(即不是星期六和星期天),则算一个工作日。
  ----------------------------------------------------------------------------------------*/
  Result INTEGER := 0;
  myts INTEGER;   --所给年月的天数
  scts INTEGER;   --某天距2001-12-30所差的天数
  rq  DATE;
  djt INTEGER := 1;  --
  BEGIN
  myts := to_char(last_day(to_date(ny,’yyyymm’)),’dd’);
  LOOP
  rq := TO_date(ny||substr(100+djt,2),’yyyymmdd’);
  scts := rq - to_date(’2001-12-30’,’yyyy-mm-dd’);
  IF MOD(MOD(scts,7)+7,7) NOT IN(0,6) THEN
  Result := Result + 1;
  END IF;
  djt := djt + 1;   EXIT WHEN djt>myts;
  END LOOP;
  RETURN Result;
  END Get_WorkingDays;报错如下Compilation errors for FUNCTION SCOTT.GET_WORKINGDAYSError: PLS-00103: 出现符号 ""在需要下列之一时:
        begin function package pragma
          procedure subtype type use <an identifier>
          <a double-quoted delimited-identifier> form current cursor
          external language
Line: 3
Text:   Result INTEGER := 0;

解决方案 »

  1.   

    SQL> ed
    已写入 file afiedt.buf  1  CREATE OR REPLACE FUNCTION Get_WorkingDays(ny IN VARCHAR2) RETURN number
      2  IS
      3  res number:=0;
      4  num number;
      5  v_dt date;
      6  begin
      7  select extract(day from last_day(to_date(ny,'yyyymm'))) into num from dual;
      8  for i in 1..num loop
      9  select to_date(ny,'yyyymm')+i-1 into v_dt from dual;
     10  if to_char(v_dt,'d') in (2,3,4,5,6) then
     11  res:=res+1;
     12  end if;
     13  end loop;
     14  return res;
     15* end;
    SQL> /函数已创建。SQL> select Get_WorkingDays('201101') from dual
      2  /GET_WORKINGDAYS('201101')
    -------------------------
                           21
      

  2.   

    SQL> ed
    已写入 file afiedt.buf  1  CREATE OR REPLACE FUNCTION Get_WorkingDays(ny IN VARCHAR2) RETURN number
      2  IS
      3  res number:=0;
      4  num number;
      5  v_dt date;
      6  begin
      7  select extract(day from last_day(to_date(ny,'yyyymm'))) into num from dual;
      8  for i in 1..num loop
      9  select to_date(ny,'yyyymm')+i-1 into v_dt from dual;
     10  if to_char(v_dt,'d') in (2,3,4,5,6) then
     11  res:=res+1;
     12  end if;
     13  end loop;
     14  return res;
     15* end;
    SQL> /函数已创建。SQL> select Get_WorkingDays('201101') from dual
      2  /GET_WORKINGDAYS('201101')
    -------------------------
                           21