本篇文章給大家分享的是有關(guān)怎么進(jìn)行PLSQL重點(diǎn)問題理解和實(shí)戰(zhàn),小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),瑪沁企業(yè)網(wǎng)站建設(shè),瑪沁品牌網(wǎng)站建設(shè),網(wǎng)站定制,瑪沁網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,瑪沁網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
一 ORACLE中PL/SQL使用的集合變量類型有RECORD(類)、VARRAY(sql數(shù)組)、TABLE(嵌套表)
TABLE(嵌套表) 可以加index定義也可以不加,加表示index by是建立主鍵索引相當(dāng)于數(shù)組,不加就是個(gè)嵌套表集合
1 TABLE(嵌套表)定義表變量類型
type type_table_emp_empno is table of emp.empno%type index by binary_integer;--TYPE表示表中一行中字段類型
v_empnos type_table_emp_empno;
如果用%type定義
定義集合變量v_empnos 是一個(gè)有emp.empno字段類型的數(shù)組,自己理解是存放實(shí)際還是一個(gè)表,里面只有一個(gè)字段,且字段上有索引
對(duì)此集合變量(is table of index by)類型的操作 包括count,delete,但不能用trim
對(duì)VARRAY 可以用count,delete和trim
使用形式
select to_char(truck_in_out_id),
employee_id,
employee_nm,
truck_in_purpose
bulk collect into
carid,
empid,
empnm,
dest
forall i in 1 .. carid.COUNT
update cpnew.CP_VISIT_APPLY a
set a.mgr_principal_id = empid(i),
a.mgr_principal_nm = empnm(i),
a.visit_dest = dest(i)
where a.visit_apply_id = carid(i)
and a.mgr_principal_id is null;
type delArray1 is table of TEST.COURSE%ROWTYPE index by binary_integer; --ROWTYPE表示表中一行的記錄類型
cur_result delArray1;
如果用%rowtype定義
定義集合變量cur_result是一個(gè)COURSE表類型的集合,自己理解是按一個(gè)表存放,里面包括COURSE的所有字段類型,且用整形數(shù)做這個(gè)表的索引
使用形式
select * bulk collect into cur_result
forall i in 1 .. cur_result.COUNT
update cpnew.CP_VISIT_APPLY a
set a.mgr_principal_id = cur_result(i).empid,
a.mgr_principal_nm = cur_result(i).empnm,
a.visit_dest = cur_result(i).dest
where a.visit_apply_id = cur_result(i).carid
and a.mgr_principal_id is null;
實(shí)際工作中的例子
plsql 大數(shù)據(jù)量刪除,修改的方法FORALL加bulk collection into
create or replace procedure zl_del_UPDATEAPPLY_DEST187 as
--type ridArray is table of rowid index by binary_integer;
type delArray1 is table of varchar2(32) index by binary_integer;
type delArray2 is table of CP_2012.CP_VISIT_TRUCK_INOUT.employee_id%type index by binary_integer;
type delArray3 is table of CP_2012.CP_VISIT_TRUCK_INOUT.employee_nm%type index by binary_integer;
type delArray4 is table of CP_2012.CP_VISIT_TRUCK_INOUT.truck_in_purpose%type index by binary_integer;
//你會(huì)發(fā)現(xiàn)用%type就得每個(gè)字段都得定義他的類型
carid delArray1;
empid delArray2;
empnm delArray3;
dest delArray4;
begin
select to_char(truck_in_out_id),
employee_id,
employee_nm,
truck_in_purpose
bulk collect into
carid,
empid,
empnm,
dest
from CP_2012.CP_VISIT_TRUCK_INOUT;
--where rownum < 600001;
forall i in 1 .. carid.COUNT
update cpnew.CP_VISIT_APPLY a
set a.mgr_principal_id = empid(i),
a.mgr_principal_nm = empnm(i),
a.visit_dest = dest(i)
where a.visit_apply_id = carid(i)
and a.mgr_principal_id is null;
DBMS_OUTPUT.PUT_LINE(to_char(carid.COUNT) ||
' records deleted from temp_mid_hubei_bak !!!');
end;
這種方法最大缺點(diǎn)是forall里不能訪問遠(yuǎn)程表,也不能用dblink,且只能放dml語(yǔ)句不能用dbms.putline
經(jīng)過測(cè)試過發(fā)現(xiàn)for可以替代forall盡管時(shí)間相對(duì)慢一點(diǎn),但也能接受,所以可以在for中用dblink,相應(yīng)語(yǔ)句如下:
for i in 1 .. carid.COUNT
loop
update cpnew.CP_VISIT_APPLY@LINK_213TO187_CPNEW a
set a.mgr_principal_id = empid(i),
a.mgr_principal_nm = empnm(i),
a.visit_dest = dest(i)
where a.visit_apply_id = carid(i)
and a.mgr_principal_id is null;
2 Record變量類型:(相當(dāng)于java的類)
定義
type type_record_dept is record
(
deptno dept.deptno%type,
dname dept.dname%type,
loc dept.loc%type
);
v_temp type_record_dept;
3 VARRAY
定義和使用
CREATE OR REPLACE TYPE numbers_t IS VARRAY (5) OF NUMBER
DECLARE
l_list numbers_t:= numbers_t (1, 2, 3, 4, 5);
BEGIN
l_list.DELETE;
DBMS_OUTPUT.put_line (CASE l_list.COUNT WHEN 0 THEN 'Empty' END);
END;
數(shù)組使用例子 參考 Oracle數(shù)組的使用 http://blog.itpub.net/12932950/viewspace-351791/
還可以對(duì)比本人之前的blog查看游標(biāo)和bulk collect into的用法 http://blog.itpub.net/750077/viewspace-2075986/
二 PL/SQL異常
異常類型 1預(yù)定義的異常處理,2非預(yù)定義 ( Predefined )錯(cuò)誤,3用戶定義(User_define) 錯(cuò)誤
一般預(yù)定義和用戶定義異常使用較多
1預(yù)定義異常 如oracle已定義的異常
ORA-1403 No_data_found SELECT INTO沒有找到數(shù)據(jù)
使用時(shí)如果select沒查出數(shù)據(jù)時(shí)就直接處理沒找到數(shù)據(jù)的異常
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('數(shù)據(jù)庫(kù)中沒有編碼為'||v_empno||'的員工');
END;
2用戶自定義異常
用戶先定義異常
no_result EXCEPTION;
如沒有更新的數(shù)據(jù)時(shí),拋出這個(gè)異常
UPDATE employees SET salary = salary+100 WHERE employee_id = v_empno;
IF SQL%NOTFOUND THEN
RAISE no_result;
END IF;
然后處理這個(gè)異常
EXCEPTION
WHEN no_result THEN
DBMS_OUTPUT.PUT_LINE('你的數(shù)據(jù)更新語(yǔ)句失敗了!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END;
SQLCODE,SQLERRM是ORACLE函數(shù),會(huì)打印錯(cuò)誤代碼和錯(cuò)誤名稱
以上就是怎么進(jìn)行PLSQL重點(diǎn)問題理解和實(shí)戰(zhàn),小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。