oracle存储过程的基本语法 下载本文

1.基本结构

CREATE OR REPLACE PROCEDURE 存储过程名字 (

参数1 IN NUMBER, 参数2 IN NUMBER ) IS

变量1 INTEGER :=0; 变量2 DATE; BEGIN

END 存储过程名字 答:

--输出订单号及交易日期 Declare --定义参数

p_po_num_f number;(参数用P开头) p_po_num_t number;

--定义变量

l_po_num cux_po_headers_all.po_num%type;(变量用L开头) l_transaction_date

--定义常量

cux_po_headers_all.transaction_date%type;

c_desc varchar2(20) := '订单号: ';(常量用C开头)

--此游标用于获取参数范围内订单相关信息 (定义一个游标)

cursor c_header is

select cph.po_num, cph.transaction_date from cux.cux_po_headers_all cph where 1 = 1

and (cph.po_num between &p_po_num_f and &p_po_num_t);

(显式使用游标) begin

open c_header;--打开游标 (循环) loop

fetch c_header—提取游标

into l_po_num, l_transaction_date;

exit when c_header%notfound;(退出死循环)

dbms_output.put_line(c_desc || l_po_num || chr(13) ||

to_char(l_transaction_date, 'yyyy-mm-dd')); --chr(13)是换行符,tochar()是将输出结果转化为字符串 end loop;(结束循环)

close c_header;(关闭 游标) (隐式使用游标)

/*for c in c_header loop

dbms_output.put_line('订单号:' || c. po_num || chr(13) ||

to_char(c.transaction_date, 'yyyy-mm-dd')); end loop;*/ end;

注:隐式游标是Oracle为所有操纵语句(包括只返回单行数据的查询语句)自动声明和操

作的一种游标,显式游标是由用户声明和操作的一种游标。

显式游标操作过程主要包括:声明游标,打开游标,提取游标,关闭游标。 游标的作用及什么时候用游标?

答:1、pl/sql类似于C、C++,这类语言一次只能处理一条数据库记录,但是如果sql语句返回的结果集是多条的话,如果想用这类语言处理的话就要用到游标。

2、先把多条结果存入到游标中,再循环的一条一条取得(fecth)游标中的记录,取得一条处理一条。

3、综上所说,游标是在sql返回的结果集是多条数据的时候使用的,作用是让一次只能操作一条数据的高级语言,拥有处理多条数据的能力。

【总结】

(1)无论是隐式还是显式游标,都有属性: %found, %notfound, %isopen,%rowcount;

(2)隐式游标能操作单行数据,也能操作多行数据,只是逐个操作,多行数据必须用显式游标;

(3)隐式游标名称固定sql,显式游标名称要自定义;

(4)显式游标要通过fetch语句将游标中的值传递给变量,通常把该fetch语句放入loop循环,记得循环中要定义跳出循环条件;

(5)在使用显式游标时,cursor游标名(参数名 in参数数据类型),这种方式定义时,参数数据类型中不要指定长度,否则报错,比如cursor v_cur (m in varchar2(20))是错的,必须不指定长度,即cursor v_cur (m in varchar2)。

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;

答:declare --定义变量

l_count number := 0;--用于保存查询的总数

l_po_num cux_po_headers_all.po_num%type; --(变量用L开头)