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