1、建立乙個儲存過程
create [or replace] procedure pro_name [(parameter1 [,parameter2])] is|as
begin
plsql_sentences; --pl/sql語句,儲存過程功能實現的主體
[exception]
[dowith_sentences;] --異常處理語句,也是pl/sql語句,是個可選項
end [pro_name]
/
呼叫:
execute pro_name(也可以簡寫為exec)
1.1、in模式引數:
這是一種輸入型別的引數,引數值由呼叫方傳入,並且只能被儲存過程讀取(最常用)
create or replace procedure deldept(num_deptno in number,dname in varchar2,loc in varchar2) is
begin
insert into dept d values(num_deptno,dname,loc);
commit;
end deldept;
/
呼叫:
execute deldept(10,'產品部','上海'); ----此呼叫方式是按位置傳遞:必須按照儲存過程定義引數的順序
或
execute deldept(num_deptno=>11,dname=>'it部門',loc=>'北京'); ----此呼叫方式是指定名稱傳遞:即引數名在左邊,中間是賦值符號"=>",右側是引數值
在呼叫時也可以使用兩種方式進行混合
1.2、out模式引數:
這是一種輸出型別的引數,表示這個引數在儲存過程中已經被賦值,並且這個引數值可以傳遞到當前儲存過程以外的環境中
create or replace procedure seldept(
num_deptno in number,
var_dname out varchar2,
var_loc out varchar2
) is
begin
select d.dname,d.loc into var_dname,var_loc from dept d where d.deptno = num_deptno;
exception
when no_data_found then
dbms_output.put_line('該部門編號不存在');
end seldept;
/
呼叫:
variable var_dname varchar2(50);
variable var_loc varchar2(50);
execute seldept(50,:var_dname,:var_loc);
print var_dname var_loc;
用execute命令執行out模式的儲存過程需要使用variable關鍵字宣告兩個變數,用以儲存out引數的返回值
或
set serverout on
declare
var_dname dept.dname%type;
var_loc dept.loc%type;
begin
seldept(50,var_dname,var_loc);
dbms_output.put_line(var_dname || '位於' || var_loc);
end;
/
這裡是將宣告的兩個變數傳入到儲存過程中,當儲存過程執行時,其中的out引數會被賦值,當儲存過程執行完畢,out引數的值會在呼叫處返回,這樣定義的兩個變數就可以得到out引數被賦予的值,最後這兩個值就可以在儲存過程以外任意使用了
注意:如果在儲存過程中宣告了out模式的引數,則在執行儲存過程時,必須為out引數提供變數,以便接受out引數的返回值,否則,程式執行後將出現錯誤
1.3、in out 模式引數:
在呼叫儲存過程時,可以從外界向該型別的引數傳入值,在執行完儲存過程後,可以將該值返回給外界
create or replace procedure prosquare(num in out number,flag in boolean) is
i int := 2;
begin
if flag then
num := power(num,i);
else
num := sqrt(num);
end if;
end;
/
呼叫
declare
var_number number;
var_temp number;
boo_flag boolean;
begin
var_temp := 3;
var_number := var_temp;
boo_flag := false;
prosquare(var_number,boo_flag);
if boo_flag then
dbms_output.put_line(var_temp || '的平方是:' || var_number);
else
dbms_output.put_line(var_temp || '的平方根是:' || var_number);
end if;
end;
/
1.4、in引數的預設值
oracle支援在申明in引數的同時給其初始化預設值,這樣在呼叫儲存過程時,即使沒有向in引數傳入值,儲存過程也可以使用預設值進行操作。
create or replace procedure insertdept(
num_deptno in number,
var_dname in varchar2 default '綜合部',
var_loc in varchar2 default '天津') is
begin
insert into dept values(num_deptno,var_dname,var_loc);
commit;
end;
/
呼叫
execute insertdept(num_deptno=>30);--最好使用「指定名稱傳遞
」方式傳值
或
execute insertdept(30);
總結:儲存過程是一種命名的pl/sql程式塊,它即可以沒有引數,也可以有若干個輸入、輸出引數,甚至可以有多個即作輸入又作輸出的引數,但它通常沒有返回值。儲存過程被儲存在資料庫中,它不可以被sql語句直接執行或呼叫,只能通過execute命令執行或在pl/sql程式塊內部被呼叫。由於儲存過程時已經編譯好的**,所以其被呼叫或引用時,執行效率非常高。
Oracle 中儲存過程的建立
在oracle 中用到的視覺化的開發工具是pl sql 其儲存過程也和在sql中的無二。今天也算是複習一下舊知識。是什麼?是乙個 集 也可以理解成是乙個程式塊。它在資料庫中來實現功能。為什麼用?1快 因為資料庫接收到從程式中傳過來的 語句,資料庫還要進行編譯成自己認識的語言 即程式每執行一次就編譯一...
mysql中儲存過程
delimiter,簡單解釋下這個命令的用途,在mysql中每行命令都是用 結尾,回車後自動執行,在儲存過程中 往往不代表指令結束,馬上執行,而delimiter原本就是 的意思,因此用這個命令轉換一下 為 這樣只有收到 才認為指令結束可以執行 檢視myql中已經存在的儲存過程 show proce...
mysql中儲存過程
儲存過程,其本質還是函式 但其規定 不能有返回值 說明 1,in 用於設定該變數是用來 接收實參資料 的,即 傳入 預設不寫,就是in 2,out 用於設定該變數是用來 儲存儲存過程中的資料 的,即 傳出 即函式中必須對它賦值 3,inout 是in和out的結合,具有雙向作用 4,對於,out和i...