zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    UOJ #455 [UER #8]雪灾与外卖 (贪心、模拟费用流)
    Codeforces 482E ELCA (LCT)
    Codeforces 798D Mike and distribution (构造)
    AtCoder AGC017C Snuke and Spells
    HDU 6089 Rikka with Terrorist (线段树)
    HDU 6136 Death Podracing (堆)
    AtCoder AGC032D Rotation Sort (DP)
    jenkins+python+kubectl实现批量更新k8s镜像
    Linux 下载最新kubectl版本的命令:
    jenkins X 和k8s CI/CD
  • 原文地址:https://www.cnblogs.com/yx007/p/7340221.html
Copyright © 2011-2022 走看看