顯示具有 Oracle 標籤的文章。 顯示所有文章
顯示具有 Oracle 標籤的文章。 顯示所有文章

2011年3月8日 星期二

設定 Oracle User 的連線上限


利用 User Profile 的功能

-- 首先利用 system 帳號檢查是否系統的 resource_limit 的狀態
SQL> show parameter resource_limit
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
resource_limit                       boolean     FALSE 

-- 將 resource_limit 啟動
SQL> alter system set resource_limit=true;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
resource_limit                       boolean     TRUE

-- 建立一個 profile 來限定 csims 的連線上限 (假設 20), session_limit20 隨便您定義

SQL> create profile session_limit20 limit sessions_per_user 20;
Profile created.

-- 把新建的 profile apply 到 csims 帳號
SQL> alter user csims profile session_limit20;

User altered.

-- 移去該 profile
SQL> drop profile session_limit20 cascade;

-- 回復 Account 對應的 profile
SQL> alter user csims profile default;


CREATE PROFILE profile
LIMIT { resource_parameters
         | password_parameters
         }
           [ resource_parameters
           | password_parameters
           ]... ;
           
可限定的有一大堆,   
<resource_parameters>
{ { SESSIONS_PER_USER
 | CPU_PER_SESSION
 | CPU_PER_CALL
 | CONNECT_TIME
 | IDLE_TIME
 | LOGICAL_READS_PER_SESSION
 | LOGICAL_READS_PER_CALL
 | COMPOSITE_LIMIT
 }
 { integer | UNLIMITED | DEFAULT }
| PRIVATE_SGA
 { integer [ K | M ] | UNLIMITED | DEFAULT }
}
< password_parameters >
{ { FAILED_LOGIN_ATTEMPTS
 | PASSWORD_LIFE_TIME
 | PASSWORD_REUSE_TIME
 | PASSWORD_REUSE_MAX
 | PASSWORD_LOCK_TIME
 | PASSWORD_GRACE_TIME
 }
 { expr | UNLIMITED | DEFAULT }
| PASSWORD_VERIFY_FUNCTION
     { function | NULL | DEFAULT }
}

可設定 User 的最多連線 (SESSIONS_PER_USER), 連線時間  (CONNECT_TIME)

2010年7月15日 星期四

流水號

SQL Server 的資料列流水號
select ROW_NUMBER() over (order by column) , ...
Oracle  的資料列流水號
select rownum, ...

2010年5月24日 星期一

如何查詢欄位中有 '/' 或其他分割符號的資料

首先說明, 本篇功能只適用於 Oracle 9i 以上

先建立以下的 Collection Type

CREATE TYPE tstrings AS TABLE OF VARCHAR2(1000);

再來建立兩個 Function

一個是分割用的的 function (Split), 這是網路找到的(推!)

CREATE OR REPLACE FUNCTION Split

(

PC$Chaine IN VARCHAR2, -- input string

PN$Pos IN PLS_INTEGER, -- token number

PC$Sep IN VARCHAR2 DEFAULT ',' -- separator character

)

RETURN VARCHAR2

IS

LC$Chaine VARCHAR2(32767) := PC$Sep || PC$Chaine ;

LI$I PLS_INTEGER ;

LI$I2 PLS_INTEGER ;

BEGIN

LI$I := INSTR( LC$Chaine, PC$Sep, 1, PN$Pos ) ;

IF LI$I > 0 THEN

LI$I2 := INSTR( LC$Chaine, PC$Sep, 1, PN$Pos + 1) ;

IF LI$I2 = 0 THEN LI$I2 := LENGTH( LC$Chaine ) + 1 ; END IF ;

RETURN( SUBSTR( LC$Chaine, LI$I+1, LI$I2 - LI$I-1 ) ) ;

ELSE

RETURN NULL ;

END IF ;

END;


另一個 function 則是建立將分割的字串轉成 Collection

CREATE OR REPLACE FUNCTION cosites

( v_cosites varchar2, delimiter varchar2 default '/') RETURN TSTRINGS IS

result TStrings := TStrings();

i integer;

str varchar(100);

BEGIN

i := 1;

loop

str := split(v_cosites, i, delimiter);

exit when str is null;

result.extend(1);

result(i) := str;

i := i + 1;

end loop;

return result;

END;

到這邊工具就準備好了,接著試試看結果囉..

select * from Table(cosites('A100/B100/C100'))

結果就會出現

A100

B100

C100