1. 程式人生 > 實用技巧 >Navicat 執行 Oracle 儲存過程示例

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

原文:https://blog.csdn.net/qiudechao1/article/details/103201987