PLSQL學習心得

--常用數(shù)據(jù)類型

VARCHAR2--文本

NUMBER--數(shù)字巡扇、金額

DATE--日期

VARCHAR2(1)--標記類字段

VARCHAR2(30)--編碼類字段

VARCHAR2(200)--描述類字段

VARCHAR2(2000)--備注類字段

--insert 一定要寫處理的字段掌唾,不要不寫全表插入

insert into cux_employee(employee_id,employee_no,....)

values(cux_employee_s.nextval,xxx,......);

--序列 表名_s

create sequence cux_employee_s;

--who 字段

created_by number --創(chuàng)建人

creation_date date --創(chuàng)建日期

last_updated_by number? --最后更新人

last_update_date date --最后更新日期

--主鍵 表名_PK

--唯一性索引 表名_U1..n

--索引 表名_N1..n

--塊

declare--聲明

begin--程序體開始

exception--異常處理

end;--程序體結束

DECLARE

? v_att1? NUMBER; --局部變量? v_變量名

? v_att2? NUMBER;

? v_result NUMBER;

BEGIN

? v_att1 := 100; --:= 賦值

? v_att2 := 0;

? v_result := v_att1 / v_att2;

? dbms_output.put_line(v_result);

EXCEPTION

? WHEN zero_divide THEN

? ? dbms_output.put_line('除數(shù)為0隘马!');

? WHEN OTHERS THEN

? ? dbms_output.put_line('error!');

END;

--常見預定義異常

DUP_VAL_ON_INDEX 唯一索引對應的列上有重復的值

NO_DATA_FOUND 使用 select into 未返回行舆吮,或應用索引表未初始化的元素時

TOO_MANY_ROWS 執(zhí)行 select into 時红淡,結果集超過一行

ZERO_DIVIDE 除數(shù)為 0

--select into? 取表中某一行數(shù)據(jù)做取值

--NO_DATA_FOUND 使用 select into 未返回行外莲,或應用索引表未初始化的元素時

--TOO_MANY_ROWS 執(zhí)行 select into 時猪半,結果集超過一行

DECLARE

? v_employee_no? VARCHAR2(30);

? v_employee_name cux_employee.employee_name%TYPE;

BEGIN

? SELECT e.employee_no,

? ? ? ? e.employee_name

? ? INTO v_employee_no,

? ? ? ? v_employee_name

? ? FROM cux_employee e

? WHERE e.employee_id = 4;

? dbms_output.put_line(v_employee_no || '/' || v_employee_name);

END;

--if & 自定義異常

DECLARE

? v_num NUMBER;

? e_error1 EXCEPTION; --申明自定義異常

? e_error2 EXCEPTION;

? e_error3 EXCEPTION;

BEGIN

? v_num := 2;

? IF v_num = 1 THEN

? ? RAISE e_error1; --拋出自定義異常

? ELSIF v_num = 2 THEN

? ? RAISE e_error2;

? ELSE

? ? RAISE e_error3;

? END IF;

EXCEPTION

? WHEN e_error1 THEN--捕獲自定義異常處理

? ? dbms_output.put_line('error1');

? WHEN e_error2 THEN

? ? dbms_output.put_line('error2');

? WHEN e_error3 THEN

? ? dbms_output.put_line('error3');

? WHEN OTHERS THEN

? ? dbms_output.put_line('others');

END;

--for 遍歷數(shù)據(jù)

--循環(huán)固定次數(shù)、范圍

DECLARE

? v_start NUMBER;

? v_end? NUMBER;

BEGIN

? v_start := 0;

? v_end? := 9;

? FOR cr IN v_start .. v_end

? LOOP

? ? dbms_output.put_line(cr);

? END LOOP;

END;

--遍歷結果集

DECLARE

? v_num NUMBER;

BEGIN

? v_num := 11;

? FOR cr IN (SELECT employee_no,

? ? ? ? ? ? ? ? ? ? employee_name

? ? ? ? ? ? ? FROM cux_employee

? ? ? ? ? ? ? WHERE rownum < v_num)

? LOOP

? ? dbms_output.put_line(cr.employee_no || cr.employee_name);

? END LOOP;

END;

--view 視圖

--創(chuàng)建 或 覆蓋 對象類型 對象名稱_v as

create or replace view cux_employee_v as

SELECT employee_no,

? ? ? employee_name

? FROM cux_employee

WHERE rownum < 10

select * from cux_employee_v;

--function 函數(shù)

--創(chuàng)建 或 覆蓋 對象類型 對象名稱(參數(shù)1 數(shù)據(jù)類型,參數(shù)2 數(shù)據(jù)類型,........)返回 數(shù)據(jù)類型 as

--傳入?yún)?shù) p_參數(shù)名

CREATE OR REPLACE FUNCTION test_fun(p_employee_id NUMBER) RETURN VARCHAR2 AS

? --DECLARE

? v_employee_no? VARCHAR2(30);

? v_employee_name cux_employee.employee_name%TYPE;

? v_result? ? ? ? VARCHAR2(200);

BEGIN

? SELECT e.employee_no,

? ? ? ? e.employee_name

? ? INTO v_employee_no,

? ? ? ? v_employee_name

? ? FROM cux_employee e

? WHERE e.employee_id = p_employee_id;

? v_result := v_employee_no || v_employee_name;

? --dbms_output.put_line(v_employee_no || '/' || v_employee_name);

? RETURN v_result;

END;

DECLARE

? v_employee_info VARCHAR2(200);

BEGIN

? v_employee_info := test_fun(p_employee_id => 5);

? dbms_output.put_line(v_employee_info);

END;

SELECT test_fun(p_employee_id => e.employee_id) employee_info,

? ? ? e.*

? FROM cux_employee e;

--procedre 存儲過程

--創(chuàng)建 或 覆蓋 對象類型 對象名稱(參數(shù)1 傳入/傳出 數(shù)據(jù)類型,參數(shù)2 傳入/傳出 數(shù)據(jù)類型,........) as

--傳入?yún)?shù) p_參數(shù)名

--傳出參數(shù) o_參數(shù)名

--傳入傳出參數(shù) x_參數(shù)名

CREATE OR REPLACE PROCEDURE test_proc(p_employee_id? NUMBER,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? o_employee_no? OUT VARCHAR2,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? o_employee_name OUT VARCHAR2) AS

? --DECLARE

BEGIN

? SELECT e.employee_no,

? ? ? ? e.employee_name

? ? INTO o_employee_no,

? ? ? ? o_employee_name

? ? FROM cux_employee e

? WHERE e.employee_id = p_employee_id;

END;

DECLARE

? v_employee_no? VARCHAR2(30);

? v_employee_name VARCHAR2(200);

BEGIN

? test_proc(p_employee_id => 5, o_employee_no => v_employee_no, o_employee_name => v_employee_name);

? dbms_output.put_line(v_employee_no || v_employee_name);

END;

--package

--package 包頭 申明公共對象

--創(chuàng)建 或 覆蓋 對象類型 對象名_pkg as

CREATE OR REPLACE PACKAGE test_pkg AS

? FUNCTION test_fun(p_employee_id NUMBER) RETURN VARCHAR2;

? PROCEDURE test_proc(p_employee_id? NUMBER,

? ? ? ? ? ? ? ? ? ? ? o_employee_no? OUT VARCHAR2,

? ? ? ? ? ? ? ? ? ? ? o_employee_name OUT VARCHAR2);

END test_pkg;

--package body 包體 具體的程序

--創(chuàng)建 或 覆蓋 對象類型 對象名_pkg as

CREATE OR REPLACE PACKAGE BODY test_pkg AS

? FUNCTION test_fun(p_employee_id NUMBER) RETURN VARCHAR2 AS

? ? --DECLARE

? ? v_employee_no? VARCHAR2(30);

? ? v_employee_name cux_employee.employee_name%TYPE;

? ? v_result? ? ? ? VARCHAR2(200);

? BEGIN

? ? SELECT e.employee_no,

? ? ? ? ? e.employee_name

? ? ? INTO v_employee_no,

? ? ? ? ? v_employee_name

? ? ? FROM cux_employee e

? ? WHERE e.employee_id = p_employee_id;

? ? v_result := v_employee_no || v_employee_name;

? ? --dbms_output.put_line(v_employee_no || '/' || v_employee_name);

? ? RETURN v_result;

? END;

? PROCEDURE test_proc(p_employee_id? NUMBER,

? ? ? ? ? ? ? ? ? ? ? o_employee_no? OUT VARCHAR2,

? ? ? ? ? ? ? ? ? ? ? o_employee_name OUT VARCHAR2) AS

? ? --DECLARE

? BEGIN

? ? SELECT e.employee_no,

? ? ? ? ? e.employee_name

? ? ? INTO o_employee_no,

? ? ? ? ? o_employee_name

? ? ? FROM cux_employee e

? ? WHERE e.employee_id = p_employee_id;

? END;

END;

DECLARE

? v_employee_info VARCHAR2(200);

BEGIN

? v_employee_info := test_pkg.test_fun(p_employee_id => 5);

? dbms_output.put_line(v_employee_info);

END;

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末偷线,一起剝皮案震驚了整個濱河市磨确,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌声邦,老刑警劉巖乏奥,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異亥曹,居然都是意外死亡邓了,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門歇式,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驶悟,“玉大人,你說我怎么就攤上這事材失『埙ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵龙巨,是天一觀的道長笼呆。 經(jīng)常有香客問我,道長旨别,這世上最難降的妖魔是什么诗赌? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮秸弛,結果婚禮上铭若,老公的妹妹穿的比我還像新娘。我一直安慰自己递览,他們只是感情好叼屠,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绞铃,像睡著了一般镜雨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上儿捧,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天荚坞,我揣著相機與錄音挑宠,去河邊找鬼。 笑死颓影,一個胖子當著我的面吹牛各淀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诡挂,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼揪阿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了咆畏?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤吴裤,失蹤者是張志新(化名)和其女友劉穎旧找,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體麦牺,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡钮蛛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了剖膳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魏颓。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吱晒,靈堂內(nèi)的尸體忽然破棺而出甸饱,到底是詐尸還是另有隱情,我是刑警寧澤仑濒,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布叹话,位于F島的核電站,受9級特大地震影響墩瞳,放射性物質發(fā)生泄漏驼壶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一喉酌、第九天 我趴在偏房一處隱蔽的房頂上張望热凹。 院中可真熱鬧,春花似錦泪电、人聲如沸般妙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽股冗。三九已至,卻和暖如春和蚪,著一層夾襖步出監(jiān)牢的瞬間止状,已是汗流浹背烹棉。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留怯疤,地道東北人浆洗。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像集峦,于是被迫代替她去往敵國和親伏社。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

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

  • 先看成品塔淤,再貼步驟圖摘昌。 工具:b2自動鉛筆,橡皮高蜂,直尺聪黎。 這是我姐和小外甥女兒,用了一上午打形备恤,下午和晚上細化稿饰。因...
    江安河里的魚閱讀 265評論 1 3