תԣ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ִDDLPL/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裺
1α
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 |






