我正在尝试获取多个唯一帐户ID(transactions.ID)并存储在Variable v_Trxn中。问题是查询计数返回不正确。预期结果为300485行。
DECLARE
l_Partition transactions.Partitionkey%TYPE;
v_Trxn transactions.ID%TYPE;
l_Count number;
CURSOR v_Trxn_cur IS
SELECT ID
FROM transactions
WHERE Partitionkey > l_Partition;
BEGIN
SELECT dl_common.Get_Partitionkey(aInstitutionId => DL_COMMON.Get_InstitutionId , aDate => add_months(sysdate,-4)) INTO l_Partition FROM Dual;
OPEN v_Trxn_Cur;
LOOP
FETCH v_Trxn_Cur INTO v_Trxn;
EXIT WHEN v_Trxn_Cur%NOTFOUND;
END LOOP;
SELECT COUNT(UNIQUE(ID)) INTO l_Count FROM transactions WHERE ID In v_Trxn;
DBMS_OUTPUT.PUT_LINE(l_Count || ' Number of Unique Sernos');
CLOSE v_Trxn_Cur;
End;
输出:1 Number of Unique Sernos
如果我将partitionkey直接放入WHERE子句中,我会得到预期的行数。
SELECT
dl_common.Get_Partitionkey(aInstitutionId => DL_COMMON.Get_InstitutionId,
aDate => add_months(sysdate, -4)) PARTITION
FROM Dual;
返回:PARTITION 2914365
SELECT
COUNT(UNIQUE(ID)) C_COUNT
FROM transactions C
WHERE C.Partitionkey > 2914365
返回:C_COUNT 300485
获取预期的行数。
请解释我做错了什么。
答案 0 :(得分:2)
您反复在标量变量中选择一个ID。它一次永远不会超过一个值。在循环的第一次迭代之后,您的变量保存游标查询返回的第一个ID(由于您没有order-by子句,因此它是不确定的)。在第二次迭代之后,您的变量保存游标查询返回的第二个ID。它不会,也不能同时保持这两个值。
要保存多个值,您需要批量选择a collection type,如果您真的想将其用作部分,则需要在架构级别(即SQL类型,而不是PL / SQL类型)进行声明稍后的SQL查询。
但是,在集合中存储数十万个值会占用大量内存。一旦你拥有了这些价值,你就不知道你真正想要做什么,不清楚这是否只是你需要付出的代价;如果你可以批量完成你的工作(例如,一次1000个ID;如果适当的逐行处理;或者如果你真的想要一个连接作为更大的查询的一部分,而不是将它们作为PL /完全是SQL变量。
答案 1 :(得分:0)
为了这个目的,你需要使用VARRAY或NESTED表。
You can hold multiple values like this-
Type var_dnames IS VARRAY(1000) transactions.ID%TYPE;
v_Trxn var_dnames;
现在" v_Trxn"可以从fetch语句中保存多个值。