儲存過程與函式

xcmercy發表於2017-12-21

儲存過程:沒有直接返回值,主要用於執行操作。

① 建立語法
CREATE [OR REPLACE] PROCEDURE procedure_name [(parameter_name [IN | OUT | IN OUT] type [, ...])]
{IS | AS}
BEGIN
	 < procedure_body >
END;
/

② is與as有什麼區別?
- 在儲存過程與函式中,is與as沒有任何區別
- 在檢視中只能用as,在遊標中只能用is

③ 建立儲存過程的一些小細節
- 無參儲存過程定義時儲存過程名後面一定不能加括號!!!報錯:Warning: Function created with compilation errors
- 無參儲存過程呼叫時可以加括號也可以不用加,可以通過PL/SQL呼叫,也可以通過execute關鍵字呼叫
- 有參儲存過程的引數型別一定不能指定精度!!!否則報錯:Warning: Procedure created with compilation errors
- 利用  表名.欄位%type   可以取到表中某個欄位的具體型別,方便給我們宣告的變數時設定它的型別 如 price page_books.price%type;
利用PL/SQL DEVELOPER工具執行儲存過程時,如果儲存過程中有輸出內容想要看到,必須先執行下面的命令
set serveroutput on;
⑤ 例:建立有參儲存過程
CREATE PROCEDURE addBook(title in varchar2,price in number,author in varchar2,pt in date)
AS
BEGIN
	insert into page_books (title,price,author,publish_date) values(title,price,author,pt);
END;
/

呼叫有參儲存過程
- 方式一
DECLARE
	title page_books.title%type := 'title18';
	price page_books.price%type := 50.55;
	author page_books.author%type := 'author18';
	pt page_books.publish_date%type := sysdate;
BEGIN
	addBook(title,price,author,pt);
END;
/
- 方式二
EXECUTE addBook('book19',100,'author19',sysdate);

例:建立無參儲存過程
CREATE PROCEDURE sayHello
IS
BEGIN
	DBMS_OUTPUT.put_line('Hello!');
END;
/

呼叫無參儲存過程

- 方式一
BEGIN
	sayHello();
END;
/
- 方式
BEGIN
	sayHello;
END;
/
- 方式三
EXECUTE sayHello;
-方式四
EXECUTE sayHello();

函式:返回一個值,主要用於計算並返回一個值。

①建立函式的小細節
- 函式必須包含一個return語句
- RETURN 子句指定要在函式返回的資料型別
- 函式定義的時候,無參函式名後面一定不能加括號!!!報錯:Warning: Function created with compilation errors
- 函式呼叫的時候無參函式方法名後面可以不用加括號,有參必須加

② 例:建立有參函式
CREATE FUNCTION mul(x in double precision,y in double precision)
RETURN double precision
IS
	result double precision;
BEGIN
	result := x*y;
	RETURN result;
END;
/
呼叫有參函式
DECLARE 
	a double precision;
BEGIN
	a:=mul(2,10);
	DBMS_OUTPUT.put_line(a);
END;
/
例:建立無參函式
CREATE FUNCTION totalBooks
RETURN number 
IS
	totalBooks number;
BEGIN
	select count(id) INTO totalBooks from page_books;
	RETURN totalBooks;
END;
 /

呼叫無參函式
DECLARE
	a number;
BEGIN
	a:=totalBooks();
	DBMS_OUTPUT.put_line(totalBooks);
END;
/

關於上述用到的page_books表的相關資訊如下圖



相關文章