如何在SQL中的for循环内创建动态变量名

沙伊克沙

我是sql的新手。不是专家。我有一个proc,在这里我需要使用键表ord_item从两个表中提取一些值,而product_ext_data view_id是键。

我想将product_ext_data中的param_value提取到变量d_DestNumber1,d_DestNumber2 ... d_DestNumber10中(最多10个值)

为此,我使用for循环遍历游标输出并将每个param_value分配给每个变量。我不确定如何基于for循环中的i值动态创建变量名

               CREATE OR REPLACE PROCEDURE C1_REMOVEFNFDATA(v_soid                  VARCHAR2,
                    C1_REMOVEFNFDATA_cv IN OUT cv_types.customer_tp) IS

   l_count NUMBER := 0;
 d_DestNumber1 PRODUCT_EXT_DATA.param_value%TYPE;
 d_DestNumber2 PRODUCT_EXT_DATA.param_value%TYPE;
  d_DestNumber3 PRODUCT_EXT_DATA.param_value%TYPE;
 d_DestNumber4 PRODUCT_EXT_DATA.param_value%TYPE;
 d_DestNumber5 PRODUCT_EXT_DATA.param_value%TYPE;
 d_DestNumber6 PRODUCT_EXT_DATA.param_value%TYPE;
 d_DestNumber7 PRODUCT_EXT_DATA.param_value%TYPE;
 d_DestNumber8 PRODUCT_EXT_DATA.param_value%TYPE;
 d_DestNumber9 PRODUCT_EXT_DATA.param_value%TYPE;
d_DestNumber10 PRODUCT_EXT_DATA.param_value%TYPE;

    CURSOR c_dest_num IS
   SELECT P.VIEW_ID as view_id, P.param_value as destination_number
    FROM ORD_ITEM o, 
     PRODUCT_EXT_DATA p
    WHERE o.service_order_id = to_number(v_soid)
  AND O.ITEM_ACTION_ID IN (30) -- delete
  AND P.VIEW_ID          = O.VIEW_ID
  AND P.PARAM_ID         = 5100
  AND o.is_cancelled     = 0;
  d_dest_num c_dest_num%rowtype;

  BEGIN
   SELECT count(*) 
  INTO l_count
    FROM ORD_ITEM o, 
     PRODUCT_EXT_DATA p
  WHERE o.service_order_id = to_number(v_soid)
 AND o.member_type      = 10   -- product
 AND O.ITEM_ACTION_ID IN (30) -- delete
 AND P.VIEW_ID          = O.VIEW_ID
 AND P.PARAM_ID         = 5100
 AND o.is_cancelled     = 0;

    IF(l_count != 0) THEN

     OPEN c_dest_num;
   LOOP FETCH c_dest_num INTO d_dest_num;
   EXIT WHEN c_dest_num%NOTFOUND;

    for i in 1 .. l_count
   LOOP
   d_DestNumber+i := d_dest_num.destination_number;

   END LOOP;
   END LOOP;
   CLOSE c_dest_num;
   END IF;



  OPEN C1_REMOVEFNFDATA_CV FOR 
   SELECT l_count AS FnfRemoveCompCount,
    d_DestNumber1 AS DestNumber1,
    d_DestNumber2 AS DestNumber2,
    d_DestNumber3 AS DestNumber3,
    d_DestNumber4 AS DestNumber4,
    d_DestNumber5 AS DestNumber5,
    d_DestNumber6 AS DestNumber6,
    d_DestNumber7 AS DestNumber7,
    d_DestNumber8 AS DestNumber8,
    d_DestNumber9 AS DestNumber9,
    d_DestNumber10 AS DestNumber10,
    FROM DUAL;

   END;
斯巴兰丁

您可以使用数组而不是多个变量。在您的声明部分中编写:

  type DestNumber is varray(10) of PRODUCT_EXT_DATA.param_value%TYPE;
  --Initializes the array
  d_DestNumber DestNumber := DestNumber(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

然后,您FOR ... LOOP可以使用:

d_DestNumber(i) := d_dest_num.destination_number;

我不完全理解最终光标中d_DestNumbers的用法,但我希望您可以利用我的答案;-)

您可以在以下问题中找到有关数组的许多有用信息:Oracle PL / SQL-如何创建简单的数组变量?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章