我是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] 删除。
我来说两句