儲存過程基本語法
儲存過程(Stored Procedure)是在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。
1 CREATE OR REPLACE PROCEDURE 儲存過程名
2 IS
3 BEGIN
4 NULL;
5 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; -- 儲存過程陣列是起始位置是從1 開始的,與java 、C 、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 ,一個是y 。需要注意的是此處使用了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 的使用方式2
可使用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
通過儲存過程自動計算出每位學生的總成績和平均成績,同時,如果學生在課外課程中獲得的評價為A ,就在總成績上加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語句通知