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,'yyy ymm'), -12),'yyyymm');

vs_ym_sn_end :=

TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,'yyy ymm'), -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,SU M(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 = https://www.360docs.net/doc/1210317258.html,d_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 https://www.360docs.net/doc/1210317258.html,mentArray.count LOOP

record := commentArray(i);

if stdId = record.stdId then

begin

if https://www.360docs.net/doc/1210317258.html,ment = 'A' then

begin

total := total + 20;

go to next; -- 使用go to 跳出for 循环

end;

end if;

end;

end if;

end LOOP;

<> 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;

https://www.360docs.net/doc/1210317258.html,ment := comment;

recommentArray(i) := record;

ORACLE存储过程编码规范

ORACLE存储过程编码规范 1.1变量规范 变量名、常量名、参数名、函数名、存储过程名、包名等所有对象全部用英文拼写,不允许用汉语拼音,多个单词间用下划线分割。 全局常量全部用大写,全局变量全部用小写,且全局变量尽量避免使用。 局部变量全部小写,使用“v_”开头,输入参数以“i_”开头,输出参数以“o_” 开头,输入输出参数用io_开头。 游标的定义:游标统一用前缀“cur_”命名 当变量代表列时,使用%TYPE属性,当变量实际上表示数据库表的某列数据时,为避免数据库结构修改对变量的影响,应统一使用%TYPE属性对变量命名 1.2显示游标规范 外部查询的多行数据返回使用游标进行处理,通过传递游标变量的形式返回数据到外部接口,由外部程序自行FETCH数据。 打开游标前,必须显式检查游标的%ISOPEN属性。 使用FETCH语句后,要立即检查%NOTFOUND属性,以便正常终止游标FETCH 循环。 无论PL/SQL程序是正常终止还是出错退出,都要关闭所有已打开的游标。在出错退出时,应该在其异常处理部分管理所有游标,这可以释放一部分的系统资源 1.3事务处理规范 在需要分割事务以使主事务的提交或者回滚独立于子事务的提交及回滚时,应使用自动提交事务。 所有的存储过程均统一在结束处统一COMMIT或者ROLLBACK。 1.4错误处理规范 凡是涉及到表操作(insert,update,select,delete)的sql语句,都必须进行错误捕捉,不能将错误带到后面的语句 从表中SELECT数据INTO到指定变量中的SQL语句,应严格区分NO_DATA_FOUND 和TOO_MANY_ROWS的错误,并将相应错误信息填入错误信息 ?NO_DA TA_FOUND 多数为查询条件问题导致无数据返回(用户级错误)

ORACLE存储过程

ORACLE提供了四种类型的可存储的程序: 函数, 过程. 包,触发器 一.声明部分(Declarationsection) (1)声明部分包含了变量和常量的数据类型和初始值 (2)这个部分是由关键字DECLARE开始 (3)如果不需要声明变量或常量,那么可以忽略这一部分; 二.执行部分(Executablesection) (1)执行部分是PL/SQL块中的指令部分, (2)由关键字BEGIN开始,所有的可执行语句都放在这一部分,其他的PL/SQL块也可以放在这一部分。 三.异常处理部分(Exceptionsection) 这一部分是可选的,在这一部分中处理异常或错误。 过程存储过程是一个PL/SQL程序块,接受零个或多个参数作为输入(INPUT)或输出(OUTPUT)、或既作输入又作输出(INOUT),与函数不同,存储过程没有返回值,存储过程不能由SQL语句直接使用,只能通过EXECUT命令或PL/SQL程序块内部调用。 1.创建存储过程 CREATE[ORREPLACE]PROCEDURE过程名 (参数1{IN/OUT/INOUT}类型, 参数2{IN/OUT/INOUT}类型, …….

参数N{IN/OUT/INOUT}类型, )IS/AS 过程体 BEGIN END存储过程名字 说明: (1)ORREPLACE关键字可选,但一般会使用,功能为如果同名的过程已存在,则删除同名过程,然后重建,以此来实现修改过程的目的。 (2)过程可以包括多个参数,参数模式有IN/OUT/INOUT三种,默认为IN,也可以没参数。 (3)IS/AS键字也等价 (4)过程体为该过程的代码部分,是一个含有声明部分,执行部分和异常处理部分的PL/SQL块。但需要注意的是,在过程的声明体中不能使用DECLARE关键字,由IS或AS来代替。 注意事项: 1,存储过程参数不带取值范围,in表示传入,out表示输出 类型可以使用任意Oracle中的合法类型。 2,变量带取值范围,后面接分号 3,在判断语句前最好先用count(*)函数判断是否存在该条操作记录 4,用select。。。into。。。给变量赋值 5,在代码中抛异常用raise+异常名 2.查看过程

ORACLE存储过程开发基础语法

ORACLE存储过程开发基础语法 create or replace procedure test(var_name_1 in type,var_name_2 out type) as --声明变量(变量名变量类型) begin --储备过程的执行体 end test; 打印出输入的时刻信息 E.g: create or replace procedure test(workDate in Date) is begin dbms_output.putline('The input date is:'||to_date(workDate,'yyyy-mm-dd')); end test; 2、变量赋值 变量名:= 值; E.g: create or replace procedure test(workDate in Date) is x number(4,2); begin x := 1; end test; 3、判定语句:

if 比较式then begin end; end if; E.g 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; 4、For 循环 For ... in ... LOOP --执行语句 end LOOP; (1)循环遍历游标 create or replace procedure test() as Cursor cursor is select name from student; name varchar(20);

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) ,

oracle存储过程学习经典[语法实例调用]

Oracl e 存储过程学习 目录 Oracle 存储过程1 Oracle存储过程基础知识1 Oracle存储过程的基本语法2 关于Oracle存储过程的若干问题备忘4 1.在Oracle中,数据表别名不能加as。5 2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用 游标的话就另当别论了。5 3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。5 4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段 会报错5 5.在存储过程中,关于出现null的问题5 6.Hibernate调用Oracle存储过程6 用Java调用Oracle存储过程总结6 一、无返回值的存储过程6 二、有返回值的存储过程(非列表)8 三、返回列表10 在存储过程中做简单动态查询11 一、本地动态SQL12 二、使用DBMS_SQL包14 Oracle存储过程调用Java方法16 Oracle高效分页存储过程实例17 Oracle存储过程基础知识 商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。 存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。这样的结果就是,代码存储一次但是能够被多个程序使用。 要创建一个过程对象(procedural object),必须有CREATE PROCEDURE 系统权限。如果这个过程对象需要被其他的用户schema 使用,那么你必须有CREATE ANY PROCEDURE 权限。执行procedure 的时候,可能需要excute权限。或者EXCUTE ANY PROCEDURE 权限。如果单独赋予权限,如下例所示: grant execute on MY_PROCEDURE to Jelly 调用一个存储过程的例子: execute MY_PROCEDURE( 'ONE PARAMETER'); 存储过程(PROCEDURE)和函数(FUNCTION)的区别。

oracle实验--存储过程

实验八存储过程的使用 一、实验目的 1、熟练掌握存储过程的定义及使用 二、实验要求 1、实验前做好上机实验的准备,针对实验内容,认真复习与本次实验有关的知识,完成 实验内容的预习准备工作; 2、能认真独立完成实验内容; 3、实验后做好实验总结,根据实验情况完成实验报告。 三、实验内容 创建图书管理库的图书、读者和借阅三个基本表的表结构: 图书表: BOOK ( BOOK_ID NUMBER(10), SORT V ARCHAR2(10), BOOK_NAME V ARCHAR2(50), WRITER V ARCHAR2(10), OUTPUT V ARCHAR2(50), PRICE NUMBER(3)); 读者表 READER ( READER_ID NUMBER(3), COMPANY V ARCHAR2(10), NAME V ARCHAR2(10), SEX V ARCHAR2(2), GRADE V ARCHAR2(10), ADDR V ARCHAR2(50)); 借阅表 BORROW ( READER_ID NUMBER(3),

BOOK_ID NUMBER(10), BORROW_DA TE DA TE); 插入数据: BOOK表: insert into book values(445501,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(445502,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(445503,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(332211,'TP5/10','计算机基础','李伟','高等教育出版社',18.00); insert into book values(112266,'TP3/12','FoxBASE','张三','电子工业出版社',23.60); insert into book values(665544,'TS7/21','高等数学','刘明','高等教育出版社',20.00); insert into book values(114455,'TR9/12','线性代数','孙业','北京大学出版社',20.80); insert into book values(113388,'TR7/90','大学英语','胡玲','清华大学出版社',12.50); insert into book values(446601,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(446602,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(446603,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(449901,'TP4/14','FoxPro大全','周虹','科学出版社',32.70); insert into book values(449902,'TP4/14','FoxPro大全','周虹','科学出版社',32.70); insert into book values(118801,'TP4/15','计算机网络','黄力钧','高等教育出版社',21.80); insert into book values(118802,'TP4/15','计算机网络','黄力钧','高等教育出版社',21.80); READER表: insert into reader values(111,'信息系','王维利','女','教授','1号楼424'); insert into reader values(112,'财会系','李立','男','副教授','2号楼316'); insert into reader values(113,'经济系','张三','男','讲师','3号楼105'); insert into reader values(114,'信息系','周华发','男','讲师','1号楼316'); insert into reader values(115,'信息系','赵正义','男','工程师','1号楼224'); insert into reader values(116,'信息系','李明','男','副教授','1号楼318'); insert into reader values(117,'计算机系','李小峰','男','助教','1号楼214'); insert into reader values(118,'计算机系','许鹏飞','男','助工','1号楼216'); insert into reader values(119,'计算机系','刘大龙','男','教授','1号楼318'); insert into reader values(120,'国际贸易','李雪','男','副教授','4号楼506'); insert into reader values(121,'国际贸易','李爽','女','讲师','4号楼510'); insert into reader values(122,'国际贸易','王纯','女','讲师','4号楼512'); insert into reader values(123,'财会系','沈小霞','女','助教','2号楼202'); insert into reader values(124,'财会系','朱海','男','讲师','2号楼210'); insert into reader values(125,'财会系','马英明','男','副教授','2号楼212'); BORROW表:

Oracle存储过程语法与注意事项

oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字 2.SELECT INTO STA TEMENT 将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条 记录,否则抛出异常(如果没有记录抛出NO_DA TA_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单步调试 关于oracle存储过程的若干问题备忘 1.在oracle中,数据表别名不能加as,如: select a.appname from appinfo a;-- 正确 select a.appname from appinfo as a;-- 错误 也许,是怕和oracle中的存储过程中的关键字as冲突的问题吧 2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。 select af.keynode into kn from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;-- 有into,正确编译 select af.keynode from APPFOUNDA TION af where af.appid=aid and af.foundationid=fid;-- 没有into,编译报错,提示:Compilation Error: PLS-00428: an INTO clause is expected in this SELECT statement

Oracle+PlSql存储过程 学习文档

Oracl e 存储过程 目录 Oracle 存储过程 (1) Oracle存储过程基础知识 (1) Oracle存储过程的基本语法 (2) 关于Oracle存储过程的若干问题备忘 (4) 1. 在Oracle中,数据表别名不能加as。 (4) 2. 在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利 用游标的话就另当别论了。 (5) 3. 在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。 (5) 4. 在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段 会报错 (5) 5. 在存储过程中,关于出现null的问题 (5) 6. Hibernate调用Oracle存储过程 (6) 用Java调用Oracle存储过程总结 (6) 一、无返回值的存储过程 (6) 二、有返回值的存储过程(非列表) (8) 三、返回列表 (9) 在存储过程中做简单动态查询 (11) 一、本地动态SQL (12) 二、使用DBMS_SQL包 (13) Oracle存储过程调用Java方法 (16) Oracle高效分页存储过程实例 (17) Oracle存储过程基础知识 商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。 存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。这样的结果就是,代码存储一次但是能够被多个程序使用。 要创建一个过程对象(procedural object),必须有CREATE PROCEDURE 系统权限。如果这个过程对象需要被其他的用户schema 使用,那么你必须有CREATE ANY PROCEDURE 权限。执行procedure 的时候,可能需要excute权限。或者EXCUTE ANY PROCEDURE 权限。如果单独赋予权限,如下例所示: grant execute on MY_PROCEDURE to Jelly 调用一个存储过程的例子: execute MY_PROCEDURE( 'ONE PARAMETER'); 存储过程(PROCEDURE)和函数(FUNCTION)的区别。

如何在Oracle中使用Java存储过程(详解)

如何在Oracle中使用Java存储过程 (详解) 一、如何缔造java存储过程? 通常有三种步骤来缔造java存储过程。 1. 使用oracle的sql语句来缔造: e.g. 使用create or replace and compile java source named "" as 后边跟上java源程序。要求类的步骤必须是public static的,威力用于存储过程。 1.SQL> create or replace and compile java source named "javademo1 " 2. as 3. import java.sql.*; 4. public class JavaDemo1 5. { 6. public static void main(String[] argv) 7. { 8. System.out.println("hello, java demo1"); 9. } 10. } 11. / 12. 13.Java 已 14. 15.缔造。 16. 17.SQL> show errors java source "javademo1" 18.没有 19. 20.舛误。 21. 22.SQL> create or replace procedure javademo1 23. 2 as 24.3 language java name JavaDemo1.main(https://www.360docs.net/doc/1210317258.html,ng.String[]); 25. 4 / 26. 27.过程已 28.

30. 31.SQL> set serveroutput on 32.SQL> call javademo1(); 33. 34.调用 35.实现。 36. 37.SQL> call dbms_java.set_output(5000); 38. 39.调用 40.实现。 41. 42.SQL> call javademo1(); 43.hello, java demo1 44. 45.调用 46.实现。 47. 48.SQL> call javademo1(); 49.hello, java demo1 50.调用 51.实现。 2. 使用外部class文件来装载缔造 e.g. 这里既然用到了外部文件,必定要将class文件放到oracle Server 的某一目录下边。 1.public class OracleJavaProc 2.{ 3. public static void main(String[] argv) 4. { 5. System.out.println("Its a Java Oracle procedure."); 6. } 7.} 8. 9. 10.SQL> grant create any directory to scott; 11. 12.授权 13.顺利。 14. 15.SQL> conn scott/tiger@iihero.oracledb

oracle存储过程例子

oracle存储过程学习过程 一直没有使用过存储过程 今天特意学习一下oracle的存储过程 一步一步学习,今天学习如下: 建立一个最简单的存储过程 create or replace procedure test_xg_p1 is begin dbms_output.put_line('hello world! this is the first procedure'); end; 建立一个带输入输出参数的存储过程:把输入的数据传给输出参数 create or replace procedure test_xg_p2(a in number,x out number) is begin x:=a; end test_xg_p2; 建立一个逻辑判断的存储过程,并包含输入输出参数:近似分数的登记判断create or replace procedure test_xg_p3(a in number,x out varchar2) is begin if a>=90 then begin x := 'A'; end; end if; if a<90 then begin x:='B'; end; end if; if a<80 then begin x:='C'; end; end if; if a<70 then begin x:='D'; end; end if; if a<60 then begin x:='E'; end; end if; end test_xg_p3; 建立一个带循环逻辑的存储过程:近似累加函数

create or replace procedure test_xg_p4(a in number,x out varchar2) is tempresult number(16); begin tempresult :=0; for tempa in 0..a loop begin tempresult := tempresult + tempa; end; end loop; x:=tempresult; end test_xg_p4; 建立一个能从数据库中特定表中返回数据的存储过程: create or replace procedure test_xg_p5(x out varchar2) is tempresult varchar2(1024); begin tempresult := 'start->'; select hotelid||hotelname into tempresult from hotel where hotelid =10041764; x:=tempresult; end test_xg_p5; 建立一个能使用游标的带循环的存储过程: create or replace procedure test_xg_p6(x out varchar2) is tempresult varchar2(10240); cursor cursor1 is select * from hotel where hotelname like '浙江%'; begin tempresult := 'start->'; for cursor_result in cursor1 loop begin tempresult :=tempresult||cursor_result.hotelid||cursor_result.hotelname; end; end loop; x:=tempresult; end test_xg_p6;

oracle存储过程函数汇总().docx

oracle存储过程函数汇总() Character function return character value These functions all received is the character parameter type group (except CHR) and returns the character value? In addition to the special instructions, the function returns VARCHAR2 most numerical types? The restrictions on the return type of the character function are the same as those for the basic database type? The maximum value of character variable storage: The VARCHAR2 value is limited to 2000 characters (ORACLE 8 to 4000 characters) The CHAR value is limited to 255 characters (0RACLE8 2000) The long type is 2GB The Clob type is 4GB 1,CHR Syntax: Chr (x) Function: return in the database character set with numerical equivalence with the character of X. CHR and ASCII are a pair of inverse functions? After CHR conversion character after ASCII conversion and obtained the original word

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 wher e 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 WHE RE 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单步调试 关于oracle存储过程的若干问题备忘 1.在oracle中,数据表别名不能加as,如:

Oracle存储过程基本语法

Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracl e数据库去创建一个叫做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 t ype,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,变量带取值范围,后面接分号

oracle存储过程的详细列子说明加分析

文章分类:数据库存储过程创建语法: (1)无参 create or replace procedure 存储过程名as 变量1类型(值范围); 变量2类型(值范围); Begin Excepti on End; (2)带参 create or replace procedure 存储过程名(param1 in type,param2 out type)as 变量1类型(值范围); 变量2类型(值范围); Begin Select count(*) into 变量1 from 表A where 列名=param1 ; If (判断条件)then Select 列名into 变量2 from 表A where 列名=param1; Dbms_output.Put_line(打印信息'); Elseif (判断条件)then Dbms_output.Put_line(打印信息'); Else Raise 异常名(NO DATA FOUND); End if; Excepti on When others the n Rollback; End; 注意事项: 1,存储过程参数不带取值范围,in表示传入,out表示输出

2, 变量带取值范围,后面接分号 3, 在判断语句前最好先用count ( *)函数判断是否存在该条操作记录 4, 用select。。。into。。。给变量赋值 5,在代码中抛异常用raise+异常名 以命名的异常 命名的系统异常产生原因 ACCESS INTO NULL 未定义对象 CASE_NOT_FOUND CASE中若未包含相应的WHEN,并且没有设置 ELSE 时 COLLECTION_IS_NULL 集合元素未初始化 CURSER ALREADY OPEN 游标已经打开 DUP VAL ON INDEX 唯一索引对应的列上有重复的值 INVALID_CURSOR 在不合法的游标上进行操作 INVALID_NUMBER 内嵌的SQL语句不能将字符转换为数字 NO_DATA_FOUND 使用select into未返回行,或应用索引表未初始化的 TOO MANY ROWS 执行select into时,结果集超过一行ZERO_DIVIDE 除数为0 SUBSCRIPT_BEYOND_COUNT 元素下标超过嵌套表或VARRAY的最大值

SQL Server vs Oracle 存储过程语法转换1.2

一、SQL Server vs Oracle 简单语法比较 此为本人将ORACLE 函数和存储过程转换为SQL SERVER遇到的一些语法问题的经验总结,肯定不能包括所有的语法不同点。注:简单的语法异同 1、SQL SERVER变量必须以@开头。 2、SQL SERVER语句后不需要写分号结束符。 3、oracle变量类型number 可以修改为sql server的decimal 4、oracle变量类型varchar2 可以修改为sql server的varchar 5、SQL SERVER定义变量及传递参数,最好加上参数大小数值,例如:varchar(50) 5、SQL SERVER 不能用ROWID, ROWNUM (但可以用TOP代替) 6、oracle里的nvl函数,在SQL SERVER里使用ISNULL函数取代 7、SQL SERVER自定义函数不允许修改全局表数据(只允许修改自定义函数范围内表数据), 所以发生表修改的最好用存储过程实现而非函数。 1 create函数或存储过程异同点 Oracle 创建函数或存储过程一般是create or replace …… SQL SERVER 则是在创建之前加一条语句,先判断是否已经存在,如果存在删除已有的函数或存储过程。 函数语句 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[函数名]') and xtype in (N'FN', N'IF', N'TF')) drop function [dbo].[函数名] GO 存储过程 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[存储过程名]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[存储过程名]

oracle存储过程基本语法

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

oracle存储过程(语法实例)

Oracl e 存储过程学习资料(内部适用) 目录 Oracle 存储过程1 Oracle存储过程基础知识2 Oracle存储过程的基本语法3 关于Oracle存储过程的若干问题备忘5 1.在Oracle中,数据表别名不能加as。5 2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用 游标的话就另当别论了。5 3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。5 4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会 报错5 5.在存储过程中,关于出现null的问题6 6.Hibernate调用Oracle存储过程6 用Java调用Oracle存储过程总结6 一、无返回值的存储过程7 二、有返回值的存储过程(非列表)8 三、返回列表10 在存储过程中做简单动态查询11 一、本地动态SQL12 二、使用DBMS_SQL包14 Oracle存储过程调用Java方法16 Oracle高效分页存储过程实例17

Oracle存储过程基础知识 商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。 存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。这样的结果就是,代码存储一次但是能够被多个程序使用。 要创建一个过程对象(procedural object),必须有CREATE PROCEDURE 系统权限。如果这个过程对象需要被其他的用户schema 使用,那么你必须有CREATE ANY PROCEDURE 权限。执行procedure 的时候,可能需要excute权限。或者EXCUTE ANY PROCEDURE 权限。如果单独赋予权限,如下例所示: grant execute on MY_PROCEDURE to Jelly 调用一个存储过程的例子: execute MY_PROCEDURE( 'ONE PARAMETER'); 存储过程(PROCEDURE)和函数(FUNCTION)的区别。function有返回值,并且可以直接在Query中引用function和或者使用function的返回值。 本质上没有区别,都是PL/SQL 程序,都可以有返回值。最根本的区别是:存储过程是命令, 而函数是表达式的一部分。比如: select max(NAME) FROM 但是不能exec max(NAME) 如果此时max是函数。 PACKAGE是function,procedure,variables 和sql 语句的组合。package允许多个procedure使用同一个变量和游标。 创建procedure的语法: 可以使用create or replace procedure 语句,这个语句的用处在于,你之前赋予的excute 权限都将被保留。 IN, OUT, IN OUT用来修饰参数。 IN 表示这个变量必须被调用者赋值然后传入到PROCEDURE进行处理。 OUT 表示PRCEDURE 通过这个变量将值传回给调用者。 IN OUT 则是这两种的组合。

相关文档
最新文档