Function Select into语句用于null或多个值
我被困在Function Select into语句用于null或多个值,function,plsql,select-into,Function,Plsql,Select Into,我被困在plsql,因为我有一个生成函数,在这个函数中,如果只有值进入select into,我必须更新一个表 如果没有,那么没有,如果有多个,那么必须更新和删除所有这些值 在下面的函数中,如果第一个select into null值出现,则不应转到异常处理。应仅更新客户表,并仅从表3中删除。如果出现一个或多个值,则对每个值执行所有更新和删除操作 create or replace FUNCTION FUNCTION_NAME ( from_PARTICIPANT_KEY1 IN
plsql
,因为我有一个生成函数,在这个函数中,如果只有值进入select into,我必须更新一个表
如果没有,那么没有,如果有多个,那么必须更新和删除所有这些值
在下面的函数中,如果第一个select into null值出现,则不应转到异常处理。应仅更新客户表,并仅从表3中删除。如果出现一个或多个值,则对每个值执行所有更新和删除操作
create or replace FUNCTION FUNCTION_NAME (
from_PARTICIPANT_KEY1 IN NUMBER
)
RETURN
IS
to_participant_key1 NUMBER (11);
BEGIN
SELECT to_participant_key
INTO to_participant_key1
FROM TABLE2
WHERE FROM_PARTICIPANT_KEY = from_PARTICIPANT_KEY1;
UPDATE CUSTOMERS C
SET C.CUSTOMER_STATUS_CD =
NVL (
(SELECT old_status_cd
FROM TABLE1
WHERE PARTICIPANT_UID = from_PARTICIPANT_KEY1
AND participant_cd = 'CUSTOMER'),
C.CUSTOMER_STATUS_CD
)
WHERE C.CUSTOMER_UID = from_PARTICIPANT_KEY1;
UPDATE subscribers C
SET C.STATUS_CD =
NVL (
(SELECT old_status_cd
FROM TABLE1
WHERE PARTICIPANT_UID = to_participant_key1
AND participant_cd = 'SUBSCRIBER'),
C.STATUS_CD
)
WHERE C.account_no = to_participant_key1;
DBMS_OUTPUT.PUT_LINE ('Delete TABLE1 rows');
DELETE FROM TABLE3
WHERE PARTICIPANT_UID = from_PARTICIPANT_KEY1 AND participant_cd = 'CUSTOMER';
DELETE FROM TABLE1
WHERE PARTICIPANT_UID = to_PARTICIPANT_KEY1 AND participant_cd = 'SUBSCRIBER';
COMMIT;
EXCEPTION -- exception handlers begin
WHEN NO_DATA_FOUND THEN -- handles 'division by zero' error
dbms_output.put_line('Customer not found ' || from_PARTICIPANT_KEY1);
WHEN OTHERS THEN -- handles all other errors
dbms_output.put_line('Some other kind of error occurred.');
END;
您可以使用
批量收集到
中,并对收集进行迭代
首先,必须声明(或使用某些现有)集合类型并创建此类型的变量:
TYPE participant_keys is table of number (11);
l_participant_keys participant_keys;
然后,您的查询将更改为:
SELECT to_participant_key
BULK COLLECT INTO to_participant_key1
FROM TABLE2
WHERE FROM_PARTICIPANT_KEY = from_PARTICIPANT_KEY1;
如果查询不返回任何记录,则可以使用COUNT
检查:
if l_participant_keys.COUNT = 0 then
-- update only CUSTOMER table and only delete from table 3
else
FOR I IN l_participant_keys.FIRST .. l_participant_keys.LAST LOOP
--use l_participant_keys(i) do all update and delete for each value
END LOOP;
end if;
但如果select into不返回任何值,则不应转到异常处理,只更新CUSTOMER表,只从表3中删除CHANKS。。如果选择从表2中批量收集至参与者密钥1,则还有一个疑问,其中从参与者密钥=从参与者密钥1;将不返回任何内容,然后它将转到异常处理,对吗?如何从异常处理中排除任何语句。如果它不返回任何记录,则l_participant_keys.COUNT将等于0;当
return
类型声明缺少其数据类型时,它不会进入异常,并且函数从不返回任何内容。也许您的意思是创建一个过程而不是函数。您可以通过删除异常处理程序来改进错误处理。默认行为(没有处理程序)是打印错误堆栈并失败,这可能是您在这里想要的。