navicat 存储过程界面功能

点击运行时,会弹出窗口填入输入参数。

Navicat 运行 Oracle 存储过程示例

使用Navicat创建存储过程

在函数位置,右键新建函数,

Navicat 运行 Oracle 存储过程示例

Navicat 运行 Oracle 存储过程示例

OUT参数没有默认值,写了也没用。

Navicat 运行 Oracle 存储过程示例

软件自动生成存储过程框架,然后人去补充“声明变量”和“主体”部分,

注意存储过程名称可以用引号,也可以不用引号。

Navicat 运行 Oracle 存储过程示例

Navicat 运行存储过程

方法一:使用 Navicat 软件界面功能

Navicat 运行 Oracle 存储过程示例

方法二:在查询界面创建变量并调用存储过程

Navicat 运行 Oracle 存储过程示例

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 ;

 

示例二

表结构及数据

Navicat 运行 Oracle 存储过程示例

注意

表中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('女人');”打印语句打印出来的,

第二行是输出参数。

Navicat 运行 Oracle 存储过程示例

示例三

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

相关文章: