oracle與sqlserver的十大區別
阿新 • • 發佈:2019-01-07
--sql server 與 oracle的區別:
--DBMS 資料庫管理系統
--1.資料型別不同。
--sql server 的資料型別:int ,smallint ,char,varchar,nchar,nvarchar,ntext,datetime,smalldatetime,money,decima,
--float,bit……
--oracle 的資料型別:number(p,s),char,varchar2,Date,LOB
--注意:insert into table_name values('1','張三','男',to_date ('2012-3-5','YYYY-MM-DD'));---插入字串日期前加date轉換型別
--2.獲得當前系統時間的函式不同。
--sql server :getdate()
--oracle:sysdate
--例如:設定日期格式的函式:to_char(sysdate,'yyy-mm-dd');
--3.在oracle中沒有預設約束的說法
--sql server 中新增預設約束:alter table talbe_name add DF_table_name default('男') for sex;
--oracle 中新增預設值:alter table table_name modify(sex default('男'));
--4.連線變數和字串的方式不一樣
--sql server 中連線:使用“+”連線,例如:print 'aaaa'[email protected];
--oracle 中連線:使用“||”連線,例如:dbms_output.put_line('aaa'||name);---name為變數
--5.oracle沒有identity自動增長列,而是使用序列實現增長
--sql server 自動增長:在表的主鍵列中可直接使用identity(1,1)實現增長
--oracle 使用序列自動增長:
create sequence se_id
start with 1
increment by 1
--使用序列實現自動增長:se_id.nextval
--6.條件語句if……else……的語法不同
--sql server中:
if 條件
begin
…………
end
else
begin
…………
end
--oracle中:
if 條件1 then
…………;
elsif 條件2 then
…………;
else
…………;
end if;
--7.case語句的語法不同
--sql server中:
--select ....case.....(else)....end....語句
select stuno '學號',case
when grade>=90 and grade<=100 then '★★★★'
when grade>=80 and grade<90 then '★★★'
when grade>=70 and grade<80 then '★★'
when grade>=60 and grade<70 then '★'
else '差'
end as '等級' from score
go
--oracle中:
declare
nums number:=&nos;--&nos表示提示傳入值
begin
case nums
when 100 then
dbms_output.put_line('滿分也,不錯');
when 90 then
dbms_output.put_line('90分頁很不錯了');
end case;
end;
--8.觸發器建立語法不同
--sql server中:
--首先判斷觸發器是否已經存在
if exists (select * from sys.sysobjects where name='tr_delete')
--如果存在先刪除
drop trigger tr_delete
go
--建立觸發器
create trigger tr_delete
on bookInfo
instead of delete
as
--定義變數
declare @bookid int
select @bookid=Bookid from deleted---deleted執行刪除語句( delete from BookInfo where BookId=1),自動生成的deleted表
--刪除與該圖書的相關記錄(先刪除從表再刪除主表)
delete from borrowinfo where [email protected]
delete from backinfo where [email protected]
delete from BookInfo where [email protected]
--判斷
if @@error<>0
begin
print '刪除失敗'
rollback transaction
end
else
begin
print '刪除成功'
end
go
delete from BookInfo where BookId=1
--oracle中:
--建立觸發器
create or replace trigger tri_test
before insert or update or delete
on table_name
[for each row]---如果要使用 :new /:old 就必須使用行觸發器
declare
nums varchar2(20);
begin
select 'F'||lpad('aa',5,0) into nums from dual;
end;
--9.oracle中的儲存過程
--sql server中儲存過程:
--判斷儲存過程是否已經存在
if exists(select * from sys.sysobjects where name='proc_name')
--如果存在先刪除
drop proc proc_name
go
--建立儲存過程語句
create proc/procedure proc_name
@引數名1 資料型別 [out/output],
@引數名2 資料型別 [out/output]
as
…………
go
--呼叫儲存過程
--如果有輸出引數,則需定義變數(假設@引數2為輸出引數)
declare @變數名 資料型別
exec proc_name @引數名1='aaa',@引數名[email protected]變數名 out
---oracle中帶遊標及迴圈的儲存過程
create or replace procedure proc_selCurrent
(
names varchar2
)
as
cursor cursor_sel
is
select DepositSum,cardType,name,state from CurrentAccount where name like '%'||names||'%';
dd number;
cc number;
nn varchar2(20);
sta number;
begin
open cursor_sel;
loop
fetch cursor_sel into dd,cc,nn,sta;
dbms_output.put_line('存款金額:'||dd||'姓名:'||nn);
exit when cursor_sel%notfound;
end loop;
close cursor_sel;
end;
--呼叫儲存過程
begin
proc_selCurrent('a');
end;
--10.建立使用者的方式不同
--sql server中
--1、建立登陸賬號:sa-----123456
create Login 登陸名稱 with password='登陸密碼'
--修改登陸賬戶:
alter Login 登陸名稱 with name='新登入名稱' and password='新登入密碼'
--禁用/啟用登陸賬號
alter Login 登入名稱 disable(禁用)/enable(啟用)
--刪除登陸賬號
drop Login 登入名稱
--2、建立使用者:
create user 使用者名稱 for/from Login 登陸名稱
--修改使用者名稱
alter user 使用者名稱 with name='新使用者名稱'
--刪除使用者名稱
drop user 使用者名稱
---授許可權
grant select/update/delete/insert on 表名 to 使用者名稱
---oracle中:
---建立使用者語法:
create user 使用者名稱
identified by 密碼
default tablespace users
temporary tablespace temp
quota 10M on users
--修改密碼:
alter user 使用者名稱 identified by 新密碼
--授予許可權:
grant create session to 使用者名稱
--刪除使用者
drop user 使用者名稱 cascade;
--DBMS 資料庫管理系統
--1.資料型別不同。
--sql server 的資料型別:int ,smallint ,char,varchar,nchar,nvarchar,ntext,datetime,smalldatetime,money,decima,
--float,bit……
--oracle 的資料型別:number(p,s),char,varchar2,Date,LOB
--注意:insert into table_name values('1','張三','男',to_date
--2.獲得當前系統時間的函式不同。
--sql server :getdate()
--oracle:sysdate
--例如:設定日期格式的函式:to_char(sysdate,'yyy-mm-dd');
--3.在oracle中沒有預設約束的說法
--sql server 中新增預設約束:alter table talbe_name add DF_table_name default('男') for sex;
--oracle 中新增預設值:alter table table_name modify(sex default('男'));
--4.連線變數和字串的方式不一樣
--sql server 中連線:使用“+”連線,例如:print 'aaaa'[email protected];
--oracle 中連線:使用“||”連線,例如:dbms_output.put_line('aaa'||name);---name為變數
--5.oracle沒有identity自動增長列,而是使用序列實現增長
--sql server 自動增長:在表的主鍵列中可直接使用identity(1,1)實現增長
--oracle 使用序列自動增長:
create sequence se_id
start with 1
increment by 1
--使用序列實現自動增長:se_id.nextval
--6.條件語句if……else……的語法不同
--sql server中:
if 條件
begin
…………
end
else
begin
…………
end
--oracle中:
if 條件1 then
…………;
elsif 條件2 then
…………;
else
…………;
end if;
--7.case語句的語法不同
--sql server中:
--select ....case.....(else)....end....語句
select stuno '學號',case
when grade>=90 and grade<=100 then '★★★★'
when grade>=80 and grade<90 then '★★★'
when grade>=70 and grade<80 then '★★'
when grade>=60 and grade<70 then '★'
else '差'
end as '等級' from score
go
--oracle中:
declare
nums number:=&nos;--&nos表示提示傳入值
begin
case nums
when 100 then
dbms_output.put_line('滿分也,不錯');
when 90 then
dbms_output.put_line('90分頁很不錯了');
end case;
end;
--8.觸發器建立語法不同
--sql server中:
--首先判斷觸發器是否已經存在
if exists (select * from sys.sysobjects where name='tr_delete')
--如果存在先刪除
drop trigger tr_delete
go
--建立觸發器
create trigger tr_delete
on bookInfo
instead of delete
as
--定義變數
declare @bookid int
select @bookid=Bookid from deleted---deleted執行刪除語句( delete from BookInfo where BookId=1),自動生成的deleted表
--刪除與該圖書的相關記錄(先刪除從表再刪除主表)
delete from borrowinfo where [email protected]
delete from backinfo where [email protected]
delete from BookInfo where [email protected]
--判斷
if @@error<>0
begin
print '刪除失敗'
rollback transaction
end
else
begin
print '刪除成功'
end
go
delete from BookInfo where BookId=1
--oracle中:
--建立觸發器
create or replace trigger tri_test
before insert or update or delete
on table_name
[for each row]---如果要使用 :new /:old 就必須使用行觸發器
declare
nums varchar2(20);
begin
select 'F'||lpad('aa',5,0) into nums from dual;
end;
--9.oracle中的儲存過程
--sql server中儲存過程:
--判斷儲存過程是否已經存在
if exists(select * from sys.sysobjects where name='proc_name')
--如果存在先刪除
drop proc proc_name
go
--建立儲存過程語句
create proc/procedure proc_name
@引數名1 資料型別 [out/output],
@引數名2 資料型別 [out/output]
as
…………
go
--呼叫儲存過程
--如果有輸出引數,則需定義變數(假設@引數2為輸出引數)
declare @變數名 資料型別
exec proc_name @引數名1='aaa',@引數名[email protected]變數名 out
---oracle中帶遊標及迴圈的儲存過程
create or replace procedure proc_selCurrent
(
names varchar2
)
as
cursor cursor_sel
is
select DepositSum,cardType,name,state from CurrentAccount where name like '%'||names||'%';
dd number;
cc number;
nn varchar2(20);
sta number;
begin
open cursor_sel;
loop
fetch cursor_sel into dd,cc,nn,sta;
dbms_output.put_line('存款金額:'||dd||'姓名:'||nn);
exit when cursor_sel%notfound;
end loop;
close cursor_sel;
end;
--呼叫儲存過程
begin
proc_selCurrent('a');
end;
--10.建立使用者的方式不同
--sql server中
--1、建立登陸賬號:sa-----123456
create Login 登陸名稱 with password='登陸密碼'
--修改登陸賬戶:
alter Login 登陸名稱 with name='新登入名稱' and password='新登入密碼'
--禁用/啟用登陸賬號
alter Login 登入名稱 disable(禁用)/enable(啟用)
--刪除登陸賬號
drop Login 登入名稱
--2、建立使用者:
create user 使用者名稱 for/from Login 登陸名稱
--修改使用者名稱
alter user 使用者名稱 with name='新使用者名稱'
--刪除使用者名稱
drop user 使用者名稱
---授許可權
grant select/update/delete/insert on 表名 to 使用者名稱
---oracle中:
---建立使用者語法:
create user 使用者名稱
identified by 密碼
default tablespace users
temporary tablespace temp
quota 10M on users
--修改密碼:
alter user 使用者名稱 identified by 新密碼
--授予許可權:
grant create session to 使用者名稱
--刪除使用者
drop user 使用者名稱 cascade;