そこで、テーブルにロードされるデータを格納するためのカーソルをいくつか作成しました。データは一度に 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 とペアにします。次に、各 form_no に常に 1 と -1 があることを確認します (つまり、form_no 5155-55 には、少なくとも 1 つのタイプ 1 と 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
誰かがこれを行う方法を教えてください。カーソルが null 値を取り込めるかどうかはわかりません (つまり、1 または -1 がない場合、カーソルにロードするものは何もありません)。