CREATE proc [dbo].[Proc_Inrate]
(
@start DATETIME='2010-11-14',
@end   DATETIME='2010-12-1',
@unit VARCHAR(20)='day'
)
AS
--创建临时表
declare @tb TABLE
(
开始时间 datetime ,结束时间 datetime,呼入总量 int,呼入接通量 int,
通话时长 int,震铃时长 INT,队列等待量 INT,队列等待时长 INT
);
declare @Time DATETIME ;--时间单位
set @Time = @start;
while @end > @start --时间循环
begin 
 if(@unit='min')  set @Time=DATEADD(mi,30,@start)
else if(@unit='hour') set @Time=DATEADD(hh,1,@start)
else if(@unit='day')  set @Time=DATEADD(d,1,@start)
else if(@unit='month')set @Time=DATEADD(m,1,@start);INSERT INTO @tb --结果插入至临时表中
SELECT 
 @start AS [开始时间]
,@Time AS [结束时间] 
,COUNT(id) AS [呼入总量]
,ISNULL(SUM(CASE WHEN AnswerFlag=1 THEN 1 ELSE 0 END),0) AS [呼入接通量]
,ISNULL(SUM(CASE WHEN AnswerFlag=1 THEN TalkDuration ELSE 0 END),0) AS [通话时长]
,ISNULL(SUM(CASE WHEN AnswerFlag=1 THEN WaitTime ELSE 0 END),0) AS [震铃时长]
,ISNULL(SUM(CASE WHEN AgentGrp<>-1 AND AgentId = '' THEN 1 ELSE 0 END),0) AS [队列等待量]
,ISNULL(SUM(CASE WHEN AnswerFlag=0 AND AgentGrp<>-1 THEN QueueDuration ELSE 0 END),0) AS [队列等待时长]
FROM dbo.rc_calllog 
WHERE io=0 AND InboundCallTime BETWEEN @start AND @TimeSET @start=@Time --开始时间累加
END
select * from @tb 

解决方案 »

  1.   

    1.过程参数定义,把@号,和长度去掉:
    CREATE proc [dbo].[Proc_Inrate]
    (
    in_start date,
    in_end date,
    unit VARCHAR
    )
    2.
    创建临时表和定义变量的地方写到过程里的as块中:
    as
    unitTime DATE ;--时间单位
    sql_text varchar2(4096) := '';
    --创建临时表
    sql_text := 'create TABLE tb 
    (
    starttime date,endtime date ,call_in number(10), call_up number(10),
    calltime number(10),ringtime number(10), waitcount number(10), waittime number(10)
    )';
    3.其他建表、赋值和处理写到begin..end块中
    BEGIN --大的BEGIN块
    unitTime = in_start;
    --建表
    execute immediate sql_text;
    while in_end > in_start --时间循环
    begin  
    ..
    end
    END; --大的END块
    4.所有变量前的@都去掉,赋值时不用set,直接用变量:=...
    if(unit='min') then 
      unittime:=dateadd(mi,30,start);
    endif;
    ..
    如果你不着急,先按照语法改改。
    如果很着急,再给你整段代码。
      

  2.   

    5.对于DATEADD的处理
    (1)set @Time=DATEADD(mi,30,@start) --加30分钟
    select sysdate+ 30/(24*60) into time from dual;
    (2)set @Time=DATEADD(hh,1,@start) --加1小时
    select sysdate+ 1/24 into time from dual;
    (3)set @Time=DATEADD(d,1,@start) --加1天
    select sysdate+ 1 into time from dual;
    (4)set @Time=DATEADD(m,1,@start) --加1个月
    select add_months(sysdate, 1) into time from dual;
      

  3.   

    你的意思是要把T-SQL的存储过程改为PL/SQL的存储过程
    给一段创建存储过程的参考代码,我想既然会写T-SQL的存储过程,应该能看懂。
    CREATE OR REPLACE PROCEDURE raise_salary(emp_id NUMBER, increase NUMBER) 
    AS
    ex1 EXCEPTION ;
    errm VARCHAR(100) ;
    BEGIN
    UPDATE Emp SET salary = salary + increase WHERE Id = emp_id ;
    IF SQL%NOTFOUND THEN
    RAISE ex1 ;
    END IF ;
    EXCEPTION
    WHEN ex1 THEN
    DBMS_OUTPUT.PUT_LINE('emp id error') ;
    WHEN OTHERS THEN
    errm := SQLERRM ;
    DBMS_OUTPUT.PUT_LINE(SUBSTR(errm, 1, 70)) ;
    END ;
      

  4.   

    代码没贴好,重新贴一下。CREATE OR REPLACE PROCEDURE raise_salary(emp_id NUMBER, increase NUMBER) 
    AS
    ex1 EXCEPTION ;
    errm VARCHAR(100) ;
    BEGIN
    UPDATE Emp SET salary = salary + increase WHERE Id = emp_id ;
    IF SQL%NOTFOUND THEN
    RAISE ex1 ;
    END IF ;
    EXCEPTION
    WHEN ex1 THEN
    DBMS_OUTPUT.PUT_LINE('emp id error') ;
    WHEN OTHERS THEN
    errm := SQLERRM ;
    DBMS_OUTPUT.PUT_LINE(SUBSTR(errm, 1, 70)) ;
    END ;