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
原文:https://blog.csdn.net/qiudechao1/article/details/103201987