Stone's Blog
ҽ
л
ҵBlog
¹鵵...
·...
ͳ...
վ...
Դ
===========================================================
Oracleݿαʹôȫ
===========================================================

תԣhttp://www.7880.com/info/Article-3fddcae0.html

SQLڷORACLEݿԣPL/SQLչͼǿSQLĹܣ ͬʱ˸ǿij߼ PL/SQL֧DMLSQL䡣DDLPL/SQLв֧֣ζPL/SQLвܴκζ󡣽Ϻ PL/SQLPL/SQLʹDBMS_SQLڽִEXECUTE IMMEDIATE̬SQLִDDLPL/SQL֤ԼûȨޡ

ǽ۸ڷORACLEݿDDLTCL䡣

ѯ

SELECTڴݿвѯݣPL/SQLʹSELECTʱҪINTOӾһʹãѯķֵINTOӾеıDELCAREСSELECT INTO﷨£

SELECT [DISTICT|ALL]{*|column[,column,...]}
INTO (variable[,variable,...] |record)
FROM {table|(sub-query)}[alias]
WHERE............

PL/SQLSELECTֻһݡһݣôҪʹʽα꣨αǽںУINTOӾҪSELECTӾͬıINTOӾҲǼ¼

%TYPE

PL/SQLпԽͳΪڽûͣһͬʱ̳ͺʹСֵֶ̬ǷdzõģõеͺʹСıˣʹ%TYPE,ôûͲ޸Ĵ룬ͱ޸Ĵ롣

v_empno SCOTT.EMP.EMPNO%TYPE;
v_salary EMP.SALARY%TYPE;

ʹ%TYPE,ұαꡢ¼ijʹ%TYPEڶͬ͵ıdzá
DELCARE
V_A NUMBER(5):=10;
V_B V_A%TYPE:=15;
V_C V_A%TYPE;
BEGIN
DBMS_OUTPUT.PUT_LINE
('V_A='||V_A||'V_B='||V_B||'V_C='||V_C);
END

SQL>/
V_A=10 V_B=15 V_C=
PL/SQL procedure successfully completed.

SQL>

DML

ݵDML:INSERTUPDATEDELETELOCK TABLE,ЩPL/SQLе﷨SQLе﷨ͬǰѾ۹DMLʹͲظˡDMLпʹ DECLAREıǶ׿飬ôҪע÷Χ

CREATE OR REPLACE PROCEDURE FIRE_EMPLOYEE (pempno in number)
AS
v_ename EMP.ENAME%TYPE;
BEGIN
SELECT ename INTO v_ename
FROM emp
WHERE empno=p_empno;

INSERT INTO FORMER_EMP(EMPNO,ENAME)
VALUES (p_empno,v_ename);

DELETE FROM emp
WHERE empno=p_empno;

UPDATE former_emp
SET date_deleted=SYSDATE
WHERE empno=p_empno;

EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Employee Number Not Found!');

END

DMLĽ

ִһDMLDMLĽĸαУЩڿƳ̻˽״̬DMLʱPL/SQL һڽα겢αάѯڴеһαDMLʱ򿪣ɺرաʽαֻʹSQL%FOUND,SQL% NOTFOUND,SQL%ROWCOUNT.SQL%FOUND,SQL%NOTFOUNDDzֵSQL%ROWCOUNTֵ

SQL%FOUNDSQL%NOTFOUND

ִκDMLǰSQL%FOUNDSQL%NOTFOUNDֵNULL,ִDMLSQL%FOUNDֵǣ

. TRUE :INSERT

. TRUE :DELETEUPDATEһбDELETEUPDATE.

. TRUE :SELECT INTOٷһ

SQL%FOUNDΪTRUEʱ,SQL%NOTFOUNDΪFALSE

SQL%ROWCOUNT

ִκDML֮ǰSQL%ROWCOUNTֵNULL,SELECT INTO䣬ִгɹSQL%ROWCOUNTֵΪ1,ûгɹSQL%ROWCOUNTֵΪ0ͬʱһ쳣NO_DATA_FOUND.

SQL%ISOPEN

SQL%ISOPENһֵα򿪣ΪTRUE, αرգΪFALSE.ʽαSQL%ISOPENFALSEΪʽαDMLִʱ򿪣ʱرա



һ߼Ԫ԰һDML䣬ưû֤ݵһԡ߼ԪеκһDMLʧܣô 񶼽عPL/SQLûȷʹCOMMITROLLBACKSAVEPOINTԼSET TRANSACTION䡣

COMMITֹñݿı仯ͬʱͷLOCK,ROLLBACKֹͷLOCKݿκα仯, SAVEPOINTм㣬ùݿʱмǷdzõģSET TRANSACTIONԣread-write͸뼶ȡ

ʽα

ѯ ؽһʱҪһʽα꣬ʱûʹselect into䡣PL/SQLʽα꣬ѯʼʱʽα򿪣ѯʱʽαԶرաʽαPL/SQLִв 쳣ִ򿪣ȡ,رա±ʾʽαʽαIJ

1 ʽαʽα
ʽα ʽα
PL/SQLάִвѯʱԶ򿪺͹ر ڳʽ塢򿪡رգαһ֡
αǰ׺SQL αԵǰ׺α
%ISOPENΪFALSE %ISOPENα״̬ȷֵ
SELECTINTOӴֻһݱ Դݣڳѭȡÿһݡ

ʹα

Ҫһ˵αָͨʽα꣬˴ûرָ˵α궼ָʽαꡣҪڳʹα꣬αꡣ

α

CURSOR cursor_name IS select_statement;

PL/SQLαһδܸαֵڱʽС

DELCARE
CURSOR C_EMP IS SELECT empno,ename,salary
FROM emp
WHERE salary>2000
ORDER BY ename;
........
BEGIN

α궨SELECTвһҪͼҲԴӶͼѡУʹ*ѡе

α

ʹαеֵ֮ǰӦȴα꣬αʼѯα﷨ǣ
OPEN cursor_name

cursor_nameֶα

OPEN C_EMP;

رα

CLOSE cursor_name

CLOSE C_EMP;

αȡ

αõһʹFETCHÿһȡݺα궼ָһС﷨£
FETCH cursor_name INTO variable[,variable,...]

SELECTαÿһУFETCHбӦһ֮ӦҲҪͬ

SET SERVERIUTPUT ON
DECLARE
v_ename EMP.ENAME%TYPE;
v_salary EMP.SALARY%TYPE;
CURSOR c_emp IS SELECT ename,salary FROM emp;
BEGIN
OPEN c_emp;
FETCH c_emp INTO v_ename,v_salary;
DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename
||'is'|| v_salary);
FETCH c_emp INTO v_ename,v_salary;
DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename
||'is'|| v_salary);
FETCH c_emp INTO v_ename,v_salary;
DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename
||'is'|| v_salary);
CLOSE c_emp;
END

δǷdz鷳ģжзؽʹѭαΪѭַʽȡݣĿɶԺͼԶΪߣʹѭдij
SET SERVERIUTPUT ON
DECLARE
v_ename EMP.ENAME%TYPE;
v_salary EMP.SALARY%TYPE;
CURSOR c_emp IS SELECT ename,salary FROM emp;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO v_ename,v_salary;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename
||'is'|| v_salary);
END

¼

һ¼ʹTYPE%ROWTYPE%ROWsTYPEĸϢϡ

¼ڴαȡУαѡܶеʱôʹü¼ΪÿһҪöࡣ

ڱʹ%ROWTYPEαȡֵ¼ʱҪѡУôSELECTӾʹ*ȽгҪȫöࡣ

SET SERVERIUTPUT ON
DECLARE
R_emp EMP%ROWTYPE;
CURSOR c_emp IS SELECT * FROM emp;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO r_emp;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUT.PUT.PUT_LINE('Salary of Employee'||r_emp.ename||'is'|| r_emp.salary);
END LOOP;
CLOSE c_emp;
END;

%ROWTYPEҲα壬ĻͱҪα꣺
SET SERVERIUTPUT ON
DECLARE
CURSOR c_emp IS SELECT ename,salary FROM emp;
R_emp c_emp%ROWTYPE;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO r_emp;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUT.PUT.PUT_LINE('Salary of Employee'||r_emp.ename||'is'|| r_emp.salary);
END LOOP;
CLOSE c_emp;
END;

α

洢̺ͺƣԽݸα겢ڲѯʹáڴij´αdzá﷨£
CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement;

﷨£
Parameter_name [IN] data_type[{:=|DEFAULT} value]

洢̲ͬǣαֻܴܽݵֵֵֻܷͣûдС

Ը趨һȱʡֵûвֵݸαʱʹȱʡֵαжIJֻһռλڱøòһɿ

ڴαʱֵ﷨£
OPEN cursor_name[value[,value]....];

ֵֻ

DECALRE

CURSOR c_dept IS SELECT * FROM dept ORDER BY deptno;
CURSOR c_emp (p_dept VARACHAR2) IS
SELECT ename,salary
FROM emp
WHERE deptno=p_dept
ORDER BY ename
r_dept DEPT%ROWTYPE;
v_ename EMP.ENAME%TYPE;
v_salary EMP.SALARY%TYPE;
v_tot_salary EMP.SALARY%TYPE;

BEGIN

OPEN c_dept;
LOOP
FETCH c_dept INTO r_dept;
EXIT WHEN c_dept%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Department:'|| r_dept.deptno||'-'||r_dept.dname);
v_tot_salary:=0;
OPEN c_emp(r_dept.deptno);
LOOP
FETCH c_emp INTO v_ename,v_salary;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Name:'|| v_ename||' salary:'||v_salary);
v_tot_salary:=v_tot_salary+v_salary;
END LOOP;
CLOSE c_emp;
DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary);
END LOOP;
CLOSE c_dept;
END;

αFORѭ

ڴʱƳʱѭIJ裺



2ʼѭ

3αȡֵ

4һб

5

6رѭ

7رα

Լ򵥵İһƪαѭһѭͲͬFORѭFORѭα갴ʽŵڲҪʽĴ򿪡رաȡݣݵĴڡݵıȵȡαFOR ѭ﷨£
FOR record_name IN
(corsor_name[(parameter[,parameter]...)]
| (query_difinition)
LOOP
statements
END LOOP;

forѭдӣ
DECALRE

CURSOR c_dept IS SELECT deptno,dname FROM dept ORDER BY deptno;
CURSOR c_emp (p_dept VARACHAR2) IS
SELECT ename,salary
FROM emp
WHERE deptno=p_dept
ORDER BY ename

v_tot_salary EMP.SALARY%TYPE;

BEGIN

FOR r_dept IN c_dept LOOP
DBMS_OUTPUT.PUT_LINE('Department:'|| r_dept.deptno||'-'||r_dept.dname);
v_tot_salary:=0;
FOR r_emp IN c_emp(r_dept.deptno) LOOP
DBMS_OUTPUT.PUT_LINE('Name:'|| v_ename||' salary:'||v_salary);
v_tot_salary:=v_tot_salary+v_salary;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary);
END LOOP;

END;

αFORѭʹòѯ

αFORѭпԶѯûʽαû֣¼ͨαѯ塣
DECALRE

v_tot_salary EMP.SALARY%TYPE;

BEGIN

FOR r_dept IN (SELECT deptno,dname FROM dept ORDER BY deptno) LOOP
DBMS_OUTPUT.PUT_LINE('Department:'|| r_dept.deptno||'-'||r_dept.dname);
v_tot_salary:=0;
FOR r_emp IN (SELECT ename,salary
FROM emp
WHERE deptno=p_dept
ORDER BY ename) LOOP
DBMS_OUTPUT.PUT_LINE('Name:'|| v_ename||' salary:'||v_salary);
v_tot_salary:=v_tot_salary+v_salary;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary);
END LOOP;

END;

αеӲѯ

﷨£
CURSOR C1 IS SELECT * FROM emp
WHERE deptno NOT IN (SELECT deptno
FROM dept
WHERE dname!='ACCOUNTING');

ԿSQLеӲѯûʲô

αеĸºɾ
PL/SQLȻʹUPDATEDELETE»ɾСʽαֻҪöݵʹáPL/SQLṩ˽ʹαͿִɾ¼¼ķ

UPDATEDELETEеWHERE CURRENT OFӴרŴҪִUPDATEDELETEıȡݡҪʹαʱʹFOR UPDATEӴԻʹFOR UPDATEӴһαʱзؼежмROW-LEVEL)ռʽֻܲѯЩУܽ UPDATEDELETESELECT...FOR UPDATE

FOR UPDATE [OF [schema.]table.column[,[schema.]table.column]..
[nowait]

ڶѯУʹOFӾضı,OFӾ䣬ôбѡжЩѾỰôORACLEȴֱн

UPDATEDELETEʹWHERE CURRENT OFӴ﷨£
WHERE{CURRENT OF cursor_name|search_condition}

DELCARE

CURSOR c1 IS SELECT empno,salary
FROM emp
WHERE comm IS NULL
FOR UPDATE OF comm;

v_comm NUMBER(10,2);

BEGIN

FOR r1 IN c1 LOOP

IF r1.salary<500 THEN
v_comm:=r1.salary*0.25;
ELSEIF r1.salary<1000 THEN
v_comm:=r1.salary*0.20;
ELSEIF r1.salary<3000 THEN
v_comm:=r1.salary*0.15;
ELSE
v_comm:=r1.salary*0.12;
END IF;

UPDATE emp;
SET comm=v_comm
WHERE CURRENT OF c1l;

END LOOP;
END

llcheng0129 :2006.04.21 13:26 ::: ( oracle ) ::Ķ:(151380) :: (8) :: (0)
===========================================================
PL/SQLж̬SQLʹ÷
===========================================================

תԣhttp://www.qqread.com/oracle/c225857010.html

ժҪPL/SQLУʹSQLPL/SQLʵִ󲿷ݵ󣬵ijЩ£PL/SQLʹñ׼SQLDML䲻ʵԼ󣬱Ҫ̬ijȷIJҪִ̬СҪʹö̬SQLʵ֡

ͨʵϸĽ⶯̬SQLʹá

˶߷ΧOracleм

ϵͳ

OSwindows 2000 Professional (Ӣİ)

Oracle8.1.7.1.0

ģ

һPL/SQLУDMLƵпֱʹSQLDDL估ϵͳȴPL/SQLֱʹãҪʵPL/SQLʹDDL估ϵͳ䣬ͨʹö̬SQLʵ֡

Ӧ˽ʲôǶ̬SQLOracleݿ⿪PL/SQLʹõSQLΪ̬SQLͶ̬SQL䡣ν̬SQL ָPL/SQLʹõSQLڱʱȷģִеȷ󡣶̬SQLָPL/SQLʱSQLDzȷģû IJIJִͬвͬIJԶ̬䲿ֲдֻڳʱ̬ش䡢﷨ִи䡣

Oracleж̬SQLͨض̬SQLִУҲͨDBMS_SQLִСֱ˵

һض̬SQL
ض̬SQLʹEXECUTE IMMEDIATEʵֵġ

1ض̬SQLִDDL
󣺸ûıֶȲ̬

create or replace procedure proc_test
(
table_name in varchar2, --
field1 in varchar2, --ֶ
datatype1 in varchar2, --ֶ
field2 in varchar2, --ֶ
datatype2 in varchar2 --ֶ
) as
str_sql varchar2(500);
begin
str_sql:=create table ||table_name||(||field1|| ||datatype1||,||field2|| ||datatype2||);
execute immediate str_sql; --ִ̬DDL
exception
when others then
null;
end ;

DZͨĴ洢̴롣ִд洢̶̬

SQL> execute proc_test(dinya_test,id,number(8) not null,name,varchar2(100));

PL/SQL procedure successfully completed

SQL> desc dinya_test;
Name Type Nullable Default Comments
---- ------------- -------- ------- --------
ID NUMBER(8)

NAME VARCHAR2(100) Y

SQL>

ʵǵʹñض̬SQLûıֶֶ͵Ȳʵִֶ̬DDL䡣

2ض̬SQLִDML
󣺽ûֵ뵽нõdinya_testС

create or replace procedure proc_insert
(
id in number, --
name in varchar2 --
) as
str_sql varchar2(500);
begin
str_sql:=insert into dinya_test values(:1,:2);
execute immediate str_sql using id,name; --ִ̬в
exception
when others then
null;
end ;

ִд洢̣ݵԱС

SQL> execute proc_insert(1,dinya);
PL/SQL procedure successfully completed
SQL> select * from dinya_test;
ID NAME
1 dinya

Уض̬SQLִDMLʱʹusingӾ䣬˳ֵ󶨵Ҫִж̬SQLʱʹRETURNING INTO Ӿ䣬磺

declare
p_id number:=1;
v_count number;
begin
v_string:=select count(*) from table_name a where a.id=:id;
execute immediate v_string into v_count using p_id;
end ;

Ĺڶ̬SQLйڷֵΪ󶨱ִвģʽ⣬ԡ

ʹDBMS_SQL
ʹDBMS_SQLʵֶ̬SQLIJ£AȽҪִеSQLһŵһַСBʹDBMS_SQL parseַCʹDBMS_SQLbind_variable󶨱DʹDBMS_SQLexecute ִ䡣

1ʹDBMS_SQLִDDL
ʹDBMS_SQLûıֶֶͽ

create or replace procedure proc_dbms_sql
(
table_name in varchar2, --
field_name1 in varchar2, --ֶ
datatype1 in varchar2, --ֶ
field_name2 in varchar2, --ֶ
datatype2 in varchar2 --ֶ
)as
v_cursor number; --
v_string varchar2(200); --ַ
v_row number; --
begin
v_cursor:=dbms_sql.open_cursor; --Ϊ򿪹
v_string:=create table ||table_name||(||field_name1|| ||datatype1||,||field_name2|| ||datatype2||);
dbms_sql.parse(v_cursor,v_string,dbms_sql.native); --
v_row:=dbms_sql.execute(v_cursor); --ִ
dbms_sql.close_cursor(v_cursor); --رչ
exception
when others then
dbms_sql.close_cursor(v_cursor); --رչ
raise;
end;

Ϲִ̱ͨй̴ṹ

SQL> execute proc_dbms_sql(dinya_test2,id,number(8) not null,name,varchar2(100));

PL/SQL procedure successfully completed

SQL> desc dinya_test2;
Name Type Nullable Default Comments
---- ------------- -------- ------- --------
ID NUMBER(8)
NAME VARCHAR2(100) Y

SQL>

2ʹDBMS_SQLִDML
ʹDBMS_SQLûֵ±Ӧļ¼

鿴м¼

SQL> select * from dinya_test2;
ID NAME
1 Oracle
2 CSDN
3 ERP
SQL>

洢̣ͨ

create or replace procedure proc_dbms_sql_update
(
id number,
name varchar2
)as
v_cursor number; --
v_string varchar2(200); --ַ
v_row number; --
begin
v_cursor:=dbms_sql.open_cursor; --Ϊ򿪹
v_string:=update dinya_test2 a set a.name=:p_name where a.id=:p_id;
dbms_sql.parse(v_cursor,v_string,dbms_sql.native); --
dbms_sql.bind_variable(v_cursor,:p_name,name); --󶨱
dbms_sql.bind_variable(v_cursor,:p_id,id); --󶨱
v_row:=dbms_sql.execute(v_cursor);--ִж̬ӣѣ
dbms_sql.close_cursor(v_cursor); --رչ
exception
when others then
dbms_sql.close_cursor(v_cursor); --رչ
raise;
end;

ִй̣ûIJ±еݣ

SQL> execute proc_dbms_sql_update(2,csdn_dinya);

PL/SQL procedure successfully completed

SQL> select * from dinya_test2;
ID NAME
1 Oracle
2 csdn_dinya
3 ERP
SQL>

ִй̺󽫵ڶnameֶεݸΪֵcsdn_dinyaʹdbms_sqlִDMLĹܡ

ʹDBMS_SQLУҪִеĶ̬䲻Dzѯ䣬ʹDBMS_SQL.Execute DBMS_SQL.Variable_ValueִУҪִж̬Dzѯ䣬ҪʹDBMS_SQL.define_column ȻʹDBMS_SQL.Execute, DBMS_SQL.Fetch_Rows, DBMS_SQL.Column_ValueDBMS_SQL.Variable_Valueִвѯõ

ܽ˵
OracleУǿʹö̬SQLִDDL 䡢DML䡢估ϵͳ䡣ҪעǣPL/SQLʹ ö̬SQLִDDLʱIJͬDDLʹð󶨱ǷǷģbind_variable(v_cursor,:p_name, name)ҪִDBMS_SQL.Bind_Variableֱӽıӵַмɡ⣬DDLڵ DBMS_SQL.PARSEʱִеģDBMS_SQL.EXECUTEҲԲãеv_row:=dbms_sql.execute (v_cursor)ֿԲҪ

llcheng0129 :2006.04.21 09:50 ::: ( oracle ) ::Ķ:(146795) :: (6) :: (0)
===========================================================
abstract classinterface
===========================================================

ת:http://www.matrix.org.cn/resource/article/0/426.html

abstract classinterfaceJavaжڳඨֵֻ֧ƣֻƵĴڣŸJavaǿ abstract classinterface֮ڶڳඨַ֧кܴԣ໥滻˺ܶ࿪ڽгඨʱ abstract classinterfaceѡԵñȽ⡣ʵ֮仹кܴģǵѡӳʵ⡢ͼ ǷȷĽ֮һͼṩһڶ֮ѡݡ


abstract classinterfaceJavaжгࣨеijಢǴabstract classʾһ壬abstract classΪJavaڶһַע֣ģôʲôdz࣬ʹóΪǴʲôôأ

ĸУ֪еĶͨģǷȴе඼ģһûа㹻Ϣ һĶdzࡣڶзеóijǶһϵпȥͬDZͬ ij󡣱磺ǽһͼα༭ĿͻᷢԲһЩDzͬģֶ״ һ״DzڵģһΪĸûжӦľԱij ܹʵġ

򣬳ҪءǿԹһ̶һΪijΪȴܹ ܵľʵַʽdz࣬һܵľʵΪпܵࡣģԲһ塣ģһ ij壬Dz޸ĵģͬʱͨҲչģΪܡϤOCPĶһ֪ΪܹʵƵ һĵԭOCP(Open-Closed Principle)еĹؼڡ

﷨濴abstract classinterface

﷨棬JavaԶabstract classinterface˲ͬĶ巽ʽԶһΪDemoijΪ˵ֲͬ

ʹabstract classķʽDemoķʽ£


abstract class Demo
abstract void method1();
abstract void method2();






ʹinterfaceķʽDemoķʽ£


interface Demo {
void method1();
void method2();

}




abstract classʽУDemoԼݳԱҲзabstarctijԱinterfaceʽʵУDemoֻܹо̬ ܱ޸ĵݳԱҲDZstatic finalģinterfaceһ㲻ݳԱеijԱabstractġij˵interfaceһ ʽabstract class

abstract classinterface﷨ϸ⣬DZĵص㣬׸߿ԲIJοס1øݡ

ӱ̲濴abstract classinterface

ӱ̵ĽǶabstract classinterfaceʵ"design by contract"˼롣ھʹ滹һЩġ

ȣabstract classJavaбʾһּ̳йϵһֻʹһμ̳йϵǣһȴʵֶinterfaceҲJavaԵڿJavaڶؼ̳еַ֧һпǰɡ

Σabstract classĶУǿԸ跽ĬΪinterfaceĶУȴӵĬΪΪƹƣʹίУ һЩԣʱɺܴ鷳

вܶĬΪһȽص⣬Ǿǿܻάϵ鷳Ϊ޸Ľ棨һͨabstract classinterfaceʾӦµ磬µķ߸õķµIJʱͻdz鷳ҪѺܶʱ 䣨ܶΪˣͨabstract classʵֵģôֻܾҪ޸Ķabstract classеĬΪͿˡ

ͬڳжĬΪͻᵼͬķʵֳڸóÿһУΥ "one ruleone place"ԭɴظͬԺάˣabstract classinterfaceѡʱҪdzСġ

濴abstract classinterface

Ҫ﷨ͱ̵ĽǶabstract classinterfaceЩDZȽϵͲεġDZʵġСڽһ棺abstract classinterfaceӳһ¶ߵΪз߸ıڡ

ǰ Ѿᵽabstarct classJavaһּ̳йϵҪʹü̳йϵ֮"is a"ϵڸӦͬģοס3й"is a"ϵĴƪȤĶ߿Բοinterface ˵ȻҪinterfaceʵߺinterfaceڸһµģʵinterfaceԼѡΪʹ ⣬潫ͨһ򵥵ʵ˵

һӣǵһDoorijDoorִopencloseʱǿͨabstract classinterfaceһʾóͣ巽ʽֱʾ

ʹabstract classʽDoor


abstract class Door {
abstract void open();
abstract void close()
}




ʹinterfaceʽDoor


interface Door {
void open();
void close();
}




DoorͿextendsʹabstract classʽDoorimplementsʹinterfaceʽDoorʹabstract classinterfaceûд

ҪDoorҪбĹܡǸԸӵṹأڱУҪΪչʾabstract classinterfaceӳϵ޹صⶼ˼򻯻ߺԣ潫гܵĽЩ ͬķз

һ

򵥵DoorĶһalarm£


abstract class Door {
abstract void open();
abstract void close()
abstract void alarm();
}







interface Door {
void open();
void close();
void alarm();
}




ôбܵAlarmDoorĶ巽ʽ£


class AlarmDoor extends Door {
void open() { }
void close() { }
void alarm() { }
}







class AlarmDoor implements Door
void open() { }
void close() { }
void alarm() { }





ַΥеһԭISPInterface Segregation PricipleDoorĶаDoorеΪһ""ΪһһЩ DoorģΪ""ĸı䣨磺޸alarmIJı䣬֮Ȼ



ȻopenclosealarmͬĸISPԭӦðǷֱڴijС巽ʽУʹ abstract classʽ壻ʹinterfaceʽ壻һʹabstract classʽ壬һʹinterfaceʽ塣

ȻJavaԲֶ֧ؼ̳Уʹabstract classʽDzеġַʽǿеģǶǵѡȴӳеĸʵ⡢ͼķӳǷȷһһ˵

ʹinterfaceʽ壬ôͷӳ⣺1ǿûAlarmDoorڸϵ DoorDZ2Ƕû⣬磺ͨķAlarmDoorڸϺDoorһ ģôʵʱûܹȷĽʾǵͼΪĶϣʹinterfaceʽ壩ӳ塣

ǶǣAlarmDoorڸDoorͬʱобĹܡǸơʵȷķӳǵ˼أ ǰѾ˵abstract classJavaбʾһּ̳йϵ̳йϵڱ"is a"ϵԶDoorӦʹabstarct classʽ塣⣬AlarmDoor־бܣ˵ܹɱжΪԱͨinterfaceʽ 塣ʾ


abstract class Door {
abstract void open();
abstract void close()
}
interface Alarm {
void alarm();
}
class AlarmDoor extends Door implements Alarm {
void open() { }
void close() { }
void alarm() { }
}




ʵַʽܹȷķӳǶ⣬ȷĽʾǵͼʵabstract classʾ"is a"ϵinterfaceʾ"like a"ϵѡʱΪһݣȻǽڶϵģ磺ΪAlarmDoorڸDZͬʱ־ DoorĹܣôĶ巽ʽҪˡ



abstract classinterfaceJavaеֶķʽ֮кܴԡǶǵѡȴӳеĸ ʵ⡢ͼķӳǷȷΪDZ˸IJͬĹϵȻܹʵĹܣʵҲԵһֵĹ÷ϣ ܹϸϸᡣ


llcheng0129 :2006.04.15 11:59 ::: ( javaӦ ) ::Ķ:(98538) :: (8) :: (0)
===========================================================
[ת]JavaӦģʽ - Factory Method
===========================================================
Դhttp://www.cn.ibm.com/developerWorks

ģʽ,Factory MethodҲDZȽϼ򵥵һ,Ӧ÷dz㷺,EJB,RMI,COM,CORBA,SwingжԿģʽӰ,Ҫģʽ֮һ. ܶطǶῴxxxFactory,ô,ʲôFactory Method,ΪʲôҪģʽ,Javaʵָģʽ,DZҪҵ.



Factory Methodһִģʽ,һĽӿ,ȴʵһ.һ޷ԤҪĶһҪ ָĶʱǾҪõFactory Method ģʽ.˵,Factory MethodԸݲͬͬʵ,ȻЩͬʵͨͬ,йͬĸ.Factory MethodѴЩʵľ̷װ,˿ͻ˵Ӧ,Ҳ˳չ,ʹýСĸĶͿԼµĴ. ͨǽFactory MethodΪһֱ׼Ĵķ,ҪԵʱ,Ϳʼģʽת

򵥷
ͼ1Factory Method ģʽĽṹͼ,ṩһЩ,ǿԽи:

Product: ҪIJƷij.
ConcreteProduct: Product,һϵоIJƷ.
Creator: 󴴽ӿ,ProductͶFactory Method.
ConcreteCreator: Ĵ,дCreatorеFactory Method,ConcreteProduct͵ʵ.

ͼ1: Factory Method ģʽṹ

ɴ˿ĿƽжӦϵ: Product <====> Creator ; ConreteProduct <====> ConreteCreator

ƷӦ󴴽,ƷӦ崴.ĺôʲô?ΪʲôDzֱþIJƷ;Ĵ?ʵҲ .ͨFactory Methodģʽ,ͻ(client)ֻóProductCreater,ԾConcreteProduct ConcreteCreatorԺ,ǿԻöĺô:

ȿͻ˿ͳһӳ󴴽ȡʵ, CreatorýclientͲƷ̷뿪,ͻòķصһIJƷ,ҲùЩƷδ.ͬʱ, ConcreteProductҲProduct,ConreteProduct̳Product,ʵProduct ij󷽷,JavaеĶ(cast)ԭ,ͨConcreteCreatorConcreteProductԶ ͳProduct.һ,ʵݲͬConcreteProductͿʽͳһΪProduct,ͨCreatorṩ client.
,һµConcreteCreatorʱ,CreatorṩĽӿڲ,ͻ˳򲻻˿ ĸĶ,һǣȫ, ÷װԵ.ֱConcreteProductConcreteCreatorҲ. ƹʹ÷װ(encapsulation)ί(delegation),Factory Methodģʽʹ˷װίеĵ,װͨ󴴽Creatorֵ,ίͨ󴴽Ѵȫ 崴ConcreteCreatorֵ.

,ٻͷеǶλ,ʼҲɬѶ,DzѾʻ˺ܶ.

ǿ Java ʵFactory Methodģʽ,һʶ.

ʵʩ
˵һ,Factory Methodģʽ󲢲һǵĴ,ʵ,Ҳʹ˸,Ŀ,еԵĴȷĶ .,Ŀ,ͻ˵Ӧü,ͻĴ,ĸ߿ɶ.

׼ʵ: ҲBruce Eckel OO˼ľ Shape.һȽϤһЩ.ȫͼ1Ľṹдһʾ.δǴͬShapeʵ,ÿʵ :drawerase.ĴίнoShapeFactory.
1.a ȶһShape,ķ.

abstract class Shape {
// shape
public abstract void draw();
// ȥ shape
public abstract void erase();

public String name;
public Shape(String aName){
name = aName;
}
}

1.b Shape: Circle, Square,ʵShapeжij󷽷
// Բ
class Circle extends Shape {
public void draw() {
System.out.println("It will draw a circle.");
}
public void erase() {
System.out.println("It will erase a circle.");
}
// 캯
public Circle(String aName){
super(aName);
}
}

//
class Square extends Shape {
public void draw() {
System.out.println("It will draw a square.");
}
public void erase() {
System.out.println("It will erase a square.");
}
// 캯
public Square(String aName){
super(aName);
}
}

1.c Ĵ,anOperationfactoryMethodһ,Ըöһϵв.
abstract class ShapeFactory {  
protected abstract Shape factoryMethod(String aName);
// anOperationжShapeһϵΪ
public void anOperation(String aName){
Shape s = factoryMethod(aName);
System.out.println("The current shape is: " + s.name);
s.draw();
s.erase();
}
}

1.d circlesquareӦ崴CircleFactory,SquareFactory,ʵָmethodFactory
// 巵 circle ʵ CircleFactory
class CircleFactory extends ShapeFactory {
// factoryMethod,Circle
protected Shape factoryMethod(String aName) {
return new Circle(aName + " (created by CircleFactory)");
}
}


// 巵 Square ʵ SquareFactory
class SquareFactory extends ShapeFactory {
// factoryMethod,Square
protected Shape factoryMethod(String aName) {
return new Square(aName + " (created by SquareFactory)");
}
}

1.e :עͻ˳ô,ûµж,ҲConcreteProductConcreteCreatorϸ (ΪanOperationװProduct,ProductӰҲû,ȻProduct﷽ľ÷ ͻҲDz).
class Main {
public static void main(String[] args){
ShapeFactory sf1 = new SquareFactory();
ShapeFactory sf2 = new CircleFactory();
sf1.anOperation("Shape one");
sf2.anOperation("Shape two");
}
}


н:
The current shape is: Shape one (created by SquareFactory)
It will draw a square.
It will erase a square.
The current shape is: Shape two (created by CircleFactory)
It will draw a circle.
It will erase a circle.


Factory Method: ַʽָIJΪ־Ӧʵ,Ǻܳһְ취.JFCеBorderFactoryǸܲ. µַΪжϵ,Ҳһ,ǾͿõغ,һϵвͷ岻ͬͬ, java.util.Calendar.getInstance()Ǹõ.Ĵʽ˷Factory Methodģʽһȱ,ǵƷȽ϶ʱ,DzòҲһϵ֮Ӧľ幹. ڿͻDZָҪһ.
2.a ڵһַĻϽ޸,Զһ쳣,벻ȷIJʱԵõԵıϢ.
class NoThisShape extends Exception {
public NoThisShape(String aName) {
super(aName);
}
}

2.bȥShapeFactory,ΪShapeFactoryֱӸʵĴ. ShapeFactoryԼһĴ,ֱòķʵfactoryMethodضֶ.
abstract class ShapeFactory {  
private static Shape s;
private ShapeFactory() {}

static Shape factoryMethod(String aName, String aType) throws NoThisShape{
if (aType.compareTo("square")==0)
return new Square(aName);
else if (aType.compareTo("circle")==0)
return new Circle(aName);
else throw new NoThisShape(aType);
}

// anOperationжShapeһϵΪ
static void anOperation(String aName, String aType) throws NoThisShape{
s = factoryMethod(aName, aType);
System.out.println("The current shape is: " + s.name);
s.draw();
s.erase();
}
}


2.c :ͻ˱ָ崴ĸ.anOperationǾ̬,ֱ.
class Main {
public static void main(String[] args) throws NoThisShape{
ShapeFactory.anOperation("Shape one","circle");
ShapeFactory.anOperation("Shape two","square");
ShapeFactory.anOperation("Shape three", "delta");
}
}


н:
The current shape is: Shape one
It will draw a circle.
It will erase a circle.
The current shape is: Shape two
It will draw a square.
It will erase a square.
Exception in thread "main" NoThisShape: delta
at ShapeFactory.factoryMethod(ShapeFactory.java:10)
at ShapeFactory.anOperation(ShapeFactory.java:15)
at Main.main(Main.java:5)


̬װػ:
еʱǻConcreteProductʵΪ,,ڴɴ,ͱжϲľ(instanceof),ȻܲӦʵ,ôȽϺõJavaĶ̬װػ.:

ǵõһShapes,֪Ǹ,ͿClassԴķnewInstance()õʵ

return (Shape)s.getClass().newInstance();

ַȤö߿Լ,ƪ,д.

:
ƪº,Ŷ߶Factory MethodģʽһȽ˽.˵,DzӦùһģʽʲô,ȥʵģʽ,Ӧ͸󿴱,֪ Ȼ,Ҫ֪Ȼ.Ҫͨģʽѧϰ˼,Լʶõ.Factory MethodģʽƼ,ʵ.,װ,̳,ί,̬,Խӿڱ̵еĸõһһ.ֻץסı, Dzܹʽ,Ϊʹģʽʹģʽ.

llcheng0129 :2006.04.15 11:00 ::: ( javaӦ ) ::Ķ:(96518) :: (8) :: (0)
===========================================================
[ת]hibernate湥
===========================================================


hibernatesessionṩһ棬ÿsessionͬһidloadᷢsqlݿ⣬sessionرյʱһʧЧˡ

SessionFactoryȫֻ棬¿ʹòͬĻ⣬ehcacheoscacheȣҪhibernate.cache.provider_classehcache2.1о
hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider
ʹòѯ棬
hibernate.cache.use_query_cache=true


Լ򵥵ĿһMapͨkeyڻvalue

ClassĻ
һ¼ҲһPO˵ǸIDҵģkeyIDvaluePOJOlistloaditerateֻҪһ󣬶仺档listʹû棬iterateȡݿselect idȻһidһidloadڻУʹӻȡûеĻȥݿloadǶд棬Ҫã
<cache usage="read-write"/>
ʹõĶʵehcacheĻҪehcache.xml
<cache name="com.xxx.pojo.Foo" maxElementsInMemory="500" eternal="false" timeToLiveSeconds="7200" timeToIdleSeconds="3600" overflowToDisk="true" />
eternalʾDzԶʱtimeToLiveSecondsǻÿԪأҲһPOJOijʱʱ䣬eternal="false"ָʱ䣬ԪؾͱˡtimeToIdleSecondsǷʱ䣬ǿѡġput Ԫس500ʱoverflowToDisk="true"ͻѻеIJݱӲϵʱļ档
ÿҪclassҪáûãhibernateʱ򾯸㣬ȻʹdefaultCacheãclassṲһá
ijIDͨhibernate޸ʱhibernate֪Ƴ档
ҿܻ룬ͬIJѯһlistڶiterateͿʹõˡʵǺѵģΪ޷жʲôʱǵһΣÿβѯͨDzһģݿ100¼id1100һlistʱǰ50idڶ iterateʱȴѯ3070idô30-50Ǵӻȡģ5170Ǵݿȡģ1+20sqlһֱΪ iterateûʲôãǻ1+N⡣
⻰˵˵Ͳѯlistװڴ棬iterateֻselect idȽϺãǴͲѯҪҳģ˭Ҳİװһҳ20ĻiterateҪִ21䣬listȻѡֶΣiterateһselect idһЩֻһ䣬װhibernateݿⷽŻʹmysqllimit忴Ӧû list졣
ҪlistiterateѯĽ棬Ҫõѯ

ѯ
Ҫhibernate.cache.use_query_cache=true
ehcacheehcache.xmlעhibernate3.0Ժnet.sfİ
<cache name="net.sf.hibernate.cache.StandardQueryCache"
maxElementsInMemory="50" eternal="false" timeToIdleSeconds="3600"
timeToLiveSeconds="7200" overflowToDisk="true"/>
<cache name="net.sf.hibernate.cache.UpdateTimestampsCache"
maxElementsInMemory="5000" eternal="true" overflowToDisk="true"/>
Ȼ
query.setCacheable(true);//ѯ
query.setCacheRegion("myCacheRegion");//ָҪʹõcacheRegionѡ
ڶָҪʹõcacheRegionmyCacheRegionԸÿѯһãʹsetCacheRegionָҪehcache.xml
<cache name="myCacheRegion" maxElementsInMemory="10" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" overflowToDisk="true" />
ʡԵڶУcacheRegionĻôʹᵽı׼ѯãҲnet.sf.hibernate.cache.StandardQueryCache

ڲѯ˵keyǸhqlɵsqlټϲҳϢͨ־ǺܿɶøһĴ룩
hql
from Cat c where c.name like ?
ɴµsql
select * from cat c where c.name like ?
"tiger%"ôѯkey*Լ*ַƾдģȷҲˣ
select * from cat c where c.name like ? , parameter:tiger%
֤ͬIJѯͬIJ¾һkey
˵˵valuelistʽĻvalueﲢDzѯһIDҲ˵listiterateһβѯʱǵIJѯʽƽʱķʽһģlistִһsqliterateִ1+NΪ˻档ǵͬڶβѯʱ򣬾ͶiterateΪһˣݻkeyȥ鵽valuevalueһidȻڵclassĻȥһһloadΪ˽Լڴ档
ԿѯҪclass档listiterateһִеʱ򣬶Ǽѯclassġ
ﻹһױӵҪ⣬򿪲ѯԺ󣬼ʹlistҲ1+N⣡ͬһlistʱΪѯҲclassǷݣǷһsql䵽ݿȡȫݣȻѯ class档ǵڶִеʱˣclassijʱʱȽ϶̣class涼ʱˣDzѯ滹ڣô listڻȡidԺ󣬽һһȥݿloadˣclassijʱʱһܶڲѯõijʱʱ䣡˷ʱĻ֤classķʱҲڲѯĻʱ䡣ﻹclass汻ǿevictˣԼעˡ

⣬hqlѯselect־䣬ôѯvalueˡ

hibernateݿʱô֪Щѯأ
hibernateһطάÿʱ䣬ʵҲǷnet.sf.hibernate.cache.UpdateTimestampsCacheָĻ档
ͨhibernateµʱhibernate֪θӰЩȻЩʱ䡣ÿ涼һʱѯıhibernateѯһǷڵʱڣҪȡʱѯıȻȥЩʱ䣬һʱ¹ˣôЧġ
ԿֻҪ¹һô漰IJѯʧЧˣ˲ѯʿܻȽϵ͡

Collection
Ҫhbmcollection
<cache usage="read-write"/>
classCatcollectionchildrenôehcache
<cache name="com.xxx.pojo.Cat.children"
maxElementsInMemory="20" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200"
overflowToDisk="true" />
CollectionĻǰѯlistһҲֻһidΪ¹ʧЧһcollectioncollectionԪɾʱʧЧ
һ⣬collectionǸijֶģһԪظ˸ֶʱ˳ıʱcollection˳û¡


ֻ棨read-onlyûʲô˵
/д棨read-write:Ҫĸ
ϸĶ/д棨nonstrict-read-writeҪݣͬһ¼ĿԺСܱȶд
񻺴棨transactional֧񣬷쳣ʱ򣬻Ҳܹعֻ֧jtaûôо

дͲϸдʵϵڣд»ʱѻݻһȥȡӦĻݣֱסˣȻֱȡݿѯ
hibernate2.1ehcacheʵУסֻ쳣ôһֱסֱ60ʱ
ϸд治еݡ


ʹöǰ
hibernateݿжռдȨĽ̸ݿ⣬hibernateDz֪ġݿֱͨ hibernateô洢̣Լʹjdbcݿ⣬hibernateҲDz֪ġhibernate3.0ĴºɾDz¶ģǾ˵3.1Ѿ⡣
൱ļ֣ʱhibernate¡ɾȴԼдjdbcŻưɡ
SessionFactoryҲṩƳķһҪԼдһЩJDBCĻԵЩƳ棬Щǣ
void evict(Class persistentClass)
Evict all entries from the second-level cache.
void evict(Class persistentClass, Serializable id)
Evict an entry from the second-level cache.
void evictCollection(String roleName)
Evict all entries from the second-level cache.
void evictCollection(String roleName, Serializable id)
Evict an entry from the second-level cache.
void evictQueries()
Evict any query result sets cached in the default query cache region.
void evictQueries(String cacheRegion)
Evict any query result sets cached in the named query cache region.
ҲΪάJDBCij3ѯõevictQueries (String cacheRegion)Ƴ3ѯ棬Ȼevict(Class persistentClass)Ƴclass棬ȥˡһزѯ棬ܻǸƳ롣 jdbc뵽ǣһѯʱ򣬻֪ʲôطҲҪӦĸĶ

----------------------------------------------------

ܽ᣺
Ҫ뵱ȻΪһܣܹԦʵ²ġhibernateĶƻDZȽ϶ģjdbcܻĽ͸ܡڲ˽ԭãܻ1+N⡣ʹûܵ¶ݡ
ܲhibernateƣôԼӦóIJɡ
ԽߵIJ棬ЧͻԽáͺ񾡹ܴл棬ݿ⻹ҪʵԼĻ棬ݿл棬ǵӦóҪ档ΪײĻ֪߲ҪЩݸʲôֻıȽͨã߲Եʵֻ棬ڸߵļ棬ЧҲҪЩɡ

llcheng0129 :2006.04.14 17:16 ::: ( javaӦ ) ::Ķ:(233287) :: (360) :: (0)
===========================================================
[ת]ϧ㰮
===========================================================

һ⣬ҸĽŲ˵ô۴򿪣һжΪʱ

Ұ꣬ȴǵij


Ŵ½ꡣСʱ׾͹ˣΨһļУһ˸󣬹ѧࡱĸŵϣԲΪ

˵ãϸʰһ̨ķ䣬ɹ̫ʲôġ

վķ䣬һ仰û˵ȴͻȻڷ תȦצʱ˵ȥ

ĸߴϲؿڣоСʱɱץڴҺֲִʱͰҾԴϷҡҡλΣһֱŵġ־ֵĿ

µϰһʱIJϰʻڿźʵ̲סˣ޲֪ӣ򻨸ʲôֲܵԣ

Ц˵裬ʻʢ˵á

ŵͷ棬Ц裬dz˵ϰߣģϰˡ

Ų˵ʲôÿμʻ̲סʻ˶Ǯ˵ˣ͡졣ʱСĶؼңǮǸǮ--ʵشƵĸˡšҵı˵СɵʵǮ𣿡

ֵ˲г

͡˸շ

ϣŵţװűѿŪö죬Ŀ顣깬赸ʦȥѹ۵ˣ糿ůıѣҲӵΩһܣǣҶŵĿװơ

żְһЩһҾ͸æˡ磬ͨͨռ˵ܹϣüﵽǷϴϴྫϴ룬Ϊ˲ֻ͵͵ϴһ顣

һΣ͵͵ϴ뱻ſˣžһˤţſԼķޡΪѣºһû˵ˣҲҡһˣҾˣ

˵ͲǨһ£ٲɾҲԲ˰ɣ

óһʱ䣬Ų˵տʼΡǶӣúۣ֪Ҫȶ˭ĺá

Ϊ˲öͣ޷˵سе緹ġΡ

ſԵÿ֣ٿңǴûоӵΡΪӱΣֻϰ·*Լ

˯ʱең«ݶDzɾŲڼҳԣһӸļƾίᡣ̾«ݶ͵ΪңڼҳвУ

ֻûصεϡ

糿ҺյϡȻһθеĶⱼܣƴѹŲӿûѹס룬䣬µϡﻩ

ҴϢƽʱżż绰ıԹͿվſڷŭңҸ˵IJǹġҺʼ˵һμҵǵۿǣȻųȥˡ޺޵سһۣ¥׷ȥˡ

ӭȴͻȻŵ

죬ûлؼң绰ûСţԴҹίԼˣҪô

ĪģŻ£ʲôûθڣ߰ļ£˼㡣ͬ˵«ݶɫܲȥҽԺɡ

ҽԺĽһˡ糿ΪʲôͻȻŻ£Ҹмһ˿ԹΪ˵ţô˿û뵽أ

ҽԺſڣҿûࡣұתߣģۣûסҺ

ѭңȴʶˣһ˿زסDZشҡ

ҸԼ˵ҪҪһ⳵ʱҶһװбˣȻҸת

ϣûпܷڳ⳵ҵųٳٵ

Ϊʲôһð⵽ij̶ȣؼҺڴ۵űӵһǿˡ

ҹз򿪵ƣҿǮؿһ졣Ŵ
ǮҴ뿪

Ǵ㳹뿪ˡǵˣǮֵЦ˼£ᡰ

ڶ죬ûȥϰࡣ볹һԼ˼ú̸һΡ

ҵĹ˾еֵؿ˵ܵĸ׳˳ҽԺء

Ŀࡣ

ɱҽԺҵʱѾȥˡ

һֱңһӲŸݲ԰׵ֹסģô

ֱţҲû˵һ仰һ۶

ڳһǴӱ˽⵽ţųźԺվߣϼңԽ׷ߵԽ죬·ʱһӭײ

糿ûŻ£ûǼɱĸ׵ˡ

Ĭŵķ䣬ÿһֱκͿѹôͣ˵ǿкˣְеĻ˻ȥԸһٻһ٣Ȼһ¹ʶҵĹһһϢظȥؼҵʱԽԽǽţİ·˻ҪΡϵϵᡣ

һΣ·һ͸شҿһŮţΪŮ££ͷҾһС

ǴȻҽվǰûһᡣʲôҲ˵Ҳ޻˵

ŮңվߣְסȻͬأʾؿҡ

ֻԼһһڱ*IJ԰ױԵ

˵ңվȥһͶĺһ¡

һҹûؼңķʽףŵȥǵİҲˡ

Ҳûлʱ°³--һԼĶ

Ҳ绰ԭȻͼһͷһжʧȥˡ

һһȥҽԺ죬ÿÿСĵطȥ죬ҵıIJӡͬԼȰҴˣ˵ҷһҪӣҲŵIJɡ

°ڿ輸ϰһֽûҪ֪ʲôݡڼҵĶ£ѧƽҿժñӣ˵һ£ǩ֡

ңӣһ

һ߽¿һԼ˵޲ޡ

۾ܳƴᡣ

Һô£۾¡ĶϡЦЦ߹ȥϹֽҲǩԼ֣Ƹ

«ݶ㻳ˣ

Դųºһθ˵Ҳܲס۾ᡰ˵ǰû£ˡ

ûߣڰǶšſϣ͸˱ӡܶණѾԶˣԶʹܶòˡ

ǵ˵ٱ顰ԲˣҲΪԼԭ£ȴܣǸŮ棬ҵıⱲӣDzˡ

ڱ˴ϻ˺ۡҵģģģǿġ


llcheng0129 :2006.04.14 16:05 ::: ( ) ::Ķ:(23680) :: (3) :: (0)
===========================================================
[ת]Oracleбٲ
===========================================================
PL/SQLк麯
һһֵijSQLOracleڽһϵкЩɱΪSQLPL/SQL䣬ҪΪࣺ

к

ĽõкԼʹù

SQLеĵк

SQLPL/SQLԴܶ͵ĺַ֡ڡתͻ͵ȶֺڴݣЩɱͳΪкЩSELECT,WHEREORDER BYӾУоͰTO_CHAR,UPPER,SOUNDEXȵк
SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename)

кҲʹãupdateSETӾ䣬INSERTVALUESӾ䣬DELETWHEREӾ,֤رעSELECTʹЩǵעҲSELECTС

NULL͵к

NULLϿʼǺѵģһоȻԴ˸еNULLֵʾһδ֪ݻһֵκһΪNULLֵΪNULLֵ,ҲʺϺܶຯֻCONCAT,DECODE,DUMP,NVL,REPLACEڵNULLʱܹطNULLֵЩNVLʱҪģΪֱӴNULLֵNVLNVL(x1,x2),x1x2ʽʽx1ΪnullʱX2,򷵻x1

ǿempݱнˮҪܵIJ
column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2

Ǽ򵥵ĽнˮͽͿˣijһnullֵôͽnullӣ
update empset salary=(salary+bonus)*1.1

УԱĹʺͽ𶼽Ϊһµֵûн𣬼 salary + null,ôͻóĽۣʱҪʹnvlųnullֵӰ졣
ȷǣ
update empset salary=(salary+nvl(bonus,0)*1.1
ַ

ַڲַݣǴһоַ

ASCII()
c1һַc1һĸASCII룬溯CHR()
SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122

CHR(i)[NCHAR_CS]
iһ֣ʮƱʾַ
select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B

CONCAT(,)
c1,c2Ϊַc2ӵc1ĺ棬c1Ϊnull,c2.c2Ϊnull,򷵻c1c1c2Ϊnull򷵻nullͲ||صĽͬ
select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda

INITCAP()
c1ΪһַÿʵĵһĸдĸСдءɿո񣬿ַơ
select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici

INSTR(,[,i[,]])
c1,c2Ϊַi,jΪc2c1еjγֵλãc1ĵiַʼûзҪַʱ0,iΪôҵУλõļ㻹ǴңijȱʡֵΪ1.
select INSTR('Mississippi','i',3,3) from dualINSTR('MISSISSIPPI','I',3,3)11select INSTR('Mississippi','i',-2,3) from dualINSTR('MISSISSIPPI','I',3,3)2

INSTRB(,[,i[,j])
INSTRһֻصֽڣڵֽINSTRB()INSTR()

LENGTH()
c1Ϊַc1ijȣc1Ϊnullônullֵ
select LENGTH('Ipso Facto') ergo from dualergo10

LENGTHb()
LENGTH()һֽڡ

lower()
cСдַwhereӴ
select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'COLORNAMEWinterwhite

LPAD(,i[,])
c1,c2ΪַiΪc1c2ַ³i,ɶظiСc1ijȣôֻiôc1ַĽȥc2ȱʡֵΪո񣬲μRPAD
select LPAD(answer,7,'') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe

LTRIM(,)
c1ߵַȥʹһַc2Уûc2ôc1Ͳı䡣
select LTRIM('Mississippi','Mis') from dualLTRppi

RPAD(,i[,])
c1Ҳc2ַ³i,ɶظiСc1ijȣôֻiôc1ַĽȥc2ȱʡֵΪո,LPAD

RTRIM(,)
c1ұߵַȥʹںһַc2Уûc2ôc1Ͳı䡣

REPLACE(,[,])
c1,c2,c3ַc3c1еc2󷵻ء
select REPLACE('uptown','up','down') from dualREPLACEdowntown

STBSTR(,i[,])
c1Ϊһַi,jΪc1ĵiλʼسΪjַjΪգֱβ
select SUBSTR('Message',1,4) from dualSUBSMess

SUBSTRB(,i[,])
SUBSTRֻͬI,Jֽڼ㡣

SOUNDEX()
c1ƵĴ
select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dualDawes Daws DawsonD200 D200 D250

TRANSLATE(,,)
c1c2ַͬc3
select TRANSLATE('fumble','uf','ar') test from dualTEXTramble

TRIM([[]] from c3)
c3еĵһһ߶ɾ
select TRIM(' space padded ') trim from dual TRIMspace padded

UPPER()
c1ĴдwhereӴ
select name from dual where UPPER(name) LIKE 'KI%'NAMEKING
ֺ

ֺݣִѧ㡣кֲֵǺIJֵǻȶǽǶȣoracleûṩڽĻȺͽǶȵת

ABS()
nľֵ

ACOS()
-11֮nʾ
select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0

ASIN()
-11nʾ

ATAN()
кnķֵnʾȡ

CEIL()
شڻnС

COS()
nֵnΪ

COSH()
n˫ֵn Ϊ֡
select COSH(<1.4>) FROM dualCOSH(1.4)2.15089847

EXP()
enݣe=2.71828183.

FLOOR()
СڵN

LN()
NȻN0

LOG(,)
n1Ϊn2Ķ

MOD()
n1n2

POWER(,)
n1n2η

ROUND(,)
Сұn2λn1ֵn2ȱʡֵΪ0ؽСӽn2Ϊ뵽СӦλϣn2
select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54

SIGN()
nΪ-1,nΪ1n=00.

SIN)
nֵ,nΪȡ

SINH()
n˫ֵ,nΪȡ

SQRT()
nƽ,nΪ

TAN)
nֵ,nΪ

TANH()
n˫ֵ,nΪ

TRUNC(,)
ؽβn2λСn1ֵn2ȱʡΪ0n2ΪȱʡʱὫn1βΪn2ΪֵͽβСӦλϡ

ں

ںDATAͣDATA͵IJصҲDATA͵ֵ

ADD_MONTHS(,i)
diºĽiʹiһСôݿ⽫ʽתȥСIJ֡

LAST_DAY()
ذd·ݵһ

MONTHS_BETWEEN(,)
d1d2֮µĿ,d1d2յڶͬ߶ʹµһ죬ôһ᷵صĽһ

NEW_TIME(,,)
d1һͣʱtz1еںʱdʱʱtz2еںʱ䡣tz1tz2ʱַ

NEXT_DAY(,)
ddowĵһ죬dowʹõǰỰиָһеijһ죬صʱdʱͬ
select NEXT_DAY('01-Jan-2000','Monday') "1st Monday",NEXT_DAY('01-Nov-2004','Tuesday')+7 "2nd Tuesday") from dual;1st Monday 2nd Tuesday03-Jan-2000 09-Nov-2004

ROUND([,])
dfmtָĸʽ룬fmtΪַ

SYADATE
ûвصǰںʱ䡣

TRUNC([,])
fmtָĵλd.
ת

תڲ֮ͣת

CHARTORWID()
c ʹһַcתΪRWID͡
SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA')

CONVERT(,[,])
cβַdsetssetַַcssetַתΪdsetַssetȱʡΪݿַ

HEXTORAW()
xΪ16Ƶַ16ƵxתΪRAW͡

RAWTOHEX()
xRAWַRAWתΪ16Ƶ͡

ROWIDTOCHAR()
ROWIDתΪCHAR͡

TO_CHAR([[,)
xһdatanumberͣxתfmtָʽcharͣxΪnlsparm=NLS_DATE_LANGUAGE Ʒص·ݺշʹõԡxΪnlsparm=NLS_NUMERIC_CHARACTERS ָСλǧλķָԼҷš
NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string"

TO_DATE([,[,
cʾַfmtʾһʽַذfmtʽʾc,nlsparmʾʹõԡַcתdate͡

TO_MULTI_BYTE()
cʾһַcĵӽַתɶַֽ

TO_NUMBER([,[,)
cʾַfmtʾһʽֵַfmtָĸʽʾnlsparmʾԣc֡

TO_SINGLE_BYTE()
ַcеöַֽתɵȼ۵ĵַֽúݿַͬʱֽںͶַֽʱʹ

к

BFILENAME(
,)
dirһdirectory͵ĶfileΪһļһյBFILEλֵָʾڳʼBFILEBFILEС

DECODE(,,[,,,[])
xһʽm1һƥʽxm1Ƚϣm1xôr1,,xm2Ƚϣm3,m4,m5....ֱзؽ

DUMP(,[,[,[,]]])
xһʽַfmtʾ8ơ10ơ16ơַذйxڲʾϢVARCHAR2͵ֵָn1,n2ôn1ʼijΪn2ֽڽء

EMPTY_BLOB()
úûв һյBLOBλָʾڳʼһBLOBBLOBС

EMPTY_CLOB()
úûв һյCLOBλָʾڳʼһCLOBCLOBС

GREATEST()
exp_listһбʽıʽÿʽתһʽͣһʽַеκһôصĽvarchar2ͣͬʱʹõıȽǷո͵ıȽϡ

LEAST()
exp_listһбʽСıʽÿʽתһʽͣһʽַеκһصĽvarchar2ͣͬʱʹõıȽǷո͵ıȽϡ

UID
úûвΨһʾǰݿû

USER
صǰûû

USERENV()
optذǰỰϢoptĿѡֵΪ

ISDBA ỰSYSDBAɫӦTRUE
SESSIONID ƻỰʾ
ENTRYID ؿõʾ
INSTANCEڻỰӺ󣬷ʵʾֵֻParallel ʵʹá
LANGUAGEԡݿõַ
LANGƵISOд
TERMINALΪǰỰʹõն˻زϵͳıʾ

VSIZE()
xһʽxڲʾֽ
SQLе麯

麯ҲмϺػڶеĵһе׼ȷ޷ȷDzѯִвеĽڡ뵥кͬǣڽʱеж֪ġֲʹ麯뵥кҪΪ΢СIJ.

飨У

뵥кȣoracleṩ˷ḻĻģеĺЩselectselecthavingӾʹãselectӴʱGROUP BYһʹá

AVG([{DISYINCT|ALL}])
ֵƽֵȱʡΪALL.
SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scott.empAVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL)1877.94118 1877.94118 1916.071413

COUNT({*|DISTINCT|ALL} )
زѯеĿȱʡALL,*ʾеС

MAX([{DISTINCT|ALL}])
ѡбĿֵxַͣһVARCHAR2ͣXһDATAͣһڣXnumericͣһ֡עdistinctallãӦΪֵͬġ

MIN([{DISTINCT|ALL}])
ѡбĿСֵ

STDDEV([{DISTINCT|ALL}])
ѡߵбĿı׼ν׼Ƿƽ

SUM([{DISTINCT|ALL}])
ѡбĿֵܺ͡

VARIANCE([{DISTINCT|ALL}])
ѡбĿͳƷ

GROUP BYݷ

Ŀʾ麯DzЩѾֺݣǸݿGROUP BYݷ߷࣬SELECTSELECTӾʹ麯ʱDZΪdzзGROUP BYӾУûgroup byרŴôȱʡķǽΪһࡣ
select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982

УstateֶηࣻҪzip_codes,ORDER BY䣬ORDER BYӾʹл麯
select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982

HAVINGӾƷ

Ѿ֪ڲѯSELECTORDER BYӾʹ麯ֻӴУ麯WHEREӴУIJѯǴģ
SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)>10000 GROUP BY sales_clerk

ݿⲻ֪SUM()ʲôҪָʾݿз飬ȻƷеʱȷķʹHAVING䣺
SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)>10000;

Ƕ׺

Ƕסһһ롣һɼ̳еִй̡Ȩֻǻλãѭڵ⣬ҵԭǶ׼һDECODEܱ߼жIF....THEN...ELSEĺ


llcheng0129 :2006.04.14 15:47 ::: ( oracle ) ::Ķ:(10242) :: (272) :: (0)