将多行提取到变量

时间:2015-04-27 13:06:47

标签: sql oracle plsql

我正在尝试获取多个唯一帐户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

获取预期的行数。

请解释我做错了什么。

2 个答案:

答案 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语句中保存多个值。