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 。
分享幾個儲存過程示例
如下儲存過程包含了宣告變數、變數賦值、入參、出參、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