zoukankan      html  css  js  c++  java
  • Oracle存储过程

    Oracle存储过程语法

     

     

     

    创建基本的存储过程

     

    1 CREATE OR REPLACE PROCEDURE MyProName IS
    2 BEGIN
    3   NULL;
    4 END;

     

    行1:CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;

     

    行2:IS关键词表明后面将跟随一个PL/SQL体。

     

    行3:BEGIN关键词表明PL/SQL体的开始。

     

    行4:NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;

     

    行5:END关键词表明PL/SQL体的结束

     

     

    创建带参数存储过程

     

    现在想给存储过程加上参数,定义变量怎么处理呢?如下

     

    复制代码
    1 CREATE OR REPLACE PROCEDURE MyPro(param1 in varchar2,param2 out varchar2) as
    2   v_cnt      number; --定义变量1
    3   tablename1 varchar2(80); --定义变量2
    4   sqlTxt     varchar2(2000); --定义变量2
    5 BEGIN
    6   --处理逻辑
    7   NULL;
    8 END;
    复制代码

     

     (1)存储过程参数不带取值范围,in表示传入,out表示输出;类型可以使用任意Oracle中的合法类型。

     

     (2) 变量带取值范围,后面接分号

     

     

    创建带事务的存储过程

     

    复制代码
    CREATE OR REPLACE PROCEDURE MyPro(param1 in varchar2,param2 out varchar2) as
      v_cnt      number; --定义变量1
      tablename1 varchar2(80); --定义变量2
      sqlTxt     varchar2(2000); --定义变量2
    BEGIN
      --处理逻辑
      NULL;
       commit;--提交事务
    Exception
      When others then
       Dbms_output.Put_line(sqlerrm);--打印输出错误
       Rollback;--回滚事务
    END;
    复制代码

     

     提交事务,存在异常则回滚事务;

     

     

    使用游标

     

    游标遍历

     

    复制代码
    CREATE OR REPLACE PROCEDURE MyPro(param1 in varchar2, param2 out varchar2) as
    
      v_cnt      number; --定义变量1
      tablename1 varchar2(80); --定义变量2
      sqlTxt     varchar2(2000); --定义变量2
    BEGIN
      --定义游标
      cursor c_tab_temp1 is
        select t.modelnumber, t.tablename from d_modelmap t;
      c_bom_row1 c_tab_temp1%rowtype;
      --处理逻辑
      --循环游标
      for c_bom_row1 in c_tab_temp1 loop
        tablename1 := c_bom_row1.tablename;  --取游标中的值
        
       
      END LOOP;
      commit; --提交事务
    Exception
      When others then
        Dbms_output.Put_line(sqlerrm); --打印输出错误
        Rollback; --回滚事务
    END;
    复制代码

     

    返回游标

     

    复制代码
    create or replace procedure test(
    res out varchar2,
    p_cur out sys_refcursor)   as
    Begin
    open p_cur for
         select * from tableName
    res:='';
    end;
    复制代码

     

     

    其他使用技巧

    分支条件判断

     

    复制代码
    --分支判断
        if tablename1 <> '' then
          --处理逻辑
          null;
        else
          --处理逻辑
          null;
        end if;
    复制代码

    动态sql

     

    复制代码
     --拼接动态sql
        sqltxt := 'update ' || tablename1 || '  t
                 set t.partid=(select t3.f_id from i_partlist t3 where t3.part_no=t.part_no
                 and nvl(t3.part_techstate,'' '')=nvl(t.part_techstate,'' ''))
                 where not  exists(select t2.f_id from i_Partlist t2 where t2.f_id=t.partid)';
        --执行动态sql
        execute immediate sqlTxt;
    复制代码

    给变量赋值

     

    (1)用select XX into xx给变量赋值

     

     select count(1)  into v_count  from A t where t.A='aaa';

     

    (2)直接赋值

     

    V_TEST := 123;

    while 循环

     

      WHILE V_TEST=1 LOOP
      BEGIN
     XXXX
      END;
      END LOOP;

    判断是否存在

     

    在判断语句前最好先用count(*)函数判断是否存在该条操作记录

     

    复制代码
      --判断是否存在,v_count是定义的数值变量
        select count(1)
          into v_count
          from A t
         where t.A='aaa';
        if v_count = 0 then
          
        else
        
        end if;
    复制代码

  • 相关阅读:
    jdbc preparedstatement 调用存储过程的问题
    httpclient 优化
    httpclient 4种关闭连接
    Cloudstack介绍(一)
    Docker registry私有仓库(七)
    Docker生产实践(六)
    python装饰器
    Docker镜像构建(五)
    python 生成器和迭代器介绍
    Docker数据管理(四)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/7344145.html
Copyright © 2011-2022 走看看