Navicat 運行 Oracle 存儲過程示例

navicat 存儲過程界面功能

點擊運行時,會彈出窗口填入輸入參數。

使用Navicat創建存儲過程

在函數位置,右鍵新建函數,

OUT參數沒有默認值,寫了也沒用。

軟件自動生成存儲過程框架,然後人去補充“聲明變量”和“主體”部分,

注意存儲過程名稱可以用引號,也可以不用引號。

Navicat 運行存儲過程

方法一:使用 Navicat 軟件界面功能

方法二:在查詢界面創建變量並調用存儲過程

Oracle存儲過程內部定義變量:“變量名 數據類型(大小)”,舉例:temp NUMBER(12);

Oracle存儲過程外部定義變量(在查詢界面):

declare 

    變量名1  數據類型1(大小);

    變量名2  數據類型2(大小);

注意定義變量的方法和調用存儲過程的方法:

declare 
	idnum VARCHAR2(100) ; --輸入參數
	out_gender clob; --輸出參數,BLOB和CLOB都是大字段類型,BLOB按二進制來存儲的,CLOB直接存儲文字
BEGIN
	DBMS_OUTPUT.ENABLE(buffer_size => null) ; --設置緩存大小不受限制
	idnum := '1'; --賦值
	
	--調用存儲過程,TEST_SELECT3 爲存儲過程的名字
	TEST_SELECT3(idnum,out_gender); 
	dbms_output.put_line(out_gender); --輸出結果
end;

分享:CLOB與BLOB的區別及用途:https://blog.csdn.net/qq_36544760/article/details/82665199

錯誤

[Err] ORA-20000: ORU-10027: buffer overflow, limit of 20000 bytes
緩存溢出。 使用dbms_output.put_line(變量)時報出的錯誤,從上面也可以知道dbms_output.put_line默認的緩存大小20000bytes 。
解決方法:在調用Oracle輸出語句之前,先調用 DBMS_OUTPUT.ENABLE(buffer_size => null),表示輸出buffer不受限制。
 

分享幾個存儲過程示例

如下存儲過程包含了聲明變量、變量賦值、入參、出參、CASE WHEN語句、遊標等基礎用法。

示例一

注意 Oracle 中,in out 要分開寫

Oracle 存儲過程變量聲明格式: 變量名 數據類型(長度); (數據類型一定要加長度)

賦值語句格式:變量 := 值,將值賦值給變量。

CREATE OR REPLACE 
PROCEDURE TEST_EXCHANGE(a in out  int,b in out  int)
as
	temp NUMBER(12);
begin
	temp := a;
	a := b;
	b := temp;
end ;

示例二

表結構及數據

注意

表中SNO是NUMBER數據類型,但是存儲過程傳參是VARCHAR2,依然可以進行比較運算;

DEFAULT設置默認值;

rowData TEST_STUDENT%rowtype; 將表TEST_STUDENT一行數據的格式定義變量;

select * into 變量,是把查詢出來的值賦值給變量,

注意case when 寫法。

CREATE OR REPLACE 
PROCEDURE "TEST_CASE" (idnum IN VARCHAR2 DEFAULT '1', gender OUT VARCHAR2)
AS
	rowData TEST_STUDENT%rowtype;
BEGIN
	select * into rowData from TEST_STUDENT where SNO=idnum;
	case rowData.GENDER
	when 1 then
		dbms_output.put_line('女人');
		gender :='女人';
	when 2 then
		dbms_output.put_line('男人');
		gender :='男人';
	else
		dbms_output.put_line('人妖');
		gender :='人妖';
	end case;
END;

輸出結果展示:

第一行 是 “dbms_output.put_line('女人');”打印語句打印出來的,

第二行是輸出參數。

示例三

CREATE OR REPLACE 
PROCEDURE TEST_SELECT(
	IN_SNO in NUMBER,
	OUT_SNAME out varchar2,
	OUT_SAGE out NUMBER
) AS
BEGIN
	SELECT SNAME,SAGE
	into  OUT_SNAME,OUT_SAGE
	FROM TEST_STUDENT WHERE SNO = IN_SNO;
END;

示例四

CREATE OR REPLACE 
PROCEDURE TEST_SELECT4(DEPTID in NUMBER)
AS
--遊標的定義
	Cursor test_cursor is 
		select department_id, job_id, name, hire_date 
		from  TEST_EMPLOYEES  where  department_id = DEPTID;
BEGIN
	for rowData in test_cursor 
	loop
		exit when test_cursor%notfound;
		dbms_output.put_line('數據是:'||rowData.job_id);
	end loop;
END;

示例五

CREATE OR REPLACE 
PROCEDURE TEST_UPDATE 
AS
	v_rows NUMBER;
BEGIN
--更新數據
	UPDATE TEST_EMPLOYEES SET SALARY = 30000
	WHERE department_id = 1 AND job_id = 'AD_VP';
--獲取默認遊標的屬性值
	v_rows := SQL%ROWCOUNT;
	DBMS_OUTPUT.PUT_LINE('更新了'||v_rows||'個僱員的工資');

--回退更新,以便使數據庫的數據保持原樣,如果要提交用commit;
	rollback;
END;

 

附Java調用Oracle存儲過程返回結果集---從建表、存儲過程到調用的詳細過程:

https://blog.csdn.net/qiudechao1/article/details/98876509

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章