2013-08-27 36 views
1

所以我创建了一对光标来存储正在加载到表中的数据。数据一次加载一次,我需要对整个数据集进行验证,而不仅仅是单个记录。所以会有像这样的数据(但它只会被加载个体而不是整体)空值加载到光标?

form_no | type 
--------------- 
5155-55 | -1 
5155-55 | -1 
5155-55 | 2 
5155-55 | 1 
     | 
4568-98 | -1 
4568-98 | -1 
4568-98 | -1 
4568-98 | 2 
4568-98 | 1 

3302-48 | 1 
3302-45 | 2 
3302-45 | -1 

所以然后游标采取总和或每种类型,然后配对它与一个独特的form_no。然后,在底部它被检查,以确保始终有一个1和-1与每个form_no(即form_no 5155-55具有至少一个1型和一种类型-1)

DECLARE 
error VARCHAR2(1) := 'N'; 

CURSOR XXX IS 
SELECT form_no, sum(type) as sum_type_neg 
    FROM my_table 
WHERE type = -1 
GROUP BY form_no; 

CURSOR YYY IS 
SELECT form_no, sum(type) as sum_type_pos 
    FROM my_table 
WHERE type = 1 
GROUP BY form_no; 

CURSOR ZZZ(xx_form_no VARCHAR2, yy_form_no VARCHAR2) IS 
SELECT form_no 
    FROM my_table 
WHERE form_no = xx_form_no 
    AND form_no = vv_form_no 
GROUP BY form_no; 

x_form XXX%ROWTYPE; 
y_form YYY%ROWTYPE; 
ZZZRow ZZZ%ROWTYPE; 

BEGIN 
OPEN XXX; 
LOOP 
    FETCH XXX 
    INTO x_form; 
    EXIT WHEN XXX%NOTFOUND; 

    OPEN YYY; 
    LOOP 
    FETCH YYY 
     INTO y_form; 
    EXIT WHEN YYY%NOTFOUND; 

    OPEN ZZZ(x_form.form_no, y_form.form_no); 
    LOOP 
     FETCH ZZZ 
     INTO ZZZRow; 
     EXIT WHEN ZZZ%NOTFOUND; 
     dbms_output.put_line('Distinct: ' || x_form.form_no); 
     dbms_output.put_line('SUM x: ' || x_form.sum_type_neg); 
     dbms_output.put_line('SUM y: ' || y_form.sum_type_pos); 
     dbms_output.put_line('----------------------------'); 
    END LOOP; 
    CLOSE ZZZ; 
    END LOOP; 
    CLOSE YYY; 
END LOOP; 
CLOSE XXX; 

IF x_form.sum_type_neg = O or y_form.sum_type_pos = 0 THEN 
    v_error_in_process := 'Y'; 
    dbms_output.put_line('ERROR MESSAGE'); 
ELSE 
    dbms_output.put_line('GREATE JOB'); 
END IF; 

END; 

输出将是这样

Distinct : 5155-55 
SUM x: -2 
SUM y:  1 
---------------------------- 
Distinct: 4568-98 
SUM x: -3 
SUM y:  1 
---------------------------- 
Distinct: 3302-48 
SUM x: -1 
SUM y:  1 
---------------------------- 
GREAT JOB! 

它的工作原理除了当form_no不具有-1或1
例输入伟大:

form_no | type 
--------------- 
5155-55 | -1 
5155-55 | -1 
5155-55 | 2 
5155-55 | 1 
     | 
4568-98 | -1 
4568-98 | -1 
4568-98 | -1 
4568-98 | 2 
4568-98 | 1 

3302-48 | 1 
3302-48 | 2 


注意form_no 3302-48没有-1。所以,那么输出会是这样

Distinct: 5155-55 
SUM x: -2 
SUM y:  1 
---------------------------- 
Distinct: 4568-98 
SUM x: -3 
SUM y:  1 
---------------------------- 
GREAT JOB! 

除了我希望它是这样

Distinct: 5155-55 
SUM x: -2 
SUM y:  1 
---------------------------- 
Distinct: 4568-98 
SUM x: -3 
SUM y:  1 
---------------------------- 
Distinct: 3302-48 
SUM x:  0 
SUM y:  1 
---------------------------- 
ERROR MESSAGE 

谁能告诉我怎么去这样做。我不确定一个游标是否可以接受空值(即,当没有1或-1时,则不会有任何内容加载到游标中)。

回答

2

实在是没有必要的PL/SQL处理的参与,则可以仅使用SQL达到预期的效果:

SQL> select col 
    2  , val 
    3 from (select form_no as "Distinct:" 
    4    , to_char(sum(case when type1 = -1 then type1 else 0 end)) as sumx 
    5    , to_char(sum(case when type1 = 1 then type1 else 0 end)) as sumy 
    6   from t1 
    7   group by form_no 
    8  ) 
    9 unpivot(
10  val for col in ("Distinct:", sumx, sumy) 
11 ) 
12 ; 

结果:

COL  VAL 
--------- ---------- 
Distinct: 5155-55 
SUMX  -2 
SUMY  1 

Distinct: 4568-98 
SUMX  -3 
SUMY  1 

Distinct: 3302-48 
SUMX  0 
SUMY  1 

9 rows selected 

注意。​​运算符已在Oracle 11g版本中引入,仅用于数据格式的上述查询中。如果您的Oracle版本早于11g,那么您可以使用PL/SQL根据需要进行子查询(内联视图)和格式输出。

SQLFiddle Demo