Oracle存款和储蓄进程基本语法 存款和储蓄进程 1 CREATE O福特Explorer REPLACE PROCEDURE 存款和储蓄进度名
2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OTiguan REPLACE PROCEDURE
是二个SQL语句通知Oracle数据库去创建三个叫做skeleton存款和储蓄进程,
若是存在就覆盖它; 行2: IS关键词注脚前面将跟随一个PL/SQL体。 行3:
BEGIN关键词评释PL/SQL体的最早。 行4: NULL
PL/SQL语句证明什么事都不做,这句不能够去除,因为PL/SQL体中足足必要有一句;
行5: END关键词注明PL/SQL体的收尾 存款和储蓄进度制造语法: create or replace
procedure 存款和储蓄进程名 as 变量1 体系; –vs_msg VARCHACR-V2(4000卡塔尔; 变量2
连串; 代码如下: Begin Select count(*卡塔尔(قطر‎ into 变量1 from 表A
where列名=param1; If (剖断规范卡塔尔(قطر‎ then Select 列名 into 变量2 from 表A
where列名=param1; Dbms_output。Put_line(‘打印新闻’卡塔尔(英语:State of Qatar); Elsif (判定规范)then Dbms_output。Put_line(‘打字与印刷音讯’卡塔尔国; Else Raise 格外名; End if;
Exception When others then Rollback; End; 注意事项: 1,
存款和储蓄进程参数不带取值范围,in表示传入,out表示输出
类型能够行使自便Oracle中的合法类型。 2, 变量带取值范围,前面接分号 3,
在认清语句前最佳先用count函数剖断是否留存该条操作记录 4, 用select
。。。into。。。给变量赋值 5, 在代码中抛卓殊用 raise+至极名 代码如下:
CREATE OXC90 REPLACE PROCEDURE存款和储蓄进度名 ( –定义参数 is_ym IN CHAR(6) ,
the_count OUT NUMBE福特Explorer, 卡塔尔 AS –定义变量 vs_msg VARCHA奥迪Q32(4000卡塔尔国;
–错误音讯变量 vs_ym_beg CHAKoleos(6卡塔尔(英语:State of Qatar); –早先月份 vs_ym_end CHA宝马7系(6卡塔尔;
–终止月份 vs_ym_sn_beg CHAEscort(6卡塔尔国; –同有的时候候起头月份 vs_ym_sn_end
CHA大切诺基(6卡塔尔(قطر‎; –同不经常候终止月份 –定义游标(一言以蔽之就是一个可以遍历的结果集卡塔尔CUOdysseySO讴歌RDX cur_1 IS SELECT 。。。 FROM 。。。 WHERE 。。。 GROUP BY 。。。;
BEGIN –用输入参数给变量赋初值,用到了Oralce的SUBST中华V TO_CHAR
ADD_MONTHS TO_DATE 等很常用的函数。 vs_ym_beg := SUBSTR(is_ym,1,6);
vs_ym_end := SUBSTR(is_ym,7,6); vs_ym_sn_beg :=
TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_beg,’yyyymm’), -12),’yyyymm’);
vs_ym_sn_end := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,’yyyymm’卡塔尔(英语:State of Qatar),
-12卡塔尔(英语:State of Qatar),’yyyymm’卡塔尔(قطر‎; –先删除表中特定条件的多寡。 DELETE FROM 表名 WHERE ym =
is_ym;
–然后用内置的DBMS_OUTPUT对象的put_line方法打字与印刷出影响的笔录行数,个中用到贰个种类变量SQL%rowcount
DBMS_OUTPUT.put_line(‘del下贰个月记录=’||SQL%rowcount||’条’卡塔尔(英语:State of Qatar); INSERT
INTO表名(area_code,ym,CMCODE,rmb_amt,usd_amt) SELECT
area_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000 FROM
BGD_AREA_CM_M_BASE_T WHERE ym = vs_ym_beg AND ym = vs_ym_end
GROUP BY area_code,CMCODE;
DBMS_OUTPUT.put_line(‘ins前段时间记下=’||SQL%rowcount||’条’卡塔尔(英语:State of Qatar);
–遍历游标管理后更新到表。遍历游标有两种办法,用for语句是里面前蒙受比直观的生机勃勃种。
FOR rec IN cur_1 LOOP UPDATE 表名 SET rmb_amt_sn =
rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn WHERE area_code =
rec.area_code AND CMCODE = rec.CMCODE AND ym = is_ym; END LOOP;
COMMIT;
–错误处理部分。OTHELX570S表示除了表明外的随机错误。SQLE智跑RM是系统内置变量保存了当下不当的详细新闻。
EXCEPTION WHEN OTHECRUISERS THEN vs_msg := ‘ERROR IN
xxxxxxxxxxx_p(‘||is_ym||’卡塔尔国:’||SUBSTHaval(SQLESportageRM,1,500卡塔尔国; ROLLBACK;
–把如今不当记录进日志表。 INSERT INTO
LOG_INFO(proc_name,error_info,op_date)
VALUES(‘xxxxxxxxxxx_p’,vs_msg,SYSDATE卡塔尔; COMMIT; RETUTiguanN; END;
oracle存款和储蓄进程语法 1 、判定语句: if 相比式 then begin end; end if;
代码如下: create or replace procedure test(x in number卡塔尔(英语:State of Qatar) is begin if x 0
then begin x := 0 – x; end; end if; if x = 0 then begin x: = 1; end; end
if; end test; 2 、For 循环 For … in … LOOP — 执行语句 end LOOP;
(1卡塔尔(英语:State of Qatar) 循环遍历游标 代码如下: create or replace procedure test(卡塔尔(قطر‎ as
Cursor cursor is select name from student; name varchar(20卡塔尔; begin for
name in cursor LOOP begin dbms_output.putline(name); end; end LOOP; end
test; (2卡塔尔国 循环遍历数组 代码如下: create or replace procedure
test(varArray in myPackage.TestArray卡塔尔 as –( 输入参数varArray
是自定义的数组类型,定义方式见标题6卡塔尔国 i number; begin i := 1; —
存款和储蓄进度数组是开场地点是从1 上马的,与java 、C 、C++
等语言区别。因为在Oracle 中本是从未数组的定义的,数组其实正是一张 —
表(Table卡塔尔国,
每种数组成分就是表中的八个笔录,所以遍历数组时就相当于从表中的第一条记下最先遍历
for i in 1..varArray.count LOOP dbms_output.putline(‘The No.’|| i ||
‘record in varArray is:’||varArray(i)); end LOOP; end test; 3 、While
循环
while 条件语句 LOOP 代码如下: begin end; end LOOP; E.g create or
replace procedure test(i in number卡塔尔 as begin while i 10 LOOP begin i:= i

  • 1; end; end LOOP; end test; 4 、数组 首先显著多少个定义:Oracle
    中本是还没数组的概念的,数组其实正是一张表(Table卡塔尔,
    每一个数组元素正是表中的叁个笔录。 使用数组时,客商能够使用Oracle
    已经定义好的数组类型,或可依靠自身的需求定义数组类型。 (1卡塔尔 使用Oracle
    自带的数组类型 x array; — 使用时索要须要张开伊始化 e.g: create or
    replace procedure test(y out array卡塔尔(英语:State of Qatar) is x array; begin x := new array(卡塔尔国;
    y := x; end test; (2卡塔尔国 自定义的数组类型 (
    自定义数据类型时,建议通过创办Package 的艺术落到实处,以便于管理卡塔尔国 create or
    replace package myPackage is Public type declarations type info is
    record( name varchar(20卡塔尔(قطر‎, y number卡塔尔; type TestArray is table of info
    index by binary_integer; — 此处注解了贰个TestArray
    的档期的顺序数据,其实其为一张存款和储蓄Info 数据类型的Table 而已,及TestArray
    就是一张表,有七个字段,三个是name ,四个是y
    。要求注意的是此处使用了Index by binary_integer 编写制定该Table
    的索引项,也足以不写,直接写成:type TestArray is table of info
    ,若是不写的话使用数组时就须求开展初始化:varArray myPackage.TestArray;
    varArray := new myPackage.TestArray(卡塔尔国; end TestArray; 5. 游标的施用
    Oracle 中Cursor
    是老大实用的,用于遍历有时表中的查询结果。其连带措施和质量也相当多,现仅就常用的用法做简介:
    (1卡塔尔(英语:State of Qatar)Cursor 型游标( 不能够用于参数字传送递卡塔尔(英语:State of Qatar) 代码如下: create or replace
    procedure test(卡塔尔 is cusor_1 Cursor is select std_name from student
    where …; –Cursor 的使用方法1 cursor_2 Cursor; begin select
    class_name into cursor_2 from class where …; –Cursor 的施用方法2
    可选用For x in cursor LOOP …. end LOOP; 来达成对Cursor 的遍历 end
    test; (2卡塔尔(英语:State of Qatar)SYS_REFCU科迈罗SO君越 型游标,该游标是Oracle
    以优先定义的游标,可作出参数实行传递 create or replace procedure
    test(rsCursor out SYS_REFCURSOR) is cursor SYS_REFCURSOR; name
    varhcar(20); begin OPEN cursor FOR select name from student where …
    –SYS_REFCUCRUISERSO君越 只好通过OPEN 方法来开采和赋值 LOOP fetch cursor into
    name –SYS_REFCU路虎极光SOEvoque 只好通过fetch into 来开发和遍历 exit when
    cursor%NOTFOUND; –SYS_REFCU凯雷德SOENCORE 中可应用四个情形属性: —%NOTFOUND(
    未找到记录新闻卡塔尔(قطر‎ %FOUND( 找到记录音信卡塔尔 —%ROWCOUNT(
    然后当前游标所针对的行地方卡塔尔 dbms_output.putline(name卡塔尔; end LOOP;
    rsCursor := cursor; end test; 实例
    上面写一个粗略的例子来对以上所说的寄放进程的用法做三个运用:
    现假若存在两张表,一张是学子成绩表(studnet卡塔尔(英语:State of Qatar),字段为:stdId,math,article,language,music,sport,total,average,step
    一张是学生课余成绩表(out_school卡塔尔国, 字段为:stdId,parctice,comment
    通过存款和储蓄进度自动测算出各位学子的总战绩和平均成绩,同期,要是学员在课外课程中得到的评论和介绍为A
    ,就在总成绩上加20 分。 代码如下: create or replace procedure
    autocomputer(step in number卡塔尔(قطر‎ is rsCursor SYS_REFCURSOR; commentArray
    myPackage.myArray; math number; article number; language number; music
    number; sport number; total number; average number; stdId varchar(30);
    record myPackage.stdInfo; i number; begin i := 1;
    get_comment(commentArray卡塔尔(英语:State of Qatar); — 调用名称为get_comment(卡塔尔的囤积进程获得学子课余评分音信 OPEN rsCursor for select
    stdId,math,article,language,music,sport from student t where t.step =
    step; LOOP fetch rsCursor into stdId,math,article,language,music,sport;
    exit when rsCursor%NOTFOUND; total := math + article + language + music
  • sport; for i in 1..commentArray.count LOOP record := commentArray(i卡塔尔(قطر‎;
    if stdId = record.stdId then begin if record.comment = ‘A’ then begin
    total := total + 20; go to next; — 使用go to 跳出for 循环 end; end if;
    end; end if; end LOOP; continue average := total / 5; update student t
    set t.total=total and t.average = average where t.stdId = stdId; end
    LOOP; end; end autocomputer; — 获得学子评价新闻的存放过程 create or
    replace procedure get_comment(commentArray out myPackage.myArray) is rs
    SYS_REFCURSOR ; record myPackage.stdInfo; stdId varchar(30); comment
    varchar(1); i number; begin open rs for select stdId,comment from
    out_school i := 1; LOOP fetch rs into stdId,comment; exit when
    rs%NOTFOUND; record.stdId := stdId; record.comment := comment;
    recommentArray(i) := record; i:=i + 1; end LOOP; end get_comment; —
    定义数组类型myArray create or replace package myPackage is begin type
    stdInfo is record(stdId varchar(30),comment varchar(1卡塔尔国卡塔尔(قطر‎; type myArray is
    table of stdInfo index by binary_integer; end myPackage;

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章