精华内容
下载资源
问答
  • goto循环存储过程

    2009-03-20 09:28:00
    use kj go   ... goto loop    end     end    begin  set @year=@year-1  set @month=12    set @day=31  if @year  return (0)  else  goto list  end  end GO

    use kj
    go

     

    CREATE procedure ccssxs
    @year int,@month int,@day int
    AS
    BEGIN 
       DECLARE @ccclss varchar(40)
       SET @ccclss=0
       declare @rcl float
       declare @rcnbf float
       declare @rcnb float
       declare @flag int
       set @flag=0
       declare @id int
       set @id=1
       declare @yearend int
       set @yearend=@year-1
     
    list:   while @month>=1
    begin

    loop:   WHILE @day>=1
       begin
         select @rcl=(SELECT sum(时产量)/1000 FROM CLSC,clcs
                      WHERE clsc.市名或集团公司=clcs.市名或集团公司 and clsc.县名或公司名称=clcs.县名或公司名称 and clsc.矿名=clcs.矿名
                       and clsc.井口号=@id and DATEPART(year,时间)=@year AND DATEPART(month,时间)=@month AND DATEPART(day,时间)=@day)
         select @rcnbf=@rcl*1000/(select 日产量计划 from clcs where 井口号=@id and DATEPART(year,CLCS.修改日期)=@year )
         select @rcnb=@rcnbf*100
     
         if @rcnb>100
        BEGIN
         SET @ccclss=convert(varchar(8),@rcl)+'/'+convert(varchar(8),@rcnb)+'/'+convert(varchar(8),@year)+'/'+convert(varchar(4),@month)+'/'+convert(varchar(4),@day)
      print @ccclss
         set @flag=1
          return(0)
          break
        END
      ELSE
        BEGIN
         SET @day=@day-1
      
         continue   --继续执行循环
        END
       end


        begin
          set @month=@month-1
          set @day=31
          if @month=0
          break   --循环结束
          else
          goto loop
         
        end
     
     
    end


       
     begin
          set @year=@year-1
          set @month=12
        
          set @day=31
          if @year<@yearend
          return (0)
          else
          goto list 

    end  


    end


    GO

    展开全文
  • Oracle:存储过程(三)GOTO语句

    千次阅读 2019-04-26 14:50:10
    原文:... 一 定义:  属于plsql控制语句,用于程序控制非条件跳至指定标签<<?... 1、简单GOTO 语句,判断数字是否为质数: DECLARE p VARCHAR2(30); n PL...

    原文:https://blog.csdn.net/IndexMan/article/details/19050419 

     

    一 定义:

      属于plsql控制语句,用于程序控制非条件跳至指定标签<<???>>。不易控制和维护,慎用!

    二 例子:

      1、简单GOTO 语句,判断数字是否为质数:

    DECLARE
      p VARCHAR2(30);
      n PLS_INTEGER := 37; -- test any integer > 2 for prime
    BEGIN
      FOR j IN 2 .. round(sqrt(n)) LOOP
        IF n MOD j = 0 THEN
          -- test for prime      
          p := ' is not a prime number'; -- not a prime number      
          GOTO print_now;
        END IF;
      END LOOP;
      p := ' is a prime number';
      <<print_now>>
      dbms_output.put_line(to_char(n) || p);
    END;
    

      2、使用null避免报错:

    DECLARE
      done BOOLEAN;
    BEGIN
      FOR i IN 1 .. 50 LOOP
        IF done THEN
          GOTO end_loop;
        END IF;
        <<end_loop>> -- not allowed unless an executable statement follows    
        NULL; -- add NULL statement to avoid error  
      END LOOP; -- raises an error without the previous NULL
    END;
    

      3、使用goto分出一个环绕块:

    DECLARE
      v_last_name VARCHAR2(25);
      v_emp_id    NUMBER(6) := 120;
    BEGIN
      <<get_name>>
      SELECT last_name
        INTO v_last_name
        FROM employees
       WHERE employee_id = v_emp_id;
      BEGIN
        dbms_output.put_line(v_last_name);
        v_emp_id := v_emp_id + 5;
        IF v_emp_id < 120 THEN
          GOTO get_name; -- branch to enclosing block    
        END IF;
      END;
    END;
    

     

     

     

     

     

     

     

                                                                                                     底线


     

     

     

    展开全文
  • 在这里说一条使用存储过程很重要的理由:存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。    Oracle 存储过程...



                在这里说一条使用存储过程很重要的理由:存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

               

                Oracle 存储过程 定义  优点  函数 区别

                http://blog.csdn.net/tianlesoftware/archive/2010/01/27/5261364.aspx

     

                Oracle 查看  存储过程 触发器 函数 等对象定义语句的方法

                http://blog.csdn.net/tianlesoftware/archive/2010/06/19/5679293.aspx

     

     

    1. 存储过程格式

    /* Formatted on 2011/1/17 13:20:44 (QP5 v5.115.810.9015) */

    CREATE OR REPLACE procedure proc_trade(

      v_tradeid in number,                        --交易id

      v_third_ip in varchar2,                     --第三方ip

      v_third_time in date ,                      --第三方完成时间

      v_thire_state in number ,                   --第三方状态

      o_result out number,                       --返回值

      o_detail out varchar2                     --详细描述

    )

    as

    -- 定义变量

      v_error varchar2(500);

    begin

        --对变量赋值

         o_result:=0;

         o_detail:='验证失败';

     

        --业务逻辑处理

        if v_tradeid >100 then

            insert into table_name(...) values(...);

            commit;

        elsif v_tradeid < 100 and v_tradeid>50 then

            insert into table_name(...) values(...);

            commit;

        else

                goto log;

        end if;

    --跳转标志符,名称自己指定

    <<log>>

            o_result:=1;

    --捕获异常

    exception

       when no_data_found

       then

          result := 2;

       when dup_val_on_index

       then

          result := 3;

       when others

       then

          result := -1;

    end proc_trade;

     

                在上面这个存储过程中使用了输入参数,并返回输出参数,这里的参数类型是我们自己指定的。 这种写法可行,但是最好使用%type 来获取参数的类型(table_name.column_name%TYPE)。 这样就不会出现参数类型的错误。

     

    如:

    CREATE OR REPLACE PROCEDURE spdispsms (

       aempid      IN       otherinfo.empid%TYPE,

       amsg        IN       otherinfo.msg%TYPE,

       abillno     IN       otherinfo.billno%TYPE,

       ainfotype   IN       otherinfo.infotype%TYPE,

       aopid       IN       otherinfo.OPERATOR%TYPE,

       ainfoid     OUT      otherinfo.infoid%TYPE,

       RESULT      OUT      INTEGER

    )

     

    2. 存储过程中的循环

                存储过程写的是业务逻辑,循环是常用的处理方法之一。

     

    2.1  for ... in ... loop 循环

    2.1.1:循环遍历游标

    示例1

    CREATE OR REPLACE PROCEDURE proc_test

    AS

       CURSOR c1

       IS

          SELECT   * FROM dat_trade;

    BEGIN

       FOR x IN c1

       LOOP

          DBMS_OUTPUT.put_line (x.id);

       END LOOP;

    END proc_test;

     

    示例2

    CREATE OR REPLACE PROCEDURE proc_test

    AS

    BEGIN

       FOR x IN (SELECT   power_id FROM sys_power)

       LOOP

          DBMS_OUTPUT.put_line (x.power_id);

       END LOOP;

    END proc_test;

     

    2.1. 2:根据数值进行循环

    示例1

    CREATE OR REPLACE PROCEDURE proc_test (v_num IN NUMBER)

    AS

    BEGIN

         for x in 1..100 loop

             dbms_output.put_line(x);

         end loop;

    END proc_test;       

     

    示例2:在过程里指定输入参数v_num. 在调用过程时指定循环次数。

    CREATE OR REPLACE PROCEDURE proc_test (v_num IN NUMBER)

    AS

    BEGIN

       FOR x IN 1 .. v_num

       LOOP

          DBMS_OUTPUT.put_line (x);

       END LOOP;

    END proc_test;       

     

     

    2.2  loop 循环

       LOOP

          DELETE FROM orders

                WHERE senddate < TO_CHAR (ADD_MONTHS (SYSDATE, -3),

                                          'yyyy-mm-dd')

                  AND ROWNUM < 1000;

     

          EXIT WHEN SQL%ROWCOUNT < 1;

          COMMIT;

       END LOOP;

     

    这里的SQL%ROWCOUNT 是隐士游标。 除了这个,还有其他几个:%found%notfound %isopen

     

    2.3  while 循环

    CREATE OR REPLACE PROCEDURE proc_test (v_num IN NUMBER)

    AS

       i   NUMBER := 1;

    BEGIN

       WHILE i < v_num

       LOOP

          BEGIN

             i := i + 1;

             DBMS_OUTPUT.put_line (i);

          END;

       END LOOP;

    END proc_test;

     

    3. 存储过程中的判断

                判断也是存储过程中最常用的方法之一。

     

    3.1  if ... elsif ... else ... 判断

    CREATE OR REPLACE PROCEDURE proc_test (v_num IN NUMBER)

    AS

    BEGIN

       IF v_num < 10

       THEN

          DBMS_OUTPUT.put_line (v_num);

       ELSIF v_num > 10 AND v_num < 50

       THEN

          DBMS_OUTPUT.put_line (v_num - 10);

       ELSE

          DBMS_OUTPUT.put_line (v_num - 50);

       END IF;

    END proc_test;

     

    3.2  case ... when ... end case 判断

    CREATE OR REPLACE PROCEDURE proc_test (v_num IN NUMBER)

    AS

    BEGIN

        case v_num

            when 1 then

                 DBMS_OUTPUT.put_line (v_num);

            when 2 then

                DBMS_OUTPUT.put_line (v_num);

            when 3 then

                DBMS_OUTPUT.put_line (v_num);

            else null;

        end case;  

    END proc_test;

     

    4. 游标

                存储过程中使用游标也是很常见的。 这里的游标分两种:

     

    4.1  Cursor型游标(不能用于参数传递)

                这种方法具体参考 2.1.1:循环遍历游标 中的示例。

     

    4.2  SYS_REFCURSOR型游标

                该游标是Oracle以预先定义的游标,可作出参数进行传递。

                注意一点:SYS_REFCURSOR只能通过OPEN方法来打开和赋值

     

    4.2.1  我们可以使用这种类似的游标来返回一个结果集:

     

    CREATE OR REPLACE procedure  proc_test(

    checknum in number,  --每次返回的数据量

    ref_cursor out sys_refcursor  --返回的结果集,游标

    )

    as

    begin

        open ref_cursor for select * from (select * from dat_trade where state=41 order by id) where rownum<checknum;

    end proc_test;

    /

     

    SYS_REFCURSOR中可使用三个状态属性:

    (1).            %NOTFOUND(未找到记录信息)

    (2).            %FOUND(找到记录信息)

    (3).            %ROWCOUNT(然后当前游标所指向的行位置)

     

    CREATE OR REPLACE PROCEDURE proc_test (

    checknum     IN     NUMBER, --每次返回的数据量

    ref_cursor      OUT sys_refcursor --返回的结果集,游标

    )

    AS

    t_tmp   table_name%ROWTYPE;

    BEGIN

       OPEN ref_cursor FOR

          SELECT   *

            FROM   (  SELECT   *

                        FROM   table_name

                       WHERE   state = 41

                    ORDER BY   id)

           WHERE   ROWNUM < checknum;

    --循环游标

       LOOP

          FETCH ref_cursor INTO   t_tmp;

          EXIT WHEN ref_cursor%NOTFOUND;

    --    DBMS_OUTPUT.put_line (t_tmp.id);

          UPDATE   table_name

             SET   state = 53

           WHERE   id = t_tmp.id;

          COMMIT;

       END LOOP;

     

       CLOSE ref_cursor;

    END proc_test;

     

    存储过程的调试

                如果使用PL/SQL Developer 或者TOAD 工具的话,调试还是很方便的。 如果是在Sqlplus里,我们可以使用:

                SQL>show errors

                来查看错误。

    展开全文
  • 今天老师又深入地带着我们理解存储过程存储过程:一次性执行成批的SQL语句 一、定义 例如:  客户——服务器 进行信息交流(数据库) 1) insert into 2) update 3) select 优点:1
     
    

    今天老师又深入地带着我们理解存储过程:

    存储过程:一次性执行成批的SQL语句

    一、定义

    例如:

         客户——服务器   进行信息交流(数据库)

    1)      insert into

    2)      update

    3)      select

    优点:1、批处理,减少客户和服务器之间的交流次数;

          2、服务器端运行,移植性好;

          3、安全要求高的行业;

          4、包含流程控制结构的SQL语句的集合

     

    二、创建存储过程

    1、基本应用

    语法格式:

       create database

       create table

     存储函数

     

     ;---每条语句的结束

     声明新的结束符(任选,避免在MySQL环境下有特殊含义)

     delimiter(分隔符)  $$

     delimiter          //

     delimiter          ;//

    create procedure(过程)  p_name(in  c_name   数据类型)

       [特征描述1、使用什么语言创建存储过程2、结果的确定性3、4、权限

    5、注释]

          

           SQL语句集合(一条,多条)

     

       例如:

          Create procedure p1() select * from t2;

          Create procedure p1()

            Begin

                流程控制结构;

    SQL语句集合;

            end //

    练习1:创建存储过程,显示“Hello,world!”;

    步骤:1、检验mysql版本

           Select version()

           Select @@VERSION

           2、存储过程是属于数据库

            Show databases;

            Create database db1;

            Use db1;

         3、声明结束符

            Delimiter  //

         4、创建存储过程

           Create procedure p1() select “hello,world!”; //

         5、调用存储过程

           Call p1()//

         6、恢复结束符

           Delimiter ;

        

     练习2:

         创建数据库db1,创建表t1(s1  int)

         Insert  数据:5

         根据以上内容创建存储过程,显示t1当中的记录信息

    2、参数的应用

       IN 输入形参参数的使用

          set  @x=3;

          select @x;

     

    调用必须有对应的实参(类型、数量)将信息带入到存储过程

     

    create procedure p10(IN  para1  int) set @x=para1;

    create procedure p10(para1 int) set @x=para1;

    call p10(18);

    select  @x;

     

    用户定义变量:声明开始set @x=3;

                  到断开连接结束

                  不能和其他用户共享

    作用域:

      存储过程的局部变量:临时结果

       作用范围:从声明位置开始,到end结束

      语法格式

    1)      分步

    declare(声明)  var_name  type;

    var_name初值是null

    set  var_name=值;

    2)      Declare var_name type default 值;

    3)      Declare v1,v2 int;

    Set v1=5,v2=8;

     

    OUT 输出形参的使用

        用一个变量(实参位置)保存存储过程中返回的结果

        create procedure p14(OUT  para1  int)

    begin

    set para1=10;

    end//

    错误的:

    call p14(x);

    select x;

    正确的:

    call p14(@x);

    select @x;

    select @y:=@x+1;

     

    例如:函数

      Function   fun1()

    {

      。。。。

      Return   32;

    }

    $name=fun1();

    $a=$name+1;

    3、嵌套

     

        Create procedure  p15()

       Begin

             Declare v1 char(10) default’ ‘outer;

               Begin

                 Declare v1 char(10) default ‘inner’;

                 Select v1;

                 End;

               Select v1;

           End//

    三、流程控制结构

      第一组:条件分支结构

         IF语句

         CASE 语句

     

     

       语法:

    IF        条件1   THEN    语句集合

    【ELSEIF   条件2   THEN    语句集合】

    【ELSE     语句集合】

    END IF;  注意有空格

      注意:

    形参中的变量如果和存储过程中的局部变量同名,会“覆盖”;

    形参变量在存储过程中无大小写的要求;

     

    练习:创建存储过程,如果参数<60分,给t1表插入数据0;否则给t1

          表插入2学分;

    create  procedure  t1_add(para1 int)

    BEGIN

       IF  para1>=60  THEN

         insert into t1 values(2);

       ELSE

         insert into t1 values(0);

       END  IF;

    END//

    CALL t1_add(70);//

    Select * from t1;//

     

    CASE

    语法

      case  变量

         when  变量取值1  then  语句集合

         when  变量取值2  then  语句集合

         Else   语句集合

      end  case;

     

     case

        when  变量与值1表达式 then  语句集合

        when  变量与值2表达式 then  语句集合

        else   语句集合

     end  case;

     

    。。。。。。

      IF  str = ‘M’ then 

    set  sex=‘男’;

      ELSEIF str=‘F’then

         set  sex=‘女’;

      ELSE

         set  sex=‘无’;

      END IF;

              。。。。。

       循环结构

          WHILE….END WHILE

          LOOP…END LOOP

          REPEAT…END REPEAT

          GOTO(不推荐使用,流程混乱,淘汰)

     

     

       create procedure p16()

       begin

         declare v int;

         set v=0;

         while v<5 do    ------------循环的入口(必须满足的条件)

           insert into t1 values(v);

           set v=v+1;    -------------循环的出口(退出循环的条件)

          end while;

    end//

    call p16();//

    select * from t1;//

    提醒:执行结束后的系统返回是针对最后一条insert语句;

     

    create  procedure p17()

    begin

       declare  v  int;                                            

       set  v=0;

       repeat

         insert  into  t1  values(v);

         set  v=v+1;  ----------出口条件

         until  v>5;    ----------入口条件

        end  repeat;

      end//                  

     

     

    Create  procedure  p18()

     begin

        declare  v  int;

        set  v=0;

         loop_label:loop

           Insert into  t1 values(v);

           set  v=v+1;

           If  v>5  then

               leave  loop_label;          

            End if;

          End loop;

      End//

    删除存储过程

        drop  procedure  名;

    四、select  …into  变量列表

        只能应用在存储过程

       Create procedure p19(out para1 char(20))

       begin

         select s1 into para1 from t1;

     End//

     Select  返回结果:表、列、行、值

    通过老师的讲解,对存储过程的定义有了更深一步的理解,也对存储过程的方法有了了解。

     

     

    展开全文
  • sql 存储过程中循环和游标用法  2012-03-03 21:345909人阅读评论(0)收藏举报 sql存储数据库scroll程序开发table 用游标,和WHILE可以遍历您的查询中的每一条记录并将要求的字段传给变量进行相应的处理 ====...
  • 储存过程

    2020-12-24 14:25:38
    创建一个存储过程 create procedure 名(参数列表) begin 方法体 end 结束 call 存储过程的名字(参数) select * from 表名 循环语句 while …end while loop …end loop repeat …end repeat goto LEAVE 语句 ...
  • 记录exit和return的用法exit用来跳出循环loopIF...return跳出存储过程loopIF V_KBP IS NULL THENreturn;END IF;end loop;跳出loop 一次循环oracle 11g已提供continue;oracle 10g及以下,使用goto来替代,例如SQL> s...
  • MySQL存储过程初探

    2018-05-23 23:23:36
    什么是存储过程 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定...简单来说,存储过程就是为以后的使用而保存的一条或多条MySQL语句的集合。 存储过程优缺点 优点: 简化复杂操作和对...
  • MySQL存储过程中的3种循环,存储过程的基本语法,ORACLE与MYSQL的存储过程/函数的使用区别,退出存储过程方法 在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环。还有一种非标准的...
  • MySQL存储过程中的3种循环

    千次阅读 2018-01-09 19:30:00
    MySQL存储过程中的3种循环,存储过程的基本语法,ORACLE与MYSQL的存储过程/函数的使用区别,退出存储过程方法   在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环。还有一种非标准...
  • 存储过程(学习笔记)

    千次阅读 2014-04-09 17:38:41
    一、 存储过程的概念 存储过程的概念 存储过程的概念 存储过程的概念 存储过程的概念 存储过程的概念 存储过程的概念 存储过程的概念
  • Oracle中GOTO用法

    千次阅读 2013-12-03 14:37:31
    Oracle中没有continue关键字,在loop中可以用goto语句实现同样的效果。 create or replace procedure dd is i pls_integer; begin i := 0; loop &lt;&lt;top&gt;&gt; i := i + 1; ...
  • 此文转自大虾DAVE 地址...在这里说一条使用存储过程很重要的理由:存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
  • oracle存储过程----游标(cursor)的学习

    万次阅读 多人点赞 2018-08-13 15:43:10
    oracle存储过程—-存储过程游标(cursor)、遍历的使用方法   今天又学了一个新的概念Cursor ,即游标。   接上一篇,oracle存储过程—-存储过程执行简单的增删改查sql ,上一篇中,写到存储过程的查询sql ,...
  • 封装游标存储过程(Pr_execsql2)使用脚本自己可以执行自己的特性,封装游标操作存储过程如下:CREATE PROCEDURE Pr_ExecSQL2@Asqlstring VARCHAR(8000) --输入的SQL语句ASEXEC ('--启动事务BEGIN TRANDECLARE @ASql ...
  • 本文并不适合于对数据库存储过程一点都不了解的人学习,主要面对从其他数据库(Oracle, SQL Server)迁移过来,或者熟悉MySQL语法,只是第一次开始编写存储过程的朋友.MySQL的存错过程就是一个符合代码块,存在于...
  • 存储过程案例

    千次阅读 2010-12-12 21:47:00
    ---存储过程基本语法结构Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常。Oracle存储过程可以有无参数存储过程和带参数存储过程一、无参程序过程语法1 create or replace procedure NoParPro2 as...
  • 1、SqlServer存储过程的事务处理 方法一: --测试的表 create table tb( id int not null constraint PK_sys_zj_fielddict primary key ,aa int) --事务处理 ...
  • 本文简单记录下oracle数据库中,如何用plsql编程、以及存储过程的创建和使用。 相关的概念我就不列举了,大家不清楚的可以自行搜索,本篇主要列举实际的sql语法。 那plsql编程,大家可以使用windows的命令行,也...
  • 存储过程 跳出

    2019-09-28 15:39:46
    https://www.cnblogs.com/yw0219/p/5939558.html 记录exit和return的用法exit用来跳出循环loopIF V_KBP IS NULL THEN EXIT; END IF;end loop;return跳出存储过程loopIF V_KBP IS NULL THEN return;...
  • 目录 介绍 sp_executesql与EXECUTE命令 例1.0 例1.1 存储过程中的动态SQL ...在动态SQL中使用Like操作符,IN操作符和Order By ...例3.0 - 使用LIKE操作符 ...例3.1 - 使用IN操作符 ...在存储过程中的动态SQL是单个...
  • Oracle的存储过程,是我们使用数据库应用开发的重要工具手段。在存储过程中,我们大部分应用场景都是使用DML语句进行数据增删改操作。本篇中,我们一起探讨一下数据定义语句DDL在存储过程使用的细节和要点。   ...
  • mysql存储过程 游标 循环使用介绍

    千次阅读 2013-11-13 18:52:56
    Mysql的存储过程是从版本5才开始支持的,所以目前一般使用的都可以用到存储过程。今天分享下自己对于Mysql存储过程的认识与了解。 一些简单的调用以及语法规则这里就不在赘述,网上有许多例子。这里主要说说大家...
  • 数据库存储过程详解

    万次阅读 2017-08-23 22:46:55
    存储过程只在创造时进行编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程执行速度更快。  存储过程用于处理复杂的操作时,程序的可读性更强、网络的负担更小。  使用存储过程封装事务性能更佳。  ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 46,389
精华内容 18,555
关键字:

存储过程goto用法