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;
  • 相关阅读:
    第一次冲刺6
    人机交互课下作业
    第一次冲刺5
    第一次冲刺4
    第一次冲刺3
    第一次冲刺2
    第一次冲刺
    典型用户分析
    掌握 需求过程阅读笔记02
    掌握 需求过程阅读笔记01
  • 原文地址:https://www.cnblogs.com/yx007/p/7340221.html
Copyright © 2011-2022 走看看