ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

Oracleѧϰ£¨11£©£ºPLSQL³ÌÐòÉè¼Æ(Ò»)
2015-07-24 10:57:32 À´Ô´: ×÷Õß: ¡¾´ó ÖРС¡¿ ä¯ÀÀ:4´Î
Tags£ºOracle ѧϰ PLSQL ³ÌÐòÉè¼Æ

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¡¯);


?

OracleµÄÒì³£´¦Àí

ÀýÍâ

?

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;
--Ö´ÐÐÑ­»·
Ê×Ò³ ÉÏÒ»Ò³ 1 2 ÏÂÒ»Ò³ βҳ 1/2/2
¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
·ÖÏíµ½: 
ÉÏһƪ£ºORA-02049:³¬Ê±:·Ö²¼Ê½ÊÂÎñ´¦ÀíµÈ.. ÏÂһƪ£ºOracle11gR2ʹÓÃRMANDuplicate¸´..

ÆÀÂÛ

ÕÊ¡¡¡¡ºÅ: ÃÜÂë: (ÐÂÓû§×¢²á)
Ñé Ö¤ Âë:
±í¡¡¡¡Çé:
ÄÚ¡¡¡¡ÈÝ:

¡¤Linuxϵͳ¼ò½é (2025-12-25 21:55:25)
¡¤Linux°²×°MySQL¹ý³Ì (2025-12-25 21:55:22)
¡¤Linuxϵͳ°²×°½Ì³Ì£¨ (2025-12-25 21:55:20)
¡¤HTTP Åc HTTPS µÄ²î„ (2025-12-25 21:19:45)
¡¤ÍøÕ¾°²È«±ØÐ޿ΣºÍ¼ (2025-12-25 21:19:42)