1. 程式人生 > >儲存過程基本語法

儲存過程基本語法

儲存過程

    儲存過程(Stored Procedure)是在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。

    1  CREATE OR REPLACE PROCEDURE 儲存過程名

   IS

   BEGIN

  4  NULL;

   END;

行1:

  CREATE OR REPLACE PROCEDURE 是一個SQL語句通知Oracle資料庫去建立一個叫做skeleton儲存過程, 如果存在就覆蓋它;

行2:

  IS關鍵詞表明後面將跟隨一個PL/SQL體。

行3:

  BEGIN關鍵詞表明PL/SQL體的開始。

行4:

  NULL PL/SQL語句表明什麼事都不做,這句不能刪去,因為PL/SQL體中至少需要有一句;

行5:

  END關鍵詞表明PL/SQL體的結束

儲存過程建立語法:

儲存過程
語法:
create [or replace] procedure pro_name[(par list)]
as|is
    宣告儲存過程的變數;
begin
    儲存過程執行語句;
end [pro_name];

注意事項:

1, 儲存過程引數不帶取值範圍,in表示傳入,out表示輸出

型別可以使用任意Oracle中的合法型別。

2,  變數帶取值範圍,後面接分號

3,  在判斷語句前最好先用count(*)函式判斷是否存在該條操作記錄

4,  用select 。。。into。。。給變數賦值

5,  在程式碼中拋異常用 raise+異常名

例如:為員工編號為7369員工的工資新增200

----1.不帶引數的儲存過程
create or replace procedure pro_addsal
is
begin
     update emp set sal=sal+200 where empno=7369;
     dbms_output.put_line('add ok!'); 
end pro_addsal;


---呼叫儲存過程
1.PL/SQL---如果帶有引數,無效
  call pro_addsal();
2.PL/SQL塊中呼叫
begin
   pro_addsal();
end;
3.在SQL/PLUS中呼叫
 execute pro_addsal();

----2.帶引數的儲存過程
create or replace procedure pro_addsal(myempno emp.empno%type)
is
begin
   update emp set sal=sal+300 where empno=myempno;
   dbms_output.put_line('add2 ok!');
end;
--測試
declare
   myempno emp.empno%type;
begin
   ---實際引數
   myempno := &請輸入員工編號;
   pro_addsal(myempno);
end;

----根據輸入員工編號獲得對應員工姓名
create or replace procedure pro_getName(myempno in emp.empno%type,myename out emp.ename%type)
is
begin
       select ename into myename from emp where empno=myempno;
       dbms_output.put_line('員工姓名--'|| myename);
end;

---測試
declare
   myename emp.ename%type;
begin
   pro_getName(7369,myename);
   dbms_output.put_line('姓名--' || myename);
end;

----根據輸入部門編號,顯示對應部門員工資訊
create or replace procedure pro_getEmp
is
---定義遊標
cursor mycur is select * from emp where deptno=20;
myemprow emp%rowtype;
begin
     ---開啟遊標   
     open mycur;
     loop
         ---讀取資料
         fetch mycur into myemprow;
         exit when mycur%notfound;
         dbms_output.put_line('編號--'||myemprow.empno||'姓名--'||myemprow.ename);
     end loop;   
     --關閉遊標
     close mycur;
end;

---測試
begin
    pro_getEmp();
end;

函式

語法:

create or replace function fun_name[(引數列表)] return 資料型別
is|as
本地變數宣告
begin
   執行語句;
end;
注意:
1.函式的引數只能輸入引數 in
2.函式必須有返回值

create or replace function fun_addNum(a int,b int) return int
is
  nresult int;
begin
  nresult := a + b;
  return nresult;
end fun_addNum;

---函式呼叫(1.可以通過select 語句呼叫)
select fun_addNum(1,1) from dual;
---2.在PL/SQL中呼叫
declare
   nsum int ;
begin
   nsum := fun_addNum(23,12);
   dbms_output.put_line('nsum='||nsum);
end;

程式包

語法:

程式包:包頭和包體組成
包頭:宣告部分
包體:實現部分
建立包頭語法:
create or replace package 包頭的名稱
is|as
   儲存過程和函式等物件的宣告部分
end ;
建立包體語法:
create or replace package body 包頭的名稱
is|as
   儲存過程的實現和函式的實現部分
end;

---建立包頭
create or replace package pak_xiaoyi
is
  ---定義變數(在整個包是全域性的)
  ncount int :=0;
  ---定義儲存過程
  procedure pro_add(a int,b int);
  procedure pro_setCount(mycount int);
  ---定義函式
  function fun_add(a int,b int) return int;
  function fun_add(a int,b int,c int) return int;
  function fun_getCount return int;
end;


---建立包體
create or replace package body pak_xiaoyi
is
   ---儲存過程實現      
   procedure pro_add(a int,b int)
   as
   ---定義儲存過程中區域性變數
   nsum int;
   begin
       nsum := a + b;
       dbms_output.put_line('nsum='|| nsum);      
   end pro_add;
   ---訪問ncount儲存過程
   procedure pro_setCount(mycount int)
   as
   begin
        ncount := mycount;    
   end pro_setCount;
  
   ---函式的實現
    function fun_add(a int,b int) return int
    as
    begin
       return a+b;
    end fun_add;  
    ---函式2的實現
    function fun_add(a int,b int,c int) return int
    as
    begin
      return a+b+c;
    end fun_add;
    ---訪問ncount對應函式
    function fun_getCount return int
    as     
    begin
     return ncount;
    end fun_getCount;
   
end;


---測試  
begin
   ---呼叫包中儲存過程(包.儲存過程名稱)
  pak_xiaoyi.pro_add(12,23);
end;

declare
   nsum int;
   ncount int := 10;
   ncount2 int;
begin
   nsum := pak_xiaoyi.fun_add(199,200,100);
   dbms_output.put_line(nsum);
   pak_xiaoyi.pro_setCount(ncount);
   ncount2 := pak_xiaoyi.fun_getCount;
   dbms_output.put_line(ncount2);
end;

自主事務

----顯示編號為7369員工的工資
create or replace procedure pro_sub
is
 mysal emp.sal%type;
 ----子程式中事務自我獨立
 PRAGMA AUTONOMOUS_TRANSACTION;
begin
    select sal into mysal from emp where empno=7369;
    dbms_output.put_line('子儲存過程:' || mysal);
    ---事務回滾
    rollback; ---如果沒有采用自主事務機制,子儲存過程的事務會影響父程式中的事務
end pro_sub;

---父儲存過程
create or replace procedure pro_parent
is
  mysal emp.sal%type;     
begin
   select sal into mysal from emp where empno=7369;
   dbms_output.put_line('修改之前:'|| mysal);
   update emp set sal=8888 where empno=7369;
   ---呼叫子儲存過程
   pro_sub();
   select sal into mysal from emp where empno=7369;
   dbms_output.put_line('修改之後:'|| mysal);
end pro_parent;


---測試
begin
   pro_parent();
end;

oracle儲存過程語法

1 、判斷語句: 

if 比較式 then begin end; end if; 

create or replace procedure test(x in number) is 

begin 

        if x >0 then 

         begin 

        x := 0 - x; 

        end; 

    end if; 

    if x = 0 then 

       begin 

        x: = 1; 

    end; 

    end if; 

end test; 

2 、For 迴圈 

For ... in ... LOOP 

-- 執行語句 

end LOOP; 

(1) 迴圈遍歷遊標 

create or replace procedure test() as 

Cursor cursor is select name from student; name varchar(20); 

begin 

for name in cursor LOOP 

begin 

 dbms_output.putline(name);  

end; 

end LOOP; 

end test; 

(2) 迴圈遍歷陣列 

 create or replace procedure test(varArray in myPackage.TestArray) as 

--( 輸入引數varArray 是自定義的陣列型別,定義方式見標題6) 

i number; 

begin 

i := 1;  -- 儲存過程陣列是起始位置是從開始的,與java C++ 等語言不同。因為在Oracle 中本是沒有陣列的概念的,陣列其實就是一張 

-- (Table), 每個陣列元素就是表中的一個記錄,所以遍歷陣列時就相當於從表中的第一條記錄開始遍歷 

for i in 1..varArray.count LOOP      

dbms_output.putline('The No.'|| i || 'record in varArray is:'||varArray(i));    

 end LOOP; 

end test; 

3 、While 迴圈 

while 條件語句 LOOP 

begin 

end; 

end LOOP; 

E.g 

create or replace procedure test(i in number) as 

begin 

while i < 10 LOOP 

begin     

 i:= i + 1; 

end; 

end LOOP; 

 end test; 

4 、陣列 

首先明確一個概念:Oracle 中本是沒有陣列的概念的,陣列其實就是一張表(Table), 每個陣列元素就是表中的一個記錄。 

使用陣列時,使用者可以使用Oracle 已經定義好的陣列型別,或可根據自己的需要定義陣列型別。 

(1) 使用Oracle 自帶的陣列型別 

x array; -- 使用時需要需要進行初始化 

e.g: 

create or replace procedure test(y out array) is 

 x array;   

 begin 

x := new array(); 

y := x; 

end test; 

(2) 自定義的陣列型別 ( 自定義資料型別時,建議通過建立Package 的方式實現,以便於管理

create or replace package myPackage is 

   Public type declarations   type info is record(     name varchar(20),     y number); 

  type TestArray is table of info index by binary_integer;   

-- 此處聲明瞭一個TestArray 的型別資料,其實其為一張儲存Info 資料型別的Table 而已,及TestArray 就是一張表,有兩個欄位,一個是name ,一個是。需要注意的是此處使用了Index by binary_integer 編制該Table 的索引項,也可以不寫,直接寫成:type TestArray is 

table of info ,如果不寫的話使用陣列時就需要進行初始化:varArray myPackage.TestArray; varArray := new myPackage.TestArray(); 

end TestArray; 

5. 遊標的使用 Oracle Cursor 是非常有用的,用於遍歷臨時表中的查詢結果。其相關方法和屬性也很多,現僅就常用的用法做一二介紹: 

(1)Cursor 型遊標不能用於引數傳遞) 

create or replace procedure test() is   

cusor_1 Cursor is select std_name from student where  ...;  --Cursor 的使用方式1   cursor_2 Cursor; 

begin 

select class_name into cursor_2 from class where ...;  --Cursor 的使用方式

可使用For x in cursor LOOP .... end LOOP; 來實現對Cursor 的遍歷 

end test; 

(2)SYS_REFCURSOR 型遊標,該遊標是Oracle 以預先定義的遊標,可作出引數進行傳遞 

create or replace procedure test(rsCursor out SYS_REFCURSOR) is 

cursor SYS_REFCURSOR; 

name varhcar(20); 

begin 

OPEN cursor FOR select name from student where ... --SYS_REFCURSOR 只能通過OPEN 方法來開啟和賦值 

LOOP 

 fetch cursor into name   --SYS_REFCURSOR 只能通過fetch into 來開啟和遍歷 exit when cursor%NOTFOUND;              --SYS_REFCURSOR 中可使用三個狀態屬性:                                         ---%NOTFOUND( 未找到記錄資訊) %FOUND( 找到記錄資訊)                                         ---%ROWCOUNT( 然後當前遊標所指向的行位置

 dbms_output.putline(name); 

end LOOP; 

rsCursor := cursor; 

end test; 

例項

下面寫一個簡單的例子來對以上所說的儲存過程的用法做一個應用: 

現假設存在兩張表,一張是學生成績表(studnet) ,欄位為:stdId,math,article,language,music,sport,total,average,step               

一張是學生課外成績表(out_school), 欄位為:stdId,parctice,comment 

通過儲存過程自動計算出每位學生的總成績和平均成績,同時,如果學生在課外課程中獲得的評價為,就在總成績上加20 分。 

create or replace procedure autocomputer(step in number) is 

rsCursor SYS_REFCURSOR; 

commentArray myPackage.myArray; 

math number; 

article number; 

language number; 

music number; 

sport number; 

total number; 

average number; 

stdId varchar(30); 

record myPackage.stdInfo; 

i number; 

begin 

i := 1; 

get_comment(commentArray); -- 呼叫名為get_comment() 的儲存過程獲取學生課外評分資訊 

OPEN rsCursor for select stdId,math,article,language,music,sport from student t where t.step = step; 

LOOP 

fetch rsCursor into stdId,math,article,language,music,sport; exit when rsCursor%NOTFOUND; 

total := math + article + language + music + sport; 

for i in 1..commentArray.count LOOP  

 record := commentArray(i);     

if stdId = record.stdId then   

 begin      

 if record.comment = 'A' then      

  begin          

 total := total + 20;    

   go to next; -- 使用go to 跳出for 迴圈

  end;     

end if;   

end;   

end if; 

end LOOP; 

<<continue>>  average := total / 5; 

 update student t set t.total=total and t.average = average where t.stdId = stdId; 

end LOOP; 

end; 

end autocomputer; 

-- 取得學生評論資訊的儲存過程 

create or replace procedure get_comment(commentArray out myPackage.myArray) is 

rs SYS_REFCURSOR ; 

record myPackage.stdInfo; 

stdId varchar(30); 

comment varchar(1); 

i number; 

begin 

open rs for select stdId,comment from out_school 

i := 1; 

LOOP 

 fetch rs into stdId,comment; exit when rs%NOTFOUND; 

record.stdId := stdId; 

 record.comment := comment; 

recommentArray(i) := record; 

i:=i + 1; 

end LOOP; 

end get_comment; 

-- 定義陣列型別myArray 

create or replace package myPackage is begin 

type stdInfo is record(stdId varchar(30),comment varchar(1)); 

type myArray is table of stdInfo index by binary_integer; 

end myPackage;

相關推薦

Oracle儲存過程基本語法(一)

概念:儲存過程 儲存過程(Stored Procedure)是在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。 在大型資料庫系統中,儲存

SQLSERVER儲存過程基本語法(二)

三、迴圈 --while迴圈計算1到100的和 declare @a int declare @sum int set @a=1 set @sum=0 while @a<=100 begin set @sum+=@a set @

sql server 儲存過程基本語法(轉)

1 一、定義變數 2 --簡單賦值 3 declare @a int 4 set @a=5 5 print @a 6 7 --使用select語句賦值 8 declare @user1 nvarchar(50) 9 select @user1='張三'

Mysql 儲存過程基本語法

delimiter //一般情況下MYSQL以;結尾表示確認輸入並執行語句,但在儲存過程中;不是表示結束,因此可以用該命令將;號改為//表示確認輸入並執行。 一.建立儲存過程 1.基本語法: create procedure sp_name() begin ......... end 2

oracle儲存過程基本語法(轉載)

oracle 儲存過程的基本語法 1.基本結構 CREATE OR REPLACE PROCEDURE 儲存過程名字 (     引數1 IN NUMBER,     引數2 IN NUMBER ) IS 變數1 INTEGER :=0; 變數2 DATE; BEGIN END 儲存過程名字2.SELE

儲存過程基本語法

儲存過程     儲存過程(Stored Procedure)是在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。     1  CREATE OR REPLACE 

SQLSERVER儲存過程基本語法(中)

五、遊標 declare @ID int declare @Oid int declare @Login varchar ( 50) --定義一個遊標 declare user_cur cursor for select ID, Oid,[Login] from ST_Us

Oracle儲存過程基本語法

儲存過程   1  CREATE OR REPLACE PROCEDURE 儲存過程名   2  IS   3  BEGIN   4  NULL;   5  END; 行1:   CREATE OR REPLACE PROCEDURE 是一個SQL語句通知

Oracle儲存過程基本語法介紹

create or replace procedure autocomputer(step in number) is rsCursor SYS_REFCURSOR; commentArray myPackage.myArray; math number; article number; lang

ORACLE儲存過程----基本語法

for example: create or replace procedure sp_login_error_count(user_name_var varchar2) IS--建立名為sp_login_error_count的儲存過程,並定義傳參--informix的語法(drop procedure

SQLSERVER存儲過程基本語法

declare nio 查詢 val div 數據集 state func eal 一、定義變量 --簡單賦值 declare @a int set @a=5 print @a --使用select語句賦值 declare @user1 nvarchar(50)

SQLSERVER2008 存儲過程基本語法

.cn rom itl fun sel 自增 eal 遊標 day SQLSERVER2008 存儲過程基本語法 來源:https://www.cnblogs.com/tlduck/p/5462399.html 一、定義變量--簡單賦值declare @a intset

sql儲存過程基礎語法

  MySQL 5.0 版本開始支援儲存過程。 儲存過程(Stored Procedure)是一種在資料庫中儲存複雜程式,以便外部程式呼叫的一種資料庫物件。 儲存過程是為了完成特定功能的SQL語句集,經編譯建立並儲存在資料庫中,使用者可通過指定儲存過程的名字並給定引數(需要時)

Oracle儲存過程基本用法

下面語法我是參照PLSQL Developer總結出來的語法,對於SQLserver或MySQL可能存在差異: 1、Oracle儲存過程基本語法 儲存過程 create or replace package body 儲存過程名(Pkg_AJStaticReport )--通知Oracle資

ASP中呼叫儲存過程語法、寫法-sql server資料庫,return,output

ASP與儲存過程(Stored Procedures)的文章不少,但是我懷疑作者們是否真正實踐過。我在初學時查閱過大量相關資料,發現其中提供的很多方法實際操作起來並不是那麼回事。對於簡單的應用,這些資料也許是有幫助的,但僅限於此,因為它們根本就是千篇一律,互相抄襲,稍微複雜

Oracle儲存過程大冒險-2儲存過程常用語法

開發十年,就只剩下這套架構體系了! >>>   

儲存過程基本語法與事務的基本概念

事務 開始事務 Begin transaction 提交事務 Commit transaction 回滾事務 Rollback transaction

SQLSERVER儲存過程基本語法例項

SQLSERVER儲存過程的基本語法例項 SQLSERVER儲存過程的基本語法例項 一、定義變數--簡單賦值 declare @a intset @a=5 print @a --使用select語句賦值 declare @user1 nvarchar(50) select @user1='張三'prin

MySQL儲存過程中的3種迴圈,儲存過程基本語法,ORACLE與MYSQL的儲存過程/函式的使用區別,退出儲存過程方法

  學無止境 部落格園   首頁   新隨筆   聯絡   訂閱  管理 隨筆-1968  評論-103  文章-4&

Oracle儲存過程1----基本語法以及例子

儲存過程   1  CREATE OR REPLACE PROCEDURE 儲存過程名   2  IS   3  BEGIN   4  NULL;   5  END; 行1:   CREATE OR REPLACE PROCEDURE 是一個SQL語句通知