0

以下に示すようなクエリがあります。

TRUNCATE TABLE DNARTLOAD;
COMMIT;

.... <Cursor here> .... <do something>.....

tmp_future_phaseA := substr(tmp_phases,1,1);
tmp_future_phaseB := substr(tmp_phases,2,1);
tmp_future_phaseC := substr(tmp_phases,3,1);

INSERT INTO DNARTLOAD (LOADNAME,KVARATING,PHASE,FULLPHASE) VALUES 
(tmp_load_name, tmp_kvarating, tmp_future_phaseA, tmp_phase);

問題は、クエリが毎回tmp_phasesを正しく挿入できないことです。私が行っているのは、一時フェーズのサブストリング(nullになることはありません)を取得し、1番目、2番目、および3番目の文字を別のvarchar変数のセットに割り当てることです。それらが割り当てられたら、データをテーブルに挿入してコミットします。問題は、それが常に機能するとは限らないことです。常にtmp_future_phaseA、B、およびCを文字で埋めますが、tmp_phaseを挿入すると、nullが入力されたり、値が入力されたりすることがあります。

データ例:

tmp_phase = 'ABC'

tmp_futurephaseA = 'A'

tmp_futurephaseB = 'B'

tmp_futurephaseC = 'C'

時々私は以下を得るでしょう:

A  'ABC'

B 'ABC'

C 'ABC'

同じplsqlの間に、次の情報が表示されます。

A NULL

B NULL

C NULL

編集:質問のために追加:

LOOP
    tmp_future_phaseA := NULL;
    tmp_future_phaseB := NULL;
    tmp_future_phaseC := NULL;
    tmp_phases := NULL;

    FETCH C3 INTO tmp_load_name, tmp_kvarating, tmp_phases;
    EXIT WHEN C3%NOTFOUND;

IF LENGTH(tmp_phases) = 3 THEN
  tmp_kvarating := tmp_kvarating / 3;
END IF;

IF LENGTH(tmp_phases) = 2 THEN
  tmp_kvarating := tmp_kvarating /2;
END IF;

tmp_future_phaseA := substr(tmp_phases,1,1);
tmp_future_phaseB := substr(tmp_phases,2,1);
tmp_future_phaseC := substr(tmp_phases,3,1);

IF tmp_future_phaseA IS NOT NULL THEN
  INSERT INTO DNARTLOAD (LOADNAME,KVARATING,PHASE) VALUES (tmp_load_name, tmp_kvarating, tmp_future_phaseA);
END IF;

IF tmp_future_phaseB IS NOT NULL THEN
  INSERT INTO DNARTLOAD (LOADNAME,KVARATING,PHASE) VALUES (tmp_load_name, tmp_kvarating, tmp_future_phaseB);
END IF;

IF tmp_future_phaseC IS NOT NULL THEN
  INSERT INTO DNARTLOAD (LOADNAME,KVARATING,PHASE) VALUES (tmp_load_name, tmp_kvarating, tmp_future_phaseC);
END IF;  
4

1 に答える 1

1

「次の情報が表示される場合があります。...同じplsql中に次の情報が表示される場合があります。」

プログラムが機能する場合と機能しない場合があります。これは、データに問題があることを意味します。

より正確には、一部の州ではデータに正しく対応し、他の州では対応しないプログラムを作成しました。それを診断できる方法は絶対にありません。

したがって、あなたがする必要があるのはあなたのコードをデバッグすることです。デバッグ機能を提供する適切なIDEがある場合。それ以外の場合は、DBMS_OUTPUTのようなものを使用して、ループの各トリップの入力とその後の結果を表示し、プログラムが正しく処理していない値を理解できるようにする必要があります。

于 2012-09-07T21:13:01.423 に答える