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;
..
如果你不着急,先按照语法改改。
如果很着急,再给你整段代码。
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;
(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 ;
给一段创建存储过程的参考代码,我想既然会写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
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28