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的select into语句

SQL SELECT INTO使用

SQL UNION 和 UNION ALL 操作符SQL SELECT INTO 语句SQL CREATE DATABASE 语句

Oracle 未找到多个 Select Into 语句的数据

将多个 SELECT INTO 结果合并为一个变量

将多个 CASE 语句合并为一个并 SELECT INTO 临时表