zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Shell入门教程:命令替换 $() 和 ``
    CentOS启用sudo,禁用root远程登录
    .htaccess 基础教程(四)Apache RewriteCond 规则参数
    .htaccess 基础教程(三)RewriteCond标志符,RewriteRule适用的标志符
    .htaccess 基础教程(二)
    .htaccess 基础教程(一)
    phpMyAdmin 个性化设置,字体大小设置,去掉“以树形显示数据库”,禁用“发送错误报告”
    PHP的$_SERVER['PHP_SELF']造成的XSS漏洞攻击及其解决方案
    PHP变量作用域(花括号、global、闭包)
    获取PHP文件绝对地址$_SERVER['SCRIPT_FILENAME'] 与 __FILE__ 的区别
  • 原文地址:https://www.cnblogs.com/zhang1f/p/13535045.html
Copyright © 2011-2022 走看看