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-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 がない場合、カーソルにロードするものは何もありません)。

4

1 に答える 1