Select into 语句用于 null 或多个值
Posted
技术标签:
【中文标题】Select into 语句用于 null 或多个值【英文标题】:Select into statement for null or more than one value 【发布时间】:2018-05-07 05:27:47 【问题描述】:我被困在plsql
中,因为我有一个函数,如果只有值进入选择中,我必须更新一个表..
如果不来,那么不来,如果有多个,则必须更新和删除所有这些值。
在下面的函数中,如果第一次选择 null 值,则不应进行异常处理,应仅更新 CUSTOMER 表并仅从表 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;
【问题讨论】:
return
类型声明缺少其数据类型,并且该函数从不返回任何内容。也许你的意思是创建一个过程而不是一个函数。
您可以通过删除when others
异常处理程序来改进错误处理。默认行为(没有处理程序)是打印错误堆栈并失败,这可能是您想要的。
【参考方案1】:
您可以使用BULK COLLECT INTO
并遍历集合。
首先,你必须声明(或使用一些现有的)集合类型并创建该类型的变量:
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 中删除 谢谢.. 还有一个疑问 SELECT to_participant_key BULK COLLECT INTO to_participant_key1 FROM TABLE2 WHERE FROM_PARTICIPANT_KEY = from_PARTICIPANT_KEY1;什么都不会返回然后它会去异常处理吗?如何从异常处理中排除任何语句.. 如果它不返回任何记录,那么 l_participant_keys.COUNT 将等于 0;它不会进入 EXCEPTION WHEN 块以上是关于Select into 语句用于 null 或多个值的主要内容,如果未能解决你的问题,请参考以下文章
SQL UNION 和 UNION ALL 操作符SQL SELECT INTO 语句SQL CREATE DATABASE 语句