plsql編程及案例

plsql語(yǔ)句塊:

set serveroutput on; //打開(kāi)控制臺(tái)輸出的命令

語(yǔ)法:

declare

聲明部分

begin

//執(zhí)行部分

異常召嘶,事物,語(yǔ)句塊等

end;

變量的類(lèi)型

oracle變量類(lèi)型蓬抄,oracle數(shù)據(jù)類(lèi)型:integer varchar2等

自定義數(shù)據(jù)類(lèi)型

1. 定義和列的類(lèi)型保持一致

v_sal emp.sal%type;-- 和emp表sal列的類(lèi)型保持一致

2. 定義和表達(dá)類(lèi)型保持一致

v_emp emp%rowtype; -- 和emp表的結(jié)構(gòu)一致

3. 定義自己的封裝類(lèi)(對(duì)象)

--聲明的是類(lèi)型

type type_emp_name_sal is record(v_empname EMP.ENAME%type,v_empsal EMP.SAL%type);

--變量名是v_name_sal 類(lèi)型是type_emp_name_sal

v_name_sal type_emp_name_sal;

4. 數(shù)組

--聲明數(shù)組類(lèi)型

type int_array is table of integer index by BINARY_integer;

--int類(lèi)型數(shù)組的變量

v_numbers int_array;

流程控制語(yǔ)句

1. if語(yǔ)句

if v_id = 1 then

dbms_output.put_line(v_id);

elsif v_id = 2 then

dbms_output.put_line('elsif');

else

dbms_output.put_line(v_id);

end if;

?

2. switch語(yǔ)句? case 語(yǔ)句

?

case

when v_id = 1 then

dbms_output.put_line(v_id);

when? v_id = 2 then

dbms_output.put_line('elsif');

else

dbms_output.put_line(v_id);

end case;

3. 循環(huán)語(yǔ)句

1. for循環(huán)

-- for循環(huán)

for v_i in reverse 1..10 loop

SYS.DBMS_OUTPUT.PUT_LINE(v_i);

end loop;

?

2. while循環(huán)

--while循環(huán)

while v_id < 10 loop

SYS.DBMS_OUTPUT.PUT_LINE(v_id);

--條件的改變

v_id := v_id + 1;

end loop;

3. loop循環(huán)

loop

SYS.DBMS_OUTPUT.PUT_LINE(v_id);

--條件的改變

v_id := v_id + 1;

exit when v_id = 10;

end loop;

4. 通過(guò)goto語(yǔ)句完成循環(huán)

<>

SYS.DBMS_OUTPUT.PUT_LINE(v_id);

v_id := v_id + 1;

if v_id < 10 then

goto a;

end if;

輸出菱形星號(hào)

*

***

*****

***

*

代碼:

declare

kong integer := 0;

xing integer :=0;

begin

for i in 1..5 loop

--每行由空格和星號(hào)組成

if i < 4 then

-- 1. 上半

kong := 3 - i;

xing := 2 * i - 1;

else

-- 2.下半

kong := i - 3;

xing := -2 * i + 11;

end if;

--輸出空格

for k in 1..kong loop

dbms_output.put(' ');

end loop;

--輸出星號(hào)

for k in 1..xing loop

dbms_output.put('*');

end loop;

--換行

dbms_output.new_line();

end loop;

end;

10個(gè)人圍成圈染厅,數(shù)到3退出圈,問(wèn)最后退出的是誰(shuí)

//數(shù)數(shù)問(wèn)題

declare

v_personNumber integer := 10;--人數(shù)

v_number integer := 3;--數(shù)的數(shù)

--int 類(lèi)型的數(shù)組

type int_array is table of integer index by BINARY_integer;

v_data int_array;

fang integer := 0;--放數(shù)據(jù)的下標(biāo)

qu? integer := 0;--取數(shù)據(jù)的下標(biāo)

numbers integer := 0;--存放數(shù)據(jù)的個(gè)數(shù)

v_length integer := v_personNumber;--隊(duì)列的大小

v_count integer := 0;--計(jì)數(shù)器

v_person integer := 0;--臨時(shí)存放出隊(duì)列的人

begin

-- 把人放入數(shù)組中

for i in 1..v_personNumber loop

v_data(fang) := i;

fang := fang + 1;

numbers := numbers + 1;

end loop;

-- 循環(huán)取數(shù)據(jù)判斷

while numbers <> 1 loop

--超過(guò)1個(gè)人弧腥,沒(méi)有退出圈

--出隊(duì)列

v_person := v_data(mod(qu,v_length));

qu := qu + 1;

numbers := numbers - 1;

--計(jì)數(shù)器加加

v_count := v_count + 1;

--判斷是否是v_number倍數(shù)

if mod(v_count,v_number) <> 0 then

--不是,添加到隊(duì)列

v_data(mod(fang,v_length)) := v_person;

fang := fang+1;

numbers := numbers + 1;

end if;

end loop;

--輸出結(jié)果

dbms_output.put_line(v_data(mod(qu,v_length)));

end;

plsql操作數(shù)據(jù)

分析: 對(duì)emp集體漲工資赏酥,漲幅不一致喳整, 1000以?xún)?nèi) 40%? 1000-2000 30% 2000-3000 20 3000 10%

declare

-- 數(shù)據(jù)全部取出

--數(shù)組存放數(shù)據(jù)(相當(dāng)于jdbc中的結(jié)果集封裝)

--員工編號(hào)和員工的薪水

type type_empno_sal is record (v_empno EMP.empno%type,v_sal EMP.SAL%type);

--定義員工數(shù)組

type type_emps_list is table of type_empno_sal index by binary_integer;

--定義保存員工信息的容器

v_emps_no_sals type_emps_list;

v_rows integer;--存放多少條數(shù)據(jù)

begin

select count(1) into v_rows from emp;

--去員工表每行信息,存儲(chǔ)到容器中

for r in 1..v_rows loop

select empno,sal into v_emps_no_sals(r - 1) from (select rownum num,emp.* from emp) e where? e.num = r;

end loop;

for r in 1..v_rows loop

case

when v_emps_no_sals(r-1).v_sal <= 1000 then

update emp set sal = sal * 1.4 where empno = v_emps_no_sals(r-1).v_empno;

when v_emps_no_sals(r-1).v_sal > 1000 and? v_emps_no_sals(r-1).v_sal <= 2000 then

update emp set sal = sal * 1.3 where empno = v_emps_no_sals(r-1).v_empno;

when v_emps_no_sals(r-1).v_sal > 2000 and? v_emps_no_sals(r-1).v_sal <= 3000 then

update emp set sal = sal * 1.2 where empno = v_emps_no_sals(r-1).v_empno;

else

update emp set sal = sal * 1.1 where empno = v_emps_no_sals(r-1).v_empno;

end case;

end loop;

commit;

end;

游標(biāo)

1.聲明游標(biāo)

2.打開(kāi)游標(biāo)

3.循環(huán)提前游標(biāo)

4.關(guān)閉游標(biāo)(釋放游標(biāo)占用的空間)

案例: 游標(biāo)實(shí)現(xiàn)降薪處理

declare

--聲明游標(biāo)

cursor v_emp_cur is select empno,sal from emp;

--信息封裝

type type_empno_sal is record (v_empno EMP.empno%type,v_sal EMP.SAL%type);

v_temp_empno_sal type_empno_sal;

begin

-- 打卡游標(biāo)

open v_emp_cur;

-- 循環(huán)提取游標(biāo)

loop

--去當(dāng)前游標(biāo)所在行的數(shù)據(jù)

fetch v_emp_cur into v_temp_empno_sal;

--判斷提取成功或失敗

if v_emp_cur%found then

--游標(biāo)有數(shù)據(jù)

-- SYS.DBMS_OUTPUT.PUT_LINE(v_temp_empno_sal.v_empno||'<>'||v_temp_empno_sal.v_sal);

case

when v_temp_empno_sal.v_sal > 3000 then

update emp set sal = sal * 0.6 where empno = v_temp_empno_sal.v_empno;

when v_temp_empno_sal.v_sal > 2000 and v_temp_empno_sal.v_sal<= 3000 then

update emp set sal = sal * 0.7 where empno = v_temp_empno_sal.v_empno;

when v_temp_empno_sal.v_sal > 1500 and? v_temp_empno_sal.v_sal <= 2000 then

update emp set sal = sal * 0.8 where empno = v_temp_empno_sal.v_empno;

else

update emp set sal = sal * 0.99 where empno = v_temp_empno_sal.v_empno;

end case;

else

--游標(biāo)提取完畢

exit;

end if;

commit;

end loop;

--關(guān)閉游標(biāo)

close v_emp_cur;

end;

案例2: for循環(huán)與游標(biāo)

declare

--聲明游標(biāo)

cursor cur_emp_no_sal(v_deptno emp.deptno%type) is select empno,sal from emp where deptno= v_deptno;

begin

--for循環(huán)提取游標(biāo)

for v_empno_sal in cur_emp_no_sal(10) loop

SYS.DBMS_OUTPUT.PUT_LINE(v_empno_sal.empno||'<>'||v_empno_sal.sal);

end loop;

end;

異常處理

根據(jù)異常名字exceptionwhen Too_many_rows then

SYS.DBMS_OUTPUT.PUT_LINE('Too_many_rows');

when others then

注意: others只能寫(xiě)在最后面

根據(jù)錯(cuò)誤代號(hào)exceptionwhen others then

case

when sqlcode=-1476 then

DBMS_OUTPUT.PUT_LINE('被0整除異常');

when sqlcode = -1422 then

DBMS_OUTPUT.PUT_LINE('返回多條記錄賦值');

else

DBMS_OUTPUT.PUT_LINE('其他異常');

end case;

--? SYS.DBMS_OUTPUT.PUT_LINE('出現(xiàn)異常了'||sqlcode||'<>'||sqlerrm);--? rollback;

自定義異常

declaremy_exec exception;my_exec2 exception;--把自定義異常和錯(cuò)誤代號(hào)綁定pragma EXCEPTION_INIT (my_exec2, -9527);beginif 3 > 2 then

--拋出異常 throw new 對(duì)象

raise my_exec2;

end if;

exception

when my_exec then

SYS.DBMS_OUTPUT.PUT_LINE('自定義異常'||sqlcode);

when my_exec2 then

SYS.DBMS_OUTPUT.PUT_LINE('自定義異常2<>'||sqlcode);

when others then

SYS.DBMS_OUTPUT.PUT_LINE('其他異常');

end;

4.自定義異常2

declare

my_exec exception;

my_exec2 exception;

pragma EXCEPTION_INIT (my_exec2, -9527);

begin

if 3 > 2 then

--拋出異常 throw new 對(duì)象 -20000 到 -20999

RAISE_APPLICATION_ERROR(-20000, '我的異常');

end if;

exception

when my_exec then

SYS.DBMS_OUTPUT.PUT_LINE('自定義異常'||sqlcode);

when my_exec2 then

SYS.DBMS_OUTPUT.PUT_LINE('自定義異常2<>'||sqlcode);

when others then

SYS.DBMS_OUTPUT.PUT_LINE('其他異常'||sqlcode);

end;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末裸扶,一起剝皮案震驚了整個(gè)濱河市框都,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呵晨,老刑警劉巖魏保,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異摸屠,居然都是意外死亡谓罗,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)季二,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)檩咱,“玉大人,你說(shuō)我怎么就攤上這事胯舷】舔牵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵桑嘶,是天一觀(guān)的道長(zhǎng)炊汹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)逃顶,這世上最難降的妖魔是什么兵扬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮口蝠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘津坑。我一直安慰自己妙蔗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布疆瑰。 她就那樣靜靜地躺著眉反,像睡著了一般。 火紅的嫁衣襯著肌膚如雪穆役。 梳的紋絲不亂的頭發(fā)上寸五,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音耿币,去河邊找鬼梳杏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的十性。 我是一名探鬼主播叛溢,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼劲适!你這毒婦竟也來(lái)了楷掉?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤霞势,失蹤者是張志新(化名)和其女友劉穎烹植,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體愕贡,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡草雕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颂鸿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片促绵。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嘴纺,靈堂內(nèi)的尸體忽然破棺而出败晴,到底是詐尸還是另有隱情,我是刑警寧澤栽渴,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布尖坤,位于F島的核電站,受9級(jí)特大地震影響闲擦,放射性物質(zhì)發(fā)生泄漏慢味。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一墅冷、第九天 我趴在偏房一處隱蔽的房頂上張望纯路。 院中可真熱鬧,春花似錦寞忿、人聲如沸驰唬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)叫编。三九已至,卻和暖如春霹抛,著一層夾襖步出監(jiān)牢的瞬間搓逾,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工杯拐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留霞篡,地道東北人世蔗。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像寇损,于是被迫代替她去往敵國(guó)和親凸郑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容