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 存儲過程變量聲明格式: 變量名 數據類型(長度); (數據類型一定要加長度)

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

  1.  
  2.  
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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM