>

Oracle存款和储蓄进度接纳技能与经验计算

- 编辑:乐百家599手机首页 -

Oracle存款和储蓄进度接纳技能与经验计算

下边包车型大巴见解是在使用游标的进程中做的日记。小编也是率先次利用,固然有哪些难堪的地点请商议指正,我们一同使劲。

几日前出于事业亟待,简单询问了下SQL Server 2005数据库创建轻巧的在仓库储存进度。大器晚成、首先表达什么创设存款和储蓄进度: CREATE PROCEDUER my_pro @inputDate varchar ,//注脚输入变量 @Result varchar output //证明输出变量 AS declare @variable1 varchar//注脚varchar变量 declare @variable2 int //证明整形变量 BEGIN IF ... END ELSE BEGIN .... END END 以上就是创制叁个简便的蕴藏进程方法。

oracle存款和储蓄进程常用手艺

  风流倜傥,定义:Sql Server的蕴藏进程是四个被取名的储存在服务器上的Transacation-Sql语句集结,是包裹重复性职业的生龙活虎种方法.

1.

二、删除存款和储蓄进度 DROP PROCEDURE my_pro

我们在开展pl/sql编制程序时打交道最多的正是积攒进度了。存款和储蓄进程的组织是十一分的简便的,我们在此除了读书存款和储蓄进度的中坚结构外,还可能会学习编写存款和储蓄进度时有关的有个别实用的学问。如:游标的拍卖,相当的拍卖,集结的拈轻怕重等等

  二,存款和储蓄进程的独特之处:

  消息 16951,级别 16,状态 1,过程 usp_proc,第 16 行
      变量 '@myref' 不能够用作参数,因为在推行该进程前,不得为 CU奥迪Q5SO本田UR-V OUTPUT 参数分配游标。

三、试行存储进程 推行未有参数的贮存进度:EXECUTE my_pro 实践有参数的仓库储存进度:EXECUTE my_pro '输入变量' 的蕴藏进度:declare @Result varchar//表明输出变量 EXECUTE my_pro '输入变量' @Result output //让该存款和储蓄进度输出值保存到@Result中 select @Result as result//查询结果重临

1.储存过程结构

   1,重复使用。存款和储蓄进度可以重复使用,进而得以减掉数据库开辟人士的工作量。

  那几个主题材料是本人在调用二个递归的、输出cursor output 的积攒进程

四、例子下边必要将查询多条记下结果,使用一条再次来到值进行重回。比方:有表Test中,在那之中有五个字段为Test01与Test02,把Test01 > 10000的笔录,让查询Test02结果举办统后生可畏,合并成一条记下来回到。则赶回结果为:WSXEDC瑞鹰FVTGB. Test01 Test02 10000 QAZ 10001 WSX 10002 EDC 10003 凯雷德FV 10004 TGB 那么,使用存款和储蓄进程,使用存款和储蓄进程中的游标,能够实行for循环来展开多条记下的集结。将得以消除那一个主题材料。具体存款和储蓄进度如下: DROP PORCEDURE my_Cursor //习贯性,创造早先,先看看该存款和储蓄进程是不是留存 CREATE PROCEDURE my_Cursor @id int ,//表明输入变量@Result varchar output //声明输出变量,注意必供给有output关键字,不然默感到输入变量 AS Declare city_cursor cursor for –阐明游标变量 Select [Test01] from Test where Test01 > @id –此中@id为输入变量 Set @Result = ‘' –设置变量@Result值 Declare @Field int–申明不经常存放查询到的Test01的变量 Open city_cursor–张开游标 Fetch next from city_cursor into @Field–将实际Test01赋给变量,实行循环 While–循环起来 BEGIN If @Result = ‘' BEGIN Select @Result = Test02 from Test where Test01 = @Field END ELSE BEGIN Select @Result = @Result ‘,' Test02 from Test where Test01 = @Field END Fetch next from city_cursor into @Field –循环下多少个Test01 END Close city_cursor–关闭游标 Deallocate city_cursor –释放游标援用 GO 以下是实行 Declare @Result varchar EXECUTE my_pro 10000 ,@Result output –output关键字一定得写,倘使是五个输入参数,则运用“,”号来差距 Select @Result as result –查询结果

1.1 第一个存款和储蓄进度

   2,提升品质。存款和储蓄进程在成立的时候就进展了编写翻译,今后应用的时候不要再另行编写翻译。日常的SQL语句每履行贰次就需求编写翻译二回,所以选取存款和储蓄过程提升了频率。

create proc usp_proc(
@level int
@myref cursor varying output
)
as
begin
    if @level=3
        begin
             set @myref=cursor local static for
            select * from table
            open @myref
        end
     if @level<3
        begin
        declare @cur cursor
        exec usp_proc 2 @cur output --递归
        --
        --对输出游标@cur做一些操作
        --
        --使用完游标
        close @cur  --关闭游标
        deallocate @cur --删除游标
        end
end            

create or replace procedure proc1(  

     3,减弱互连网流量。存款和储蓄进度坐落于服务器上,调用的时候只需求传递存款和储蓄进度的称呼以至参数就足以了,因而下落了网络传输的数据量。

假定未有对出口的游标做close、deallocate管理就能够现身上边错误。

 p_para1 varchar2,  

   4,安全性。参数化的仓库储存进程能够幸免SQL注入式的攻击,並且能够将格兰特、Deny以致Revoke权限应用于积攒进度。

2.

 p_para2 out varchar2,  

  三,语法,创立存款和储蓄进程:  

  未有为@cur,分配游标

 p_para3 in out varchar2  

语法

  这几个主题素材是笔者在选用存款和储蓄进度再次来到的游标 cursor output 爆发的

)as    

CREATE PROC[ EDURE ] [ owner**. ] procedure_name [ ; number ]     [ { @parameter data_type }         [ VARYING ] [ = default ] [ OUTPUT ]     ] [ ,...n ] [ WITH     { RECOMPILE | ENCRYPTION | RECOMPILE ,* ENCRYPTION } ] [ FOR REPLICATION ] AS sql_statement [ ...n* ]

参数

owner

    具备存款和储蓄进程的客户 ID 的称谓。owner 必需是近期顾客的名号或当前客商所属的剧中人物的名号。

procedure_name

    新存款和储蓄进程的名称。进程名必须切合标记符法则,且对于数据库及其主人必需唯生龙活虎。

;*number*

    是可选的整数,用来对同名的历程分组,以便用一条 DROP PROCEDURE 语句就可以将同组的长河一齐除去。比方,名字为 orders 的应用程序使用的进度能够命名称叫 orderproc;1、orderproc;2 等。DROP PROCEDURE orderproc 语句将除了整个组。假如名称中包括定界标记符,则数字不应包蕴在标记符中,只应在 procedure_name 前后采用方便的定界符。

@parameter

    进度中的参数。在 CREATE PROCEDURE 语句中能够声美赞臣(Meadjohnson卡塔尔(قطر‎个或七个参数。顾客必需在实施进度时提供每一个所声明参数的值(除非定义了该参数的暗中同意值,只怕该值设置为等于另三个参数)。存款和储蓄进度最多能够有 2.100 个参数。

选用 @ 符号作为第二个字符来钦定参数名称。参数名称必需切合标记符的平整。每一种进度的参数仅用于该进程本人;相像的参数名称能够用在其它进程中。暗中同意情形下,参数只可以代替常量,而不可能用于替代表名、列名或任何数据库对象的称号。

data_type

    参数的数据类型。除 table 之外的别样兼具数据类型均可以充任存款和储蓄进程的参数。但是,cursor 数据类型只可以用来 OUTPUT 参数。如果内定 cursor 数据类型,则还必需钦定VA索罗德YING 和 OUTPUT 关键字。对于能够是 cursor 数据类型的出口参数,未有最大额的范围。

VARYING

    钦定作为出口参数辅助的结果集(由存款和储蓄进程动态布局,内容能够变动)。仅适用于游标参数。

default

    参数的暗中同意值。假若定义了暗中认可值,不必钦赐该参数的值就能够执行过程。暗中认可值必得是常量或 NULL。如若经过将对该参数使用 LIKE 关键字,那么暗中同意值中能够分包通配符(%、_、[] 和 [^])。

OUTPUT

    表明参数是重返参数。该选择的值能够回来给 EXEC[UTE]。使用 OUTPUT 参数可将信息重临给调用进度。Textntextimage 参数可用作 OUTPUT 参数。使用 OUTPUT 关键字的输出参数能够是游标占位符。

n

    表示最多能够钦定 2.100 个参数的占位符。

{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}

    RECOMPILE 申明 SQL Server 不会缓存该进度的安插,该进程将要运营时再度编写翻译。在动用非规范值或一时值而不愿意覆盖缓存在内部存款和储蓄器中的试行安插时,请使用 RECOMPILE 选项。

ENCRYPTION 表示 SQL Server 加密 syscomments 表中满含CREATE PROCEDURE 语句文本的条约。使用 ENCMuranoYPTION 可幸免将经过作为 SQL Server 复制的生机勃勃有的公布。

FOR REPLICATION

    钦命不能够在订阅服务器上实行为复制作而成立的蕴藏进程。.使用 FOKoleos REPLICATION 选项创制的蕴藏进程可用作存款和储蓄过程挑选,且必须要在复制进程中实行。本选项不可能和 WITH RECOMPILE 选项一齐利用。

AS

   钦命过程要实施的操作。

sql_statement

   进程中要含有的妄动数目和类型的 Transact-SQL 语句。但有一点范围。

n

   是表示此进程能够包罗多条 Transact-SQL 语句的占位符。

  四,使用方法:

  

**********************************************

注:*所包围部分出自MS的一齐丛书.

 

                           多少个实例

                        (AjaxCity表中剧情卡塔尔(قطر‎

     ID        CityName   Short

             1         苏州市     SZ  

             2     无锡市     WX

             3         常州市     CZ

1.选项表中具有内容并回到一个数据集

        CREATE PROCEDURE mysp_All
        AS
           select * from AjaxCity
        GO

实行结果

        图片 1

2.依照传入的参数实行询问并赶回一个数据集

       CREATE PROCEDURE mysp_para
            @CityName varchar(255),

            @Short    varchar(255)
       AS
         select * from AjaxCity where CityName=@CityName And Short=@Short
       GO

实行结果

        图片 2

3.分包输出参数的储存进程(重临前两条记下的ID的和卡塔尔国

CREATE PROCEDURE mysp_output
       @SUM int  output
 AS
       select @SUM=sum([ID]) from (select top 2 * from AjaxCity) as tmpTable
GO

实施结果

         图片 3

4.在蕴藏进度中选取游标

  有那般多少个表,存款和储蓄的是各超阶级市下边包车型客车市级市的新闻.如图:

   图片 4

   以往想总结出各种地级市上面包车型大巴省级市的个数,并结合贰个字符串.结果应该是"5,2,2".

 

CREATE PROCEDURE mysp_Cursor
    @Result varchar(255卡塔尔国 output//注解输出变量
AS
    declare city_cursor cursor for//注脚游标变量
    select [ID] from AjaxCity

set @Result=''
declare @Field int//注明有的时候贮存CityID的变量
open city_cursor //展开游标
fetch next from city_cursor into @Field//将实际ID赋给变量
while(@@fetch_status=0卡塔尔国//循环最先
begin
       if @Result = ''
           select @Result = convert(nvarchar(2),count(*))  from AjaxCounty where CityID=@Field
       else
           select @Result = @Result ',' convert(nvarchar(2),count(*)) from AjaxCounty where CityID=@Field
      
       fetch next from city_cursor into @Field//下一个CityID
end
close city_cursor//关闭游标
deallocate city_cursor//释放游标援用
GO

 

进行结果

       图片 5

 

    好了,关于存款和储蓄进程先写到这里.以上多少个例子基本上落成了平庸所用到的超级多效能.至于复杂的储存进度,所用到的掌握根本是SQL的语法,甚至SQL中贮存函数的使用.已不归属本文所要商讨的范围了.

  

v_name varchar2(20);  

create proc myproc(
@mycur cursor varying output
)
as
begin
set @mycur=cursor local static  for
select * from table

open @mycur --打开游标
end

--调用myproc
declare @cur cursor
exec myproc @cur output
fetch next from @cur
while @@fetch_status=0
    begin
    --使用游标
    fetch next from @cur
    end 

begin  

现身上述错的来由便是概念游标后须要展开 open @mycur

 v_name := '张三丰';  

 p_para3 := v_name;  

 dbms_output.put_line('p_para3:'||p_para3);  

end;  

下边正是叁个最简易的囤积进程。叁个囤积进度差不离分为这么多少个部分:

创建语句:create or replace procedure 存款和储蓄进度名

只要未有or replace语句,则单纯是新建一个仓库储存进程。要是系统存在该存款和储蓄进程,则会报错。Create or replace procedure 假使系统中没有此存款和储蓄进程就新建八个,假如系统中有此存款和储蓄进度则把原本删除掉,重新创建叁个仓库储存进程。

仓库储存进程名定义:富含仓库储存进程名和参数列表。参数名和参数类型。参数名不能够重新, 参数字传送递方式:IN, OUT, IN OUT

IN 代表输入参数,按值传递方式。

OUT 代表输出参数,可以看到为按援引传递形式。可以充当存款和储蓄进程的出口结果,供外界调用者使用。

IN OUT 就可以作输入参数,也可作输出参数。

参数的数据类型只须求指明类型名就可以,没有必要钦命宽度。

参数的大幅度由外界调用者决定。

进度能够有参数,也得以未有参数

变量注明块:紧跟着的as (is 卡塔尔国关键字,能够知晓为pl/sql的declare关键字,用于证明变量。

变量证明块用于注脚该存款和储蓄进度须求接收的变量,它的效率域为该存款和储蓄进程。其它这里评释的变量必得内定宽度。信守PL/SQL的变量注明标准。

进度语句块:从begin 关键字初始为经过的语句块。存储进程的现实性逻辑在这里处来促成。

那么些管理块:关键字为exception ,为拍卖语句爆发的非常。该片段为可选

结束块:由end关键字结果。

1.2 存款和储蓄进度的参数字传送递格局

仓储进程的参数字传送递有三种艺术:IN,OUT,IN OUT .

IN 按值传递,並且它不容许在蕴藏进度中被再一次赋值。借使存款和储蓄进程的参数没有一点点名存参数字传送递类型,暗中认可为IN

create or replace procedure proc1(  

 p_para1 varchar2,  

 p_para2 out varchar2,  

 p_para3 in out varchar2  

)as    

v_name varchar2(20);  

begin  

 p_para1 :='aaa';  

 p_para2 :='bbb';  

 v_name := '张三丰';  

 p_para3 := v_name;  

 dbms_output.put_line('p_para3:'||p_para3);  

 null;  

end;  

     

Warning: Procedure created with compilation errors  

 

SQL> show error;  

Errors for PROCEDURE LIFEMAN.PROC1:  

 

LINE/COL ERROR  


----------------------------------------------------------------------  

8/3      PLS-00363: expression 'P_PARA1' cannot be used as an assignment target  

8/3      PL/SQL: Statement ignored  

那一点与此外高端语言都不可同日而言。它一定于java在参数后面加上final关键字。

OUT 参数:作为出口参数,供给潜心,当二个参数被内定为OUT类型时,固然在调用存款和储蓄进程以前对该参数实行了赋值,在仓库储存进度中该参数的值仍然为null.

create or replace procedure proc1(  

 p_para1 varchar2,  

 p_para2 out varchar2,  

 p_para3 in out varchar2  

)as    

v_name varchar2(20);  

begin  

 v_name := '张三丰';  

 p_para3 := v_name;  

 dbms_output.put_line('p_para1:'||p_para1);  

 dbms_output.put_line('p_para2:'||p_para2);  

 dbms_output.put_line('p_para3:'||p_para3);  

end;  

 

SQL> var p1 varchar2(10);  

SQL> var p2 varchar2(10);  

SQL> var p3 varchar2(10);  

SQL> exec :p1 :='aaaa';  

SQL> exec :p2 :='bbbb';  

SQL> exec :p3 :='cccc';  

SQL> exec proc1(:p1,:p2,:p3);  

p_para1:aaaa  

p_para2:  

p_para3:张三丰  

SQL> exec dbms_output.put_line(:p2);  

 

 

PL/SQL procedure successfully completed  

p2  

---------  

INOUT 是真的的按援用传递参数。就能够作为传播参数也得以看成传播参数。

1.3 存款和储蓄进程参数宽度  

create or replace procedure proc1(  

 p_para1 varchar2,  

 p_para2 out varchar2,  

 p_para3 in out varchar2  

)as    

v_name varchar2(2);  

begin  

 v_name := p_para1;  

end;  

 

SQL> var p1 varchar2(10);  

SQL> var p2 varchar2(20);  

SQL> var p3 varchar2(30);  

SQL> exec :p1 :='aaaaaa';  

SQL> exec proc1(:p1,:p2,:p3);  

     

     

ORA-06502: PL/SQL: numeric or value error: character string buffer too small  

ORA-06512: at "LIFEMAN.PROC1", line 8  

ORA-06512: at line 1  

率先,大家要通晓,我们鞭不比腹在存储进程的概念中钦定期存款款和储蓄参数的小幅度,也就招致了大家力不可能支在积攒进程中决定传入变量的宽窄。这些幅度是全然由外界传入时间调节制的。

大家再来看看OUT类型的参数的上升的幅度。

create or replace procedure proc1(  

 p_para1 varchar2,  

 p_para2 out varchar2,  

 p_para3 in out varchar2  

)as    

v_name varchar2(2);  

begin  

 p_para2 :='aaaaaaaaaaaaaaaaaaaa';  

end;  

SQL> var p1 varchar2(1);  

SQL> var p2 varchar2(1);  

SQL> var p3 varchar2(1);  

SQL> exec :p2 :='a';  

SQL> exec proc1(:p1,:p2,:p3);  

在该进程中,p_para2被授予了十几个字符a.

而在外界的调用进程中,p2那一个参数仅仅被定义为varchar2(1卡塔尔(英语:State of Qatar).

而把p2作为参数调用那几个进程,却并不曾报错。并且它的真实值便是21个a

SQL> select dump(:p2) from dual;  

DUMP(:P2)  


 

Typ=1 Len=20: 97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97  

p2  

---------  

aaaaaaaaaaaaaaaaaaaa  

     

   再来看看IN OUT参数的宽窄  

create or replace procedure proc1(  

 p_para1 varchar2,  

 p_para2 out varchar2,  

 p_para3 in out varchar2  

)as    

v_name varchar2(2);  

begin  

 p_para3 :='aaaaaaaaaaaaaaaaaaaa';  

end;  

 

SQL> var p1 varchar2(1);  

SQL> var p2 varchar2(1);  

SQL> var p3 varchar2(1);  

本文由乐百家数据库发布,转载请注明来源:Oracle存款和储蓄进度接纳技能与经验计算