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

posted @   Tozhang  阅读(5837)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示