您当前的位置:首页 > 好词好句 > 正文

oracle存储过程语法(Oracle存储过程编写)

本文目录

  • Oracle存储过程编写
  • Oracle存储过程的语法分析
  • Oracle的存储过程基本语法和hibernate调用其存储过程
  • oracle SQL语句中怎么样调用存储过程
  • oracle存储过程并且怎么写
  • Oracle存储过程的语法
  • Oracle 存储过程中的基本语法有哪些
  • ORACLE存储过程的写法

Oracle存储过程编写

Oracle存储过程基本语法:CREATE?OR?REPLACE?PROCEDURE?存储过程名?IS?BEGIN?NULL;?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体的结束。

Oracle存储过程的语法分析

ORREPLACE  是一个可选的关键字,建议用户使用此关键字。如果过程已经存在,该关键字将重新创建过程,这样就不必删除和重新创建过程。  关键字IS和AS均可,  它们本身没有区别。IS后面是一个完整的PL/SQL块,可以定义局部变量,但不能以DECLARE开始。局部变量在过程内部存放值。  形式参数可以有三种模式:IN、OUT、INOUT。如果没有为形式参数指定模式,那么默认的模式是IN。  IN表示输入参数  OUT表示输出参数HelloWorld!  创建第一个存储过程HelloWorld  SQL》createorreplaceprocedurehelloworldasbegindbms_output.put_line(’helloworld’);end;  注:需要在存储过程输入完成后回车,下一行输入”/”回车,才会创建成功。  当提示Procedurecreated表示存储过程创建成功。  调用HelloWorld!  执行  SQL》setserveroutputon;  SQL》exec[ute]helloworld;  显示如下结果  helloworld  PL/SQLproceduresuccessfullycompleted

Oracle的存储过程基本语法和hibernate调用其存储过程

在oracle中,可以在数据库中定义子程序,这种程序块叫存储过程(procedure),它存放在数据字典中,可以在不同用户和应用程序中共享,并可以实现程序的优化和重用。 2:存储过程的有点?? 过程运行在服务器端,执行速度快? 过程执行一次后代码就驻留在高速缓存中,在以后的操作中,直接调用缓存数据。? 确保数据库的安全性,可以不授权用户直接访问应用程序中的一些表,而是授权用户执行访问数据库的过程。? 自动完成需要预先执行的任务,过程可以在系统启动时自动运行。、 3:存储过程的创建和执行用户存储过程只能定义在当前数据库中,可以使用sql语句或OEM创建。默认情况下,用户创建的存储过程归登录数据库的用户所拥有,DBA可以把许可授权给其他用户。 Sql命令创建存储过程 CREATE procedure 过程名【(parameter parameter_mode date_type,….n)】 IS| AS BEGIN SQL_STATEMENT END 过程名其中 Parameter表示过程的参数。 parameter_mode:参数的类型,过程参数和函数参数一样,有三种类型IN,OUT,IN OUT IN 表示参数是输入给过程的。 OUT表示采纳数载过程中被赋值,可以传给过程的外部。 IN OUT表示可以传内,可以传外。 调用存储过程直接输入存储过程的名字可以执行一个已经定义的存储过程。 存储过程的编辑修改修改存储过程虽然可以和修改视图一样,用ALTER procedure,但是他是用来重新编译和验证用的,如果要修改过程定义,建议还是用create or replace。 存储过程的删除当某个过程不再需要的时候,应该将其从内存中删除,以释放它占用的资源。 Drop procedure 存储过程名。 Drop procedure update_info. 触发器触发器(trigger)是一些过程,与表联系紧密,用于保护表中的数据,当一个基表被修改时,触发器自动就会执行。例如出入其可以实现多个表间数据的一致性和完整性。一般情况下,对表数据的操作有增删查改,维护数据的触发器也可以分为多种,每张基表最多可以建立12个触发器。 1:Before insert 2:before insert fo each row; 3:after inert 4:after insert for each row 5:before update 6:before update for each row 7:after update 8:after update for each row; 9:before delete; 10:before delete for each row 11:after delete 12:after delete for each row. 利用sql语句创建触发器语法规则 Create or replace trigger 触发器名 {before| after| instead of} {delete 【or insert】【or update】【of column ….n 】} On 表名|视图名【for each row 】where condition]] Sql_statement[,,,n] 参数说明 Instead of :指定在创建替代触发器。 Of column 指定在哪些列上进行触发。。。创建触发器的限制 1:触发器中有效的语句可以包括DML语句,但是不能包括DDL,rollback,commit ,savepoint都不适用。

oracle SQL语句中怎么样调用存储过程

PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL基础语法,结构和组件、以及如何设计并执行一个PL/SQL程序。

PL/SQL的优点

从版本6开始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的优点以及其独有的数据管理的便利性,那么你很难想象ORACLE缺了PL/SQL的情形。PL/SQL 不是一个独立的产品,他是一个整合到ORACLE服务器和ORACLE工具中的技术,可以把PL/SQL看作ORACLE服务器内的一个引擎,sql语句执行者处理单个的sql语句,PL/SQL引擎处理PL/SQL程序块。当PL/SQL程序块在PL/SQL引擎处理时,ORACLE服务器中的SQL语句执行器处理pl/sql程序块中的SQL语句。

PL/SQL的优点如下:

. PL/SQL是一种高性能的基于事务处理的语言,能运行在任何ORACLE环境中,支持所有数据处理命令。通过使用PL/SQL程序单元处理SQL的数据定义和数据控制元素。

. PL/SQL支持所有SQL数据类型和所有SQL函数,同时支持所有ORACLE对象类型

. PL/SQL块可以被命名和存储在ORACLE服务器中,同时也能被其他的PL/SQL程序或SQL命令调用,任何客户/服务器工具都能访问PL/SQL程序,具有很好的可重用性。

. 可以使用ORACLE数据工具管理存储在服务器中的PL/SQL程序的安全性。可以授权或撤销数据库其他用户访问PL/SQL程序的能力。

. PL/SQL代码可以使用任何ASCII文本编辑器编写,所以对任何ORACLE能够运行的操作系统都是非常便利的

. 对于SQL,ORACLE必须在同一时间处理每一条SQL语句,在网络环境下这就意味作每一个独立的调用都必须被oracle服务器处理,这就占用大量的服务器时间,同时导致网络拥挤。而PL/SQL是以整个语句块发给服务器,这就降低了网络拥挤。

PL/SQL块结构

PL/SQL是一种块结构的语言,组成PL/SQL程序的单元是逻辑块,一个PL/SQL 程序包含了一个或多个逻辑块,每个块都可以划分为三个部分。与其他语言相同,变量在使用之前必须声明,PL/SQL提供了独立的专门用于处理异常的部分,下面描述了PL/SQL块的不同部分:

声明部分(Declaration section)

声明部分包含了变量和常量的数据类型和初始值。这个部分是由关键字DECLARE开始,如果不需要声明变量或常量,那么可以忽略这一部分;需要说明的是游标的声明也在这一部分。

执行部分(Executable section)

执行部分是PL/SQL块中的指令部分,由关键字BEGIN开始,所有的可执行语句都放在这一部分,其他的PL/SQL块也可以放在这一部分。

异常处理部分(Exception section)

这一部分是可选的,在这一部分中处理异常或错误,对异常处理的详细讨论我们在后面进行。

PL/SQL块语法

[DECLARE]---declaration statementsBEGIN---executable statements[EXCEPTION]---exception statementsEND

PL/SQL块中的每一条语句都必须以分号结束,SQL语句可以使多行的,但分号表示该语句的结束。一行中可以有多条SQL语句,他们之间以分号分隔。每一个PL/SQL块由BEGIN或DECLARE开始,以END结束。注释由--标示。

PL/SQL块的命名和匿名

PL/SQL程序块可以是一个命名的程序块也可以是一个匿名程序块。匿名程序块可以用在服务器端也可以用在客户端。

命名程序块可以出现在其他PL/SQL程序块的声明部分,这方面比较明显的是子程序,子程序可以在执行部分引用,也可以在异常处理部分引用。

PL/SQL程序块可背独立编译并存储在数据库中,任何与数据库相连接的应用程序都可以访问这些存储的PL/SQL程序块。ORACLE提供了四种类型的可存储的程序:

. 函数

. 过程

. 包

. 触发器

函数

函数是命名了的、存储在数据库中的PL/SQL程序块。函数接受零个或多个输入参数,有一个返回值,返回值的数据类型在创建函数时定义。定义函数的语法如下:

FUNCTION name [{parameter[,parameter,...])] RETURN datatypes IS[local declarations]BEGINexecute statements[EXCEPTIONexception handlers]END [name]

过程

存储过程是一个PL/SQL程序块,接受零个或多个参数作为输入(INPUT)或输出(OUTPUT)、或既作输入又作输出(INOUT),与函数不同,存储过程没有返回值,存储过程不能由SQL语句直接使用,只能通过EXECUT命令或PL/SQL程序块内部调用,定义存储过程的语法如下:

PROCEDURE name [(parameter[,parameter,...])] IS[local declarations]BEGINexecute statements[EXCEPTIONexception handlers ]END [name]

包(package)

包其实就是被组合在一起的相关对象的集合,当包中任何函数或存储过程被调用,包就被加载入内存中,包中的任何函数或存储过程的子程序访问速度将大大加快。包由两个部分组成:规范和包主体(body),规范描述变量、常量、游标、和子程序,包体完全定义子程序和游标。

触发器(trigger)

触发器与一个表或数据库事件联系在一起的,当一个触发器事件发生时,定义在表上的触发器被触发。

变量和常量

变量存放在内存中以获得值,能被PL/SQL块引用。你可以把变量想象成一个可储藏东西的容器,容器内的东西是可以改变的。

声明变量

变量一般都在PL/SQL块的声明部分声明,PL/SQL是一种强壮的类型语言,这就是说在引用变量前必须首先声明,要在执行或异常处理部分使用变量,那么变量必须首先在声明部分进行声明。

声明变量的语法如下:

Variable_name [CONSTANT] databyte [NOT NULL][:=|DEFAULT expression]

注意:可以在声明变量的同时给变量强制性的加上NOT NULL约束条件,此时变量在初始化时必须赋值。

给变量赋值

给变量赋值有两种方式:

. 直接给变量赋值

X:=200;Y=Y+(X*20);

. 通过SQL SELECT INTO 或FETCH INTO给变量赋值

SELECT SUM(SALARY),SUM(SALARY*0.1)INTO TOTAL_SALARY,TATAL_COMMISSIONFROM EMPLOYEEWHERE DEPT=10;

常量

常量与变量相似,但常量的值在程序内部不能改变,常量的值在定义时赋予,,他的声明方式与变量相似,但必须包括关键字CONSTANT。常量和变量都可被定义为SQL和用户定义的数据类型。

ZERO_VALUE CONSTANT NUMBER:=0;

这个语句定了一个名叫ZERO_VALUE、数据类型是NUMBER、值为0的常量。

标量(scalar)数据类型

标量(scalar)数据类型没有内部组件,他们大致可分为以下四类:

. number. character. date/time. boolean

oracle存储过程并且怎么写

存储过程(procedure):是一个命名了的语句块,可以有0个或多个参数语法: create or replace procedure HelloWorldasbegindbms_output.put_line(’HelloWorld’);end; 调用存储过程* 命令调用 exec helloworld* 语句块调用begin helloworld;end;/ DELETE: create or replace procedure del_emp01isbegindelete from emp01 where empno=7369;end; exec del_emp01; create or replace procedure del_emp01(v_empno in emp01.empno%type)isbegindelete from emp01 wherer empno=v_empno;end; exec del_emp01(7521); INSERT create or replace procedure ins_emp01(v_empno emp01.empno%type,v_ename emp01.ename%type)asbegininsert into emp01(empno,ename) values(v_empno,v_ename);end; exec ins_emp01(1000,’李四’); UPDATE create or replace procedure upd_emp01(v_empno emp01.empno%type,v_ename emp01.ename%type)asbeginupdate emp01 set ename=v_ename where empno=v_empno;end; exec upd_emp01(1000,’张三’); SELECTcreate or replace procedure sel_emp01(v_empno emp01.empno%type,v_emp01_data out emp01%rowtype)asbeginselect * into v_emp01_data from emp where empno=v_empno;end; 带有输出参数的存储过程不能使用命令直接调用 只能由语句块或程序调用(JAVA)****************************************************************declarev_emp_data emp01%rowtype;beginsel_emp01(7499,v_emp_data);dbms_output.put_line(v_emp_data.ename||’ ’||v_emp_data.sal);end;调用:declarev_emp_data emp01%rowtype;beginsel_emp01(7499,v_emp_data);dbms_output.put_line(v_emp_data.ename||’ ’||v_emp_data.sal);end;使用scott用户登录统计某个部门的员工的工资总和,员工的人数,平均工资,创建存储过程 create or replace procedure deptcount (v_deptno emp.deptno%type,v_sal_sum out number,v_recordes out number,v_avg_sal out number,errorMsg out varchar2) is begin select sum(sal) into v_sal_sum from emp group by deptno having deptno=v_deptno; select count(*) into v_recordes from emp group by deptno having deptno=v_deptno; select avg(sal) into v_avg_sal from emp group by deptno having deptno=v_deptno; exception when no_data_found then errorMsg:=’没有该部门’; end; 调用: declare v_sal_sum number; v_recordes number; v_avg_sal number(8,2); v_errormsg varchar2(20); begin deptcount(90,v_sal_sum,v_recordes,v_avg_sal,v_errormsg); dbms_output.put_line(v_sal_sum||’ ’||v_recordes||’ ’||v_avg_sal); dbms_output.put_line(v_errormsg); end; //输出参数 create or replace procedure my_pro(v_num in number,v_result out number) is v_temp number; begin v_temp:=0; for i in 1..v_num loop v_temp:=v_temp+i; end loop; v_result:=v_temp; end; declare v_recieve number; begin my_pro(100,v_recieve); dbms_output.put_line(v_recieve); end; //既是输入参数又是输出参数 create or replace procedure my_pro1(v_i in out number) is v_j number; begin v_j:=30; v_i:=v_i*v_j; end; declare v_t number; begin v_t:=20; my_pro1(v_t); dbms_output.put_line(v_t); end;

Oracle存储过程的语法

CREATE[ORReplace]PROCEDURE[schema.]procedure_name  [(argument[{IN|OUT|INOUT}]datatype,  ...  argument[{IN|OUT|INOUT}]datatype)]  {IS|AS}  [descriptionpart说明部分]  BEGIN  SQLSTATEMENT语句序列  [EXCEPTION例外处理]  END[procedureName过程名];

Oracle 存储过程中的基本语法有哪些

  Oracle存储过程基本语法介绍参考下  Oracle存储过程基本语法 存储过程  1 CREATE OR REPLACE PROCEDURE 存储过程名  2 IS  3 BEGIN  4 NULL;  5 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体的结束  存储过程创建语法:  create or replace procedure 存储过程名(param1 in type,param2 out type)  as  变量1 类型(值范围); --vs_msg VARCHAR2(4000);  变量2 类型(值范围);  复制代码 代码如下:  Begin  Select count(*) into 变量1 from 表A where列名=param1;  If (判断条件) then  Select 列名 into 变量2 from 表A where列名=param1;  Dbms_output。Put_line(‘打印信息’);  Elsif (判断条件) then  Dbms_output。Put_line(‘打印信息’);  Else  Raise 异常名(NO_DATA_FOUND);  End if;  Exception  When others then  Rollback;  End;  注意事项:  1, 存储过程参数不带取值范围,in表示传入,out表示输出  类型可以使用任意Oracle中的合法类型。  2, 变量带取值范围,后面接分号  3, 在判断语句前最好先用count(*)函数判断是否存在该条操作记录  4, 用select 。。。into。。。给变量赋值  5, 在代码中抛异常用 raise+异常名  复制代码 代码如下:  CREATE OR REPLACE PROCEDURE存储过程名  (  --定义参数  is_ym IN CHAR(6) ,  the_count OUT NUMBER,  )  AS  --定义变量  vs_msg VARCHAR2(4000); --错误信息变量  vs_ym_beg CHAR(6); --起始月份  vs_ym_end CHAR(6); --终止月份  vs_ym_sn_beg CHAR(6); --同期起始月份  vs_ym_sn_end CHAR(6); --同期终止月份  --定义游标(简单的说就是一个可以遍历的结果集)  CURSOR cur_1 IS  SELECT 。。。  FROM 。。。  WHERE 。。。  GROUP BY 。。。;  BEGIN  --用输入参数给变量赋初值,用到了Oralce的SUBSTR 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’), -12),’yyyymm’);  --先删除表中特定条件的数据。  DELETE FROM 表名 WHERE ym = is_ym;  --然后用内置的DBMS_OUTPUT对象的put_line方法打印出影响的记录行数,其中用到一个系统变量SQL%rowcount  DBMS_OUTPUT.put_line(’del上月记录=’||SQL%rowcount||’条’);  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||’条’);  --遍历游标处理后更新到表。遍历游标有几种方法,用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;  --错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。  EXCEPTION  WHEN OTHERS THEN  vs_msg := ’ERROR IN xxxxxxxxxxx_p(’||is_ym||’):’||SUBSTR(SQLERRM,1,500);  ROLLBACK;  --把当前错误记录进日志表。  INSERT INTO LOG_INFO(proc_name,error_info,op_date)  VALUES(’xxxxxxxxxxx_p’,vs_msg,SYSDATE);  COMMIT;  RETURN;  END;  oracle存储过程语法  1 、判断语句:  if 比较式 then begin end; end if;  复制代码 代码如下:  create or replace procedure test(x in number) 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) 循环遍历游标  复制代码 代码如下:  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) 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)Cursor 型游标( 不能用于参数传递)  复制代码 代码如下:  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)SYS_REFCURSOR 型游标,该游标是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_REFCURSOR 只能通过OPEN 方法来打开和赋值  LOOP  fetch cursor into name --SYS_REFCURSOR 只能通过fetch into 来打开和遍历 exit when cursor%NOTFOUND; --SYS_REFCURSOR 中可使用三个状态属性: ---%NOTFOUND( 未找到记录信息) %FOUND( 找到记录信息) ---%ROWCOUNT( 然后当前游标所指向的行位置)  dbms_output.putline(name);  end LOOP;  rsCursor := cursor;  end test;  实例  下面写一个简单的例子来对以上所说的存储过程的用法做一个应用:  现假设存在两张表,一张是学生成绩表(studnet) ,字段为: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); -- 调用名为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;

ORACLE存储过程的写法

oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字 2.SELECT INTO STATEMENT 将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条 记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND) 例子: BEGIN SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx; EXCEPTION WHEN NO_DATA_FOUND THEN xxxx; END; ... 3.IF 判断 IF V_TEST=1 THEN BEGIN do something END; END IF; 4.while 循环 WHILE V_TEST=1 LOOP BEGIN XXXX END; END LOOP; 5.变量赋值 V_TEST := 123; 6.用for in 使用cursor ... IS CURSOR cur IS SELECT * FROM xxx; BEGIN FOR cur_result in cur LOOP BEGIN V_SUM :=cur_result.列名1+cur_result.列名2 END; END LOOP; END; 7.带参数的cursor CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID; OPEN C_USER(变量值); LOOP FETCH C_USER INTO V_NAME; EXIT FETCH C_USER%NOTFOUND; do something END LOOP; CLOSE C_USER; 8.用pl/sql developer debug 连接数据库后建立一个Test WINDOW 在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试蓝屏


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: numb xxxtentacion歌词(开头是哦噢哦哦 哦噢 噢噢噢叫什么歌)

下一篇: 小兔子乖乖教案,幼儿园《小兔乖乖》教案(幼儿园小班数学游戏教案)



推荐阅读