PL/SQL³ÌÐò½á¹¹¼°×é³É
ʲôÊÇPL/SQL?
?PL/SQL£¨Procedure Language/SQL£© ?PLSQLÊÇOracle¶ÔsqlÓïÑԵĹý³Ì»¯À©Õ¹ ?Ö¸ÔÚSQLÃüÁîÓïÑÔÖÐÔö¼ÓÁ˹ý³Ì´¦ÀíÓï¾ä£¨Èç·ÖÖ§¡¢Ñ»·µÈ£©£¬Ê¹SQLÓïÑÔ¾ßÓйý³Ì´¦ÀíÄÜÁ¦¡£
SQLÓŵã
½»»¥Ê½·Ç¹ý³Ì»¯£» Êý¾Ý²Ù×ݹ¦ÄÜÇ¿£» ×Ô¶¯µ¼º½Óï¾ä¼òµ¥£» µ÷ÊÔÈÝÒ×ʹÓ÷½±ã¡£
°ÑSQLÓïÑÔµÄÊý¾Ý²Ù×ÝÄÜÁ¦Óë¹ý³ÌÓïÑÔµÄÊý¾Ý´¦ÀíÄÜÁ¦½áºÏÆðÀ´£¬Ê¹µÃPLSQLÃæÏò¹ý³Ìµ«±È¹ý³ÌÓïÑÔ¼òµ¥¡¢¸ßЧ¡¢Áé»îºÍʵÓá£
³£ÓõĽáºÏÓïÑÔ
lPlsql(oracle),Transact-sql(SQLserver)
PL/SQLµÄ³ÌÐò½á¹¹
declare
˵Ã÷²¿·Ö £¨±äÁ¿ËµÃ÷£¬¹â±êÉêÃ÷£¬ÀýÍâ˵Ã÷¡³
begin
Óï¾äÐòÁÐ £¨DMLÓï¾ä¡³¡
exception
ÀýÍâ´¦ÀíÓï¾ä
End;
/
±äÁ¿ºÍ³£Á¿µÄ˵Ã÷
l˵Ã÷±äÁ¿ £¨char,varchar2, date, number, boolean,long) »ù±¾Êý¾ÝÀàÐͱäÁ¿
1. »ù±¾Êý¾ÝÀàÐÍ
Number Êý×ÖÐÍ
Int ÕûÊýÐÍ
Pls_integer ÕûÊýÐÍ£¬²úÉúÒç³öʱ³öÏÖ´íÎó
Binary_integer ÕûÊýÐÍ£¬±íʾ´ø·ûºÅµÄÕûÊý
Char ¶¨³¤×Ö·ûÐÍ£¬×î´ó255¸ö×Ö·û
Varchar2 ±ä³¤×Ö·ûÐÍ£¬×î´ó2000¸ö×Ö·û
Long ±ä³¤×Ö·ûÐÍ£¬×2GB
Date ÈÕÆÚÐÍ
Boolean ²¼¶ûÐÍ£¨TRUE¡¢FALSE¡¢NULLÈýÕßȡһ£©
ÔÚPL/SQLÖÐʹÓõÄÊý¾ÝÀàÐͺÍOracle
Êý¾Ý¿âÖÐʹÓõÄÊý¾ÝÀàÐÍ£¬Óеĺ¬ÒåÊÇÍêȫһÖµģ¬
ÓеÄÊÇÓв»Í¬µÄº¬ÒåµÄ¡£
2. »ù±¾Êý¾ÝÀàÐͱäÁ¿µÄ¶¨Òå·½·¨
±äÁ¿Ãû ÀàÐͱêʶ·û [not null]:=Öµ;
declare
age number(3):=26; --³¤¶ÈΪ3£¬³õʼֵΪ26
begin
commit;
end;
ÆäÖУ¬¶¨Òå³£Á¿µÄÓï·¨¸ñʽ£º
³£Á¿Ãû constant ÀàÐͱêʶ·û [not null]:=Öµ;
declare
pi constant number(9):=3.1415926;--ΪpiµÄÊý×ÖÐͳ£Á¿£¬³¤¶ÈΪ9£¬³õʼֵΪ3.1415926
begin
commit;
end;
ifÓï¾ä
ÈýÖÖifÓï¾ä
1. IF Ìõ¼þ THEN Óï¾ä1;
Óï¾ä2;
END IF;
2. IF Ìõ¼þ THEN Óï¾äÐòÁÐ1£»
ESLE Óï¾äÐòÁÐ 2£»
END IF£»
?
3. IF Ìõ¼þ THEN Óï¾ä;
ELSIF Óï¾ä THEN Óï¾ä;
ELSE Óï¾ä;
END IF;
С֪ʶ£º»ñÈ¡´Ó¼üÅÌÊäÈëµÄÊý¾Ý
?´Ó¼üÅÌÊäÈ룺
accept num prompt 'ÇëÊäÈëÒ»¸öÊý×Ö';
?µÃµ½¼üÅÌÊäÈëµÄÖµ£º
pnum number := #
Ñ»·Óï¾ä
ÈýÖÖÑ»·Óï¾ä
1. WHILE total <= 25000 LOOP
.. .
total : = total + salary;
END LOOP;
2. Loop
EXIT [when Ìõ¼þ];
¡¡
End loop
3. FOR I IN 1 . . 3 LOOP
Óï¾äÐòÁÐ ;
END LOOP ;
?
¹â±ê(Cursor)==ResultSet
˵Ã÷¹â±êÓï·¨£º
1.¶¨Òå¹â±ê
CURSOR ¹â±êÃû [ (²ÎÊýÃû Êý¾ÝÀàÐÍ[,²ÎÊýÃû Êý¾ÝÀàÐÍ]...)]
?
IS SELECT Óï¾ä;
ÓÃÓÚ´æ´¢Ò»¸ö²éѯ·µ»ØµÄ¶àÐÐÊý¾Ý
ÀýÈ磺
cursorc1 is select ename from emp;
2.´ò¿ª¹â±ê£º openc1; (´ò¿ª¹â±êÖ´Ðвéѯ)
3.ȡһÐйâ±êµÄÖµ£ºfetch c1 into pjob;(ȡһÐе½±äÁ¿ÖÐ)
4.¹Ø±Õ¹â±ê£º close c1;(¹Ø±ÕÓαêÊÍ·Å×ÊÔ´)
×¢Ò⣺ ÉÏÃæµÄpjob±ØÐëÓëemp±íÖеÄjobÁÐÀàÐÍÒ»Ö£º ?¶¨Ò壺pjobemp.empjob%type;
ʾÀý

?
´ø²ÎÊýµÄ¹â±ê
?
¶¨ÒåÓï¾ä£º
?
cursor c2(jobc varchar2)
is
select ename,salfrom emp
where job=jobc;
?
Ö´ÐÐÓï¾ä:
?
Open c2(¡®clerk¡¯);
?
ÀýÍâ
?
lÀýÍâÊdzÌÐòÉè¼ÆÓïÑÔÌṩµÄÒ»ÖÖ¹¦ÄÜ£¬ÓÃÀ´ÔöÇ¿³ÌÐòµÄ½¡×³ÐÔºÍÈÝ´íÐÔ¡£
?
?No_data_found (ûÓÐÕÒµ½Êý¾Ý) ?Too_many_rows (select ¡intoÓï¾äÆ¥Åä¶à¸öÐÐ) ?Zero_Divide ( ±»Áã³ý) ?Value_error (ËãÊõ»òת»»´íÎó) ?Timeout_on_resource (Ôڵȴý×ÊԴʱ·¢Éú³¬Ê±)
?
Óû§¶¨ÒåÀýÍâ¼°´¦ÀíÀýÍâ
DECLARE
My_job char(10);
v_sal emp.sal%type;
No_data exception;
cursor c1 is select distinct jobfrom emp order by job;
begin
open c1;
Fetch c1 into v_job;
IF c1%notFOUND then raiseno_data;
end if;
¡
EXCEPTION
WHEN no_data THEN insert into empvalues(¡®fetchÓï¾äûÓлñµÃÊý¾Ý»òÊý¾ÝÒѾ´¦ÀíÍê');
END;
ÔÚdeclare½ÚÖж¨ÒåÀýÍâ ?out_of exception ; ÔÚ¿ÉÐÐÓï¾äÖÐÒýÆðÀýÍâ ?raise out_of £» ÔÚException½Ú´¦ÀíÀýÍâ ?when Out_of then ¡
Á½ÖÖ¸³ÖµÓï¾ä
ÀûÓÃ:=¸³Öµ
lvar1:='this is a argument';
lemp_rec.sal:= sal*2 + nvl(comm,0);
lsum_sal:=sum_sal+v_sal;
ÀûÓÃinto¸³Öµ
lFETCH c1 INTO e_eno , e_sal ;
commitÓï¾ä
l½áÊøµ±Ç°ÊÂÎñ, ʹµ±Ç°ÊÂÎñËùÖ´ÐеÄÈ«²¿ÐÞ¸ÄÓÀ¾Ã»¯¡£
ÔÚÖ´ÐÐÍêDMLÓï¾äÖ®ºóÒ»¶¨²»ÒªÍü¼ÇÔÚ´úÂëºóÃæ¼ÓÉÏcommitÀ´Ìá½»£¡
×¢ÊÍ
Á½ÖÖ×¢Ê͸ñʽ£º
-- This is a comment
»ò
/* This is a comment */
ʵÀýʾÀý
ʾÀý1
ΪԱ¹¤³¤¹¤×Ê¡£´Ó×îµÍ¹¤×ʵ÷ÆðÿÈ˳¤10£¥£¬µ«¹¤×Ê×ܶÄܳ¬¹ý5ÍòÔª,Çë¼ÆË㳤¹¤×ʵÄÈËÊýºÍ³¤¹¤×ʺóµÄ¹¤×Ê×ܶ²¢Êä³öÊä³ö³¤¹¤×ÊÈËÊý¼°¹¤×Ê×ܶ
¿ÉÄÜÓõ½µÄSQLÓï¾ä£º ?select empno,sal from emp order by sal ; ?select sum(sal) into s_sal from emp;
´ð°¸£º
/*
ΪԱ¹¤³¤¹¤×Ê¡£´Ó×îµÍ¹¤×ʵ÷ÆðÿÈ˳¤10£¥£¬µ«¹¤×Ê×ܶÄܳ¬¹ý50ÍòÔª,
Çë¼ÆË㳤¹¤×ʵÄÈËÊýºÍ³¤¹¤×ʺóµÄ¹¤×Ê×ܶ²¢Êä³öÊä³ö³¤¹¤×ÊÈËÊý¼°¹¤×Ê×ܶ
ÏÈд³ö¿ÉÄÜÓõ½µÄsqlÓï¾ä
select empno,sal from emp order by sal;
select sum(sal) from emp;
*/
set serveroutput on
declare
cursor c1 is select empno,sal from emp order by sal;
salTotal NUMBER; --¼Ç¼¹¤×Ê×ܶî
empCount NUMBER := 0; --Õǹ¤×ʵÄÈËÊý
pempno emp.empno% TYPE; --¼Ç¼Ա¹¤µÄ±àºÅ
psal emp.sal%type; --¼Ç¼Ա¹¤µÄ¹¤×Ê
begin
--µÃµ½µ±Ç°×ܹ¤×Ê
select sum(sal) into salTotal from emp;
--´ò¿ªÓαê
open c1;
--Ö´ÐÐÑ»·