十
三、儲存過程和儲存函式
1、掌握儲存過程(相當於建立乙個函式或者方法體,然後通過外部對其呼叫)
指儲存在資料庫中供所有程式呼叫的子程式叫做儲存過程或儲存函式。
相同點:
完成特定功能的程式
區別:是否用return語句返回值
(1)建立和使用儲存過程
用create procedure命令建立儲存過程和儲存函式
語法:create or replace procedure 過程名(引數列表) as pl/sql 子程式體(說明部分);
事例:(a)列印乙個儲存過程:列印helloworld(無引數)
create or replace procedure sayhelloworld
as --說明部分
begin
dbms_output.put_line('hello world !!!');
end;
/在編譯器左邊的過程裡形成大寫的sayhelloworld
對其呼叫:
方法一:
execute 簡寫為exec sayhelloworld();
方法二:
begin
sayhelloworld();
sayhelloworld();
end;
/(b)帶引數的儲存過程
事例:為指定的員工,漲100塊錢的工資,並且列印漲前和漲後的薪水
思路:1、建立乙個帶引數的儲存過程
2、給指定的員工漲100塊錢的工資,並且列印漲前和漲後的薪水
create or replace procedure raisesalary(eno in number)
as --定義乙個變數儲存漲錢的薪水
psal emp.sal%type;
begin
--得到員工漲前的薪水
select sal into psal from emp where empno=eno;
--給員工漲100
update emp set sal=sal+100 where empno=eno;
dbms_output.put_line('漲前薪水 :'||psal||'漲後薪水 :'||(psal+100));
--是否需要commit?
--注意:一般不在儲存過程或者儲存函式中,commit和rollback.原則不絕對
end;
/如何呼叫:
begin
raisesalary(7839);
raisesalary(7566);
commit;
end;
如何除錯
注意:不推薦遠端除錯,推薦本地除錯
過程-->右鍵-->編譯以進行除錯
設定斷點
select sal into psal from emp where empno=eno;
點選瓢蟲除錯
更改值 eno := 7839; 點選確定
授權系統認證登入:sqlplus / as sysdba
grant debug connect session ,debug any procedure to scott;
右鍵點選檢測psal
除錯點選f8
2、掌握儲存函式
函式為一命名的儲存程式,可帶引數,並返回一計算值.
函式和過程的結構類似,但必須有乙個return子句,用於返回函式值.
(1)建立儲存函式的語法
create or replace function 函式名(引數列表)
return 函式值型別
as pl/sql子程式體;
事例:查詢某個員工的年收入
create or replace function queryempincome(eno in number)
return number
as--定義變數儲存員工的薪水和獎金
psal emp.sal%type;
pcomm emp.comm%type;
begin
--得到該員工的月薪和獎金
select sal,comm into psal,pcomm from emp where empno=eno;
--直接返回年收入
return psal*12+nvl(pcomm,0);
end;
/set linesize 200
select * from emp;
呼叫儲存函式
(2)in和out引數
一般來講,儲存過程和儲存函式的區別在於儲存函式可以有乙個返回值,而儲存過程沒有返回值.
儲存過程和儲存函式都可以有out引數
儲存過程和儲存函式都可以有多個out引數
儲存過程可以通過out引數來實現返回值
什麼時候用儲存過程/儲存函式?
原則:-- 如果只有乙個返回值,用儲存函式,否則,就用儲存過程.
----out引數,查詢某個員工姓名,月薪和職位
create or replace procedure queryempinform(eno in number, pename out varchar2,psal out number,pjob out varchar2)
asbegin
--得到該員工的姓名,月薪和職位
select ename,sal,empjob into pename,psal,pjob from emp where empno=eno;
end;
/思考:(1)查詢某個員工的所有資訊---->out引數太多了
set linesize 80
desc emp
(2)查詢某個部門中所有員工的所有資訊--->out中返回集合
(3)在應用程式中訪問儲存過程和儲存函式
(a)訪問儲存過程
public class jdbcutils catch (exception e)
return conn;
}// 關閉連線物件
public static void close(connection conn) catch (exception e) }}
public static void close(statement stmt) catch (exception e) }}
public static void close(resultset rs) catch (exception e) }}
}public class testprocedure ";
connection conn = null;
callablestatement call = null;
try catch (exception e) finally}}
(b)訪問儲存函式
public class testfunction ";
connection conn = null;
callablestatement call = null;
try catch (exception e) finally }}
(4)在out引數中使用游標
(a)申明包結構
(b)包頭
(c)包體
事例:查詢某個部門中所有員工的所有資訊
包頭:create or replace package mypackage as
--type自定義型別empcursor
type empcursor is ref cursor;
procedure queryemplist(dno in number,emplist out empcursor);
end mypackage;
*****包體需要實現包頭中生命的所有方法*******
操作:程式包----->右鍵--->新建程式包--->包名設定mypackage--->確定--->編譯--->ctril+s執行
包體:create or replace package body mypackage as
procedure queryemplist(dno in number,emplist out empcursor) as
begin
open emplist for select * from emp where deptno =dno;
end queryemplist;
end mypackage;
操作:選中mypackage-->右鍵-->建立主體--->編譯--->ctril+s執行
檢視包:
desc mypackage
注意:需要帶上包名訪問
(5)在應用中訪問包中的儲存過程
public class testmypackage ";
connection conn = null;
callablestatement call = null;
resultset rs = null;
try
} catch (exception e) finally }}
二十二 Oracle學習筆記 Oracle異常
一 oralce異常 1.oracle低層定義了很多異常,每個異常都有乙個唯一的編碼,這些異常之中,有一些是比較常見的,oracle 給這些異常定義了名稱,可以直接使用,其他沒有名稱只有編碼的不能直接使用。2.異常的分類 1 預定義異常 既有編碼又有名稱的異常是預定義異常,此類異常可以直接使用 2 ...
How Tomcat Works學習筆記《十二》
host和engine 在catalina中engine代表catalina實體,host代表乙個虛擬的主機,engine包括多個host,乙個host包括多個context。在tomcat中host用org.apache.catalina.host介面表示 public inte cehostex...
Linux 學習筆記 十二
打包表示把一堆檔案變成乙個包裹,打包是必須指定要打包的檔案。tar 打包工具 f 指定包的名字 c 建立包 v 顯示建立過程 t 檢視包中內容 x 解包 r 新增檔案到包中 delete filename 刪除包中指定檔案 get filename 取出包中指定檔案 例 tar cf etc.tar...