+ -
当前位置:首页 → 问答吧 → sqlserver 存储过程与oracle存储过程的语法区别,应该怎么变动

sqlserver 存储过程与oracle存储过程的语法区别,应该怎么变动

时间:2011-11-06

来源:互联网


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 @Time

SET @start=@Time --开始时间累加
END
select * from @tb 

作者: pdw391624592   发布时间: 2011-11-06

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;
..
如果你不着急,先按照语法改改。
如果很着急,再给你整段代码。

作者: yixilan   发布时间: 2011-11-07

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;

作者: yixilan   发布时间: 2011-11-07

你的意思是要把T-SQL的存储过程改为PL/SQL的存储过程
给一段创建存储过程的参考代码,我想既然会写T-SQL的存储过程,应该能看懂。

[code=SQL][/code]
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 ;

作者: LuiseRADL   发布时间: 2011-11-07

代码没贴好,重新贴一下。
SQL code

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 ;

作者: LuiseRADL   发布时间: 2011-11-07