天天看點

全面對比T-SQL與PL/SQL

1)資料類型

<col>

TSQL

PL/SQL

numeric(p,s)

numeric(p,s) or NUMBER(p,s)

decimal(p,s)

decimal(p,s) or NUMBER(p,s)

char(m)

Char(m)

varchar(m)

varchar2(m)

datetime

date

記錄

Record

表字段

%type

表記錄

%rowtype

Table

自動增長變量

AUTOINCREMENT

2)變量聲明、指派與引用

聲明

declare

 @ls_casher char(1),

 @ln_payAmt decimal(14,4)

 on_hand INTEGER;

 ls_casher char(1);

指派

select @ls_casher = 'A' or set@is=’A’

ls_casher:=’A’;

引用

if @ ls_casher = 'A'

if ls_casher = 'A' then

在SQL語句中指派

SELECT @ls_casher=sal FROM emp WHERE empno = emp_id;

SELECT sal INTO ls_casher FROM emp WHERE empno = emp_id;

在SQL語句中引用

SELECT * FROM emp WHERE sal = @ls_casher;

SELECT * FROM emp WHERE sal = ls_casher;

3)函數與操作符

字元串

連接配接

+

||

TRIM

LTRIM、RTRIM

SUBSTRING

SUBSTR、SUBSTRB

INSTR、INSTRB

right(str,n)

substr(str,-n)

日期

系統日期

getdate()

SYSDATE

空值判斷與處理

判斷

IS NULL

空值替換

Isnull(para,0)

NVL(para,0)

REPLACE(old_string, NULL, my_string)

 轉換

字元-&gt;日期

Convert(datetime, expr, style)

To_Date(format, expr)

字元&lt;-日期、數值

Convert(char(n), expr, style)

To_char(expr,format)

數值

To_Number()

語句

statement block

BEGIN...END

BEGIN...END;

conditional

1) IF…ELSE…

2) IF…ELSE IF…else…

3) CASE

1)IF..then...ELSE…end if;

2)If…then…

 elsif…else…endif

3)decode

Repeat

WHILE Boolean_expression

    {statement_block}

    [BREAK]

    [CONTINUE]

1)Loop …exit;…end loop;

2)loop…exit when…end loop;

3)WHILE condition LOOP

 sequence_of_statements;

  EXIT WHEN boolean_expression;

 END LOOP;

3)for…in [reverse]…loop

 …

 end loop;

GOTO

GOTO label

label:

GOTO label;

&lt;&lt;label&gt;&gt;

Exits unconditionally

RETURN

Return;

Sets a delay for statement execution

WAITFOR

Comment

--

/*…*/

PRINT

PRINT string

Set serveroutput on

dbms_output.put_line(string);

RAISERROR

EXECUTE

NULL statement

NULL;

4)遊标

DECLARE

DECLARE cursor_name CURSOR

[LOCAL | GLOBAL]

[FORWARD_ONLY | SCROLL]

[STATIC | KEYSET | DYNAMIC | FAST_FORWARD]

[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]

[TYPE_WARNING]

FOR select_statement

[FOR UPDATE [OF column_name [,...n]]]

   CURSOR cursor_name IS

      SELECT_statement;

open

Open cursor_name

Open cursor_name;

Fetch

Fetch cursor_name into

 var1,var2…

 %rowtype_var;

Close

Close cursor_name

Close cursor_name;

Attribute

@@FETCH_STATUS

@@CURSOR_ROWS

CURSOR_STATUS

%found

%notfound

%isopen

%rowcount

DEALLOCATE

DEALLOCATE cursor_name

隐式cursor

Select…into (僅可處理單行記錄)

5)觸發器

建立

CREATE TRIGGER trigger_name

ON table

[WITH ENCRYPTION]

{FOR {[DELETE][,][INSERT][,] [UPDATE] }

AS

    sql_statement [...n]

}

 Create or replace trigger t_name

 {before|after}{insert|update|delete}

 on table_name

 [for each row [when conditional]

類型(按觸發級别和時序)

after

行或語句

before or after

通路資料操縱行的值

通過表Inserted、Deleted通路

通過記錄 :New、 :Old通路,僅可用于行級觸發器

謂詞/函數/屬性

Inserting、updating、deleteing

Updating(col)

Update(col)

使能

Alter table tabname {disable|enable} trigger {t_name|all}

Alter trigger t_name {disable|enable}

限制

作為觸發語句的一部分,不可用事務控制指令

不能聲明和使用LONG、LONG RAW變量和列

删除

Drop trigger t_name

Drop trigger t_name;

6)過程

CREATE PROCEDURE] p_name

 [ {@parameter data_type} [VARYING] [= default] [OUTPUT] ] [,...n]

[WITH

 {

   RECOMPILE | ENCRYPTION

   | RECOMPILE, ENCRYPTION

 }

]

Create or replace procedure p_name

 [Para1 {in|out|inout} datatype[,…]

 [{:=|default} default_value]]

{IS|AS}

查詢

DROP PROCEDURE p_name

DROP PROCEDURE p_name;

調用

EXEC p_name [para1[,…]]

P_name[(para1[,…])];

參數

按位置傳遞

1)按位置傳遞

2)帶名傳遞

 P_name(para1=&gt;var1);

debit_account(amount =&gt; 500, acct_id =&gt; 10261);

7)資料字典/系統表

系統對象表

Dbo.sysobjects

User_source、User_objects(OBJ)、User_tables(TABS)、User_triggers、ALL_tables、All_View、All_catalog、All_objects

對象腳本

sp_helptext

DESC、ALL_source

使用者表

Sysusers

All_users

表列

All_tab_columns

依賴

All_dependencies

字典表說明

DICT

8)SQL

Select

Select @var=&lt;value&gt;

Select value into var from dual

Insert

insert / insert into

insert into

Delete

比較

Any, some, all

集合

Union、Union all、Intersect、Minus、

9)全局變量

語句執行成功

error

SQLCODE

select 是否有結果

exists

select...into + SQL%FOUND

10)     指令行查詢工具

ISQL

SQL PLUS

讀取、執行SQL檔案

Isql –Usa –Ppass –Shost –ifile

sqlplus [-s] user/pass@db -@filename

11)     雜項

在SQL語句中

Insert…With tablock

Insert…With Tablockx

Select…for update

Select…for readonly

獨立語句

set transcation isolation level to Read uncommited

select …for update of…;

lock table tabname in row share mode;

lock table tabname in share exclusive mode;

使用者連接配接數

資料庫檔案

Device

Tablespace

CREATE TABLESPACE testdb DATAFILE 'C:\ORANT\DATABASE\testdb.ORA' SIZE 20M AUTOEXTEND ON NEXT 2M;

CREATE ROLLBACK SEGMENT "RB_TESTDB" TABLESPACE "TESTDB";

ALTER ROLLBACK SEGMENT "RB_TESTDB" ONLINE;

顯示DML執行計劃

Show plan

Explain plan

保留點

¨         Save transcation Sp_name

¨         ROLLBACK TRANSACTION percentchanged

¨         Savepoint Sp_name

¨         Rollback to savepoint sp_name

對模式對象改名

Rename

分析對象

Analyze

Sp_help?

  1. select into 文法

   現在有表

tablea 

 cola int ,

 colb varchar(20)

)

   要把tablea中滿足條件(cola &lt;100)的記錄生成新的表tableb。

   在ms sqlserver 可以直接用select into文法:

select * into tableb 

where cola &lt; 100 

    在oracle中文法如下:

create table tableb 

as 

  select * from tablea 

    where cola &lt;100 

下一篇: T-SQL