儲存過程:
一、什麼是儲存過程
儲存過程是一種命名pl/sql程式塊,它既可以沒有引數,也可以有若干個輸入、輸出引數,甚至可以有多個既做輸入又做輸出的引數,但他通常沒有返回值。儲存過程被儲存在資料庫中他不可以被sql語句直接執行或呼叫,只能通過execut命令執行或在pl/sql程式塊內部被呼叫。由於儲存過程是已將編譯好的**所以被呼叫或引用時,其執行效率很高。
二、建立儲存過程
create [or replace] procedure pro_name [ (parameter1 [parameter2]...) is/as
begin
plsql_sentences;`在這裡插入**片`
[exception]
[dowith_sentences;]
end [pro_name];
引數說明:
<1>.[ ]內的是可選項。
<2>.pro_name 是儲存過程的名稱,當資料庫裡有這個名稱時,可以加上or replace 覆蓋掉原來的。
<3>.parameter1 是儲存過程的引數。如果是輸入引數則需要在其後邊指定「in」關鍵字。若是輸出引數則需要指定「out」關鍵字。在in或者out後的是引數型別但是不能指定該型別長度。
<4>.plsql_sentences 是儲存過程功能實現的主體
<5>.dowith_sentences 異常處理語句。是乙個可選項。
1、不含引數的儲存過程
將empno=9010的人的名字修改為your name。
create or replace procedure proc_excution is
begin
update emp set ename='your name'
where empno=9010
end proc_excution;
/
上邊的update僅僅是被編譯了,並沒有被執行。想要被執行還要在sql*plus環境中用execute命令來執行該儲存過程。或者在pl/sql中呼叫該儲存過程·。
2、含參的儲存過程及儲存過程的引數
1>. in模式引數
create or replace procedure insert_dept (
num_deptno in number, -- 定義in模式的變數他儲存部門編號
var_ename in varchar2, -- 定義in模式變數他儲存部門名稱
var_loc in varchar2 ) is
begin
insert into dept
values (num_deptno,var_ename,var_loc);-- 向dept表中插入記錄
在這裡特別要注意的是引數的型別不能定義長度
2>.out模式引數
create or replace procedure select_dept(
num_deptno in number,
var_dname out dept.dname%type,
var_loc out dept.loc%type) is
begin
select dname ,loc
into var_dname,var_loc
from dept
where deptno=num_deptno;
exception
when no_data_found then
dbms_output.put_line (' 該部門號的不存在 ');
在上面這個儲存過程中定義了兩個out型別的引數,既然是輸出型的引數型別就需要在呼叫或執行有兩個變數值來保護這兩個out型別引數的返回值,
又分為兩種情況:
3>.in out 模式引數
在執行儲存過程時,in引數不能被修改,只能根據被傳入的指定值為儲存過程提供資料,而out引數只能被賦值而不能像in引數那樣為儲存過程本身提供資料,但in out引數可以兼顧。在呼叫儲存過程師可以從外界向該型別引數傳入值;在執行完儲存過程後,可以將該引數返回值傳給外界;
例題:求乙個數值的平方或者平方根
呼叫emmmm,這個地方還有些問題,問題是他沒有輸出3的平方根呀(⊙o⊙)…
3、補充:含引數的儲存過程,即儲存過程傳入引數的方式
說含有引數的儲存過程之前先說一下下儲存過程傳入引數的方式:
第一種:指定名稱傳遞
指定引數名稱傳遞是指在向儲存過程傳遞引數時需要指定引數名稱,即引數名稱在左邊,中間是賦值符號「=>」,右側是引數值,其格式如下:
pro_name (parameter1=>value [parameter1=>value2]…);
例題3:
以pl/sql塊中呼叫儲存過程insert_dept,使用指定名稱向其傳入引數值,然後執行:
begin
insert_dept (var_ename=>'採購部',var_loc=>'成都',num_deptno=>15);
end;
/
== 第二種:按位置傳遞==
指定名稱傳遞引數時如果引數過多會顯得**冗長,不易閱讀,這時如果採用按位傳遞引數就會方便很多,按位傳參時引數的順序必須要與儲存過程這中定義的引數順序一致。
begin
insert_dept(28,'工程部','洛陽');
第三種:混合方式傳遞
gu名思議,混合方式就是前兩種方式的結合,這裡就不再贅述了。
Oracle儲存過程呼叫儲存過程
oracle儲存過程呼叫有返回結果集的儲存過程一般用光標的方式,宣告乙個游標,把結果集放到游標裡面,然後迴圈游標 declare newcs sys refcursor cs1 number cs2 number cstype table rowtype table列的個數和newcs返回的個數一樣...
ORACLE儲存過程
自定義函式開始 create or replace function fn wftemplateidget templatecategoryid number,organid number,templatemode number return number istemplateid number i...
Oracle 儲存過程
create or replace procedure p 有就替換,沒有就建立 iscursor c is select from emp for update begin for v emp in c loop if v emp.deptno 10 then update emp2 set sa...