内容发布更新时间 : 2024/11/19 19:44:12星期一 下面是文章的全部内容请认真阅读。
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开头)