cursor payment_cur is
select pay_serial_number,account_id,service_id from iutbs.payment;
------------后来打开cursor,
open payment_cur;
loop
fetch payment_cur into v_pay_serial,v_pay_account,v_pay_service
--------然后,见下面
select customer_id,decode(service_type,2,9,3,8,0),address_id,access_number
into v_customer_id,v_service_kind,v_address_id,v_access_number
from service
where service_id=v_pay_service
and service_seq_number=0;
--找不到用户信息就把customer_id付给一个序列!
exception
when no_data_found then
select error_sequence.nextval into v_sequence from dual;
v_customer_id:=v_sequence;
-------------------------
异常后执行把数据(service.customer,service.access_number,payment.service_id)插入了一个表中
在出现异常的时候,都是什么样的数据应该能插入表中?是不是根据service_id在service找不到数据,就插入异常表中啊?既然在service找不到数据,那可能有access_number值被找出来的可能吗?
可是这时,我查询插入异常的表发现access_number里面也插入了值?这个值是怎么来得啊?申明:access_number只有从service里取。
------------
写的太长。希望能得到回答!
select pay_serial_number,account_id,service_id from iutbs.payment;
------------后来打开cursor,
open payment_cur;
loop
fetch payment_cur into v_pay_serial,v_pay_account,v_pay_service
--------然后,见下面
select customer_id,decode(service_type,2,9,3,8,0),address_id,access_number
into v_customer_id,v_service_kind,v_address_id,v_access_number
from service
where service_id=v_pay_service
and service_seq_number=0;
--找不到用户信息就把customer_id付给一个序列!
exception
when no_data_found then
select error_sequence.nextval into v_sequence from dual;
v_customer_id:=v_sequence;
-------------------------
异常后执行把数据(service.customer,service.access_number,payment.service_id)插入了一个表中
在出现异常的时候,都是什么样的数据应该能插入表中?是不是根据service_id在service找不到数据,就插入异常表中啊?既然在service找不到数据,那可能有access_number值被找出来的可能吗?
可是这时,我查询插入异常的表发现access_number里面也插入了值?这个值是怎么来得啊?申明:access_number只有从service里取。
------------
写的太长。希望能得到回答!
解决方案 »
- 分组复杂查询
- 想起的一个关于group by 分组的问题~
- sql语句的问题
- 请问如何在Oracle触发器里调用一个外部Java程序?
- 求助!!!一条update语句!!
- ==============PLSQL Developer中的问题==================
- ★★★★各位高手帮忙看看,为什么新建的快照不能执行?●●●●
- 9i,使用manager console,用登录到management server,在managerment server中填写了我机器的ip或机器名,用sysman/oem_temp,提示我输入
- 放分!
- 在sql plus里面怎样用SELECT怎样取几千条记录的前十条?
- NT+ORACLE8I+MS cluster 如何实现?
- 请教一个简单问题
BEGIN
select customer_id,decode(service_type,2,9,3,8,0),address_id,access_number
into v_customer_id,v_service_kind,v_address_id,v_access_number
from service
where service_id=v_pay_service
and service_seq_number=0;
EXCEPTION
when no_data_found then
select error_sequence.nextval into v_sequence from dual;
v_customer_id:=v_sequence;
END;
select customer_id,decode(service_type,2,9,3,8,0),address_id,access_number
into v_customer_id,v_service_kind,v_address_id,v_access_number
from service
where service_id=v_pay_service
and service_seq_number=0;
这个语句的,当找不到符合条件的记录时会触发异常,但是注意你这条语句是循环执行的,所以当出现异常时(也就是找不到记录时),v_address_id,v_access_number这些变量的值其实是上一次执行该语句取到的值!
SQL> select * from aa;ID FID
-- ---
1 0
2 1
3 1
4 2
5 3
6 4
6 5SQL> set serveroutput on
SQL> declare
2 v_id varchar(2);
3 begin
4 select id into v_id from aa where id='0';
5 dbms_output.put_line('没有触发异常');
6 exception
7 when no_data_found then
8 dbms_output.put_line('触发异常');
9 end;
10 /
触发异常
SQL> set serveroutput on
SQL> declare
2 v_id varchar(2);
3 begin
4 select id into v_id from aa where id='1';
5 dbms_output.put_line('没有触发异常');
6 exception
7 when no_data_found then
8 dbms_output.put_line('触发异常');
9 end;
10 /
没有触发异常
一、在
open payment_cur;
loop
fetch payment_cur into v_pay_serial,v_pay_account,v_pay_service;
后你应该判断是否取到值了,比如向下面:
IF payment_cur%NOTFOUND THEN
--做为找到数据的处理
END IF;
三、我怀疑你的问题是因为没有判断NOTFOUND引起的,因为你在查询中作了这样的条件判断:
where service_id=v_pay_service,假如v_pay_service的值为空,也就等于:
where service_id=null而这样的语句是错误的。
现在我正在验证是不是 Lastdrop(空杯) 大哥(嘻嘻,先这样叫吧)所说的原因,数据现在还没有跑出来。
to : qiuyang_wang(小数点) ,我的过程是有payment NOTDATEFOUND的异常判断的,就是我粘贴的时候,少了。真是不好意思。让你费心了。
to:beckhambobo(beckham) 我的代码太长,不过,我疑惑的就是这个地方,所以没有把其它的地方贴出来。我在阐述一下我的疑惑,请帮我解答:
----------
select customer_id,decode(service_type,2,9,3,8,0),address_id,access_number
into v_customer_id,v_service_kind,v_address_id,v_access_number
from service
where service_id=v_pay_service
and service_seq_number=0;
--找不到用户信息就把customer_id付给一个序列!
exception
when no_data_found then
select error_sequence.nextval into v_sequence from dual;
v_customer_id:=v_sequence;
-----------------------
就是上面这段信息:我把异常的数据都插入了一个异常的表。我觉得由于异常产生的数据应该是这样的:customer_id是序列的值;service_id是payment里的service_id值,而access_number因为异常,应该是空值.可是,我现在在我的异常表里发现了,customer_id,service_id都是和我想的一样的值,可是access_number竟然也有值。我就想知道这个值是怎么插进入的?
2.我还想知道的一个问题是:异常出现和select customer_id,access_number from service中select字段的先后还有关系吗?就是如果,customer_id找不到值,就不管access_number是否有值,就直接跳到异常?还是也判断access_number是否有值,然后在跳到异常?
--------------------------------
真的谢谢大家的帮忙。^_^
异常是针对你的SELECT未找到相应的记录而触发的.再你将SELECT的字段的值插入到变量中之前,这些变量有没有清空过,如果没有,则当SELECT引起NO_DATA_FOUND触发时,这些变量的值还是上次取得的值.
第二个问题:
其实还是上面的回答,异常触发和SELECT中的字段先后没有关系,它是指整个SELECT语句是否能够得到记录.而不是你说的,看CURSOTMER_ID是否有值,再看ACCESS_NUMBER是否有值.
记住是整条SELECT语句.
谢谢你的回答,我清晰多了,真的感谢你。
1。我没有清空过数据,看来应该是上次的值了。我在改改过程重新跑一遍。
2。是我的同事说可能和顺序有关系,我当时觉得不是,可能我比较菜的原因,还是想问个清楚。
谢谢。我的是qq:12553159
如果不介意的话,
希望能和各位高手交个朋友。
当再次触发到异常情况下把该插入到表中。