2017-03-29 14 views
0

Oracle PL/SQLの関数を操作する際に問題が発生しています。END LOOP間違った式PL/SQL

create or replace FUNCTION FX_A (IVI NUMBER) 
RETURN ListadoStrings 
AS 
    datos ListadoStrings; 
    dato VARCHAR2(4000); 
    idx NUMBER; 
BEGIN 
    datos := ListadoStrings(); 
    BEGIN 
     FOR prog IN (
      SELECT TCPR.DES 
      FROM TIVI TVIS 
      JOIN TICPR TCPR ON (TCPR.PRO = TVIS.PRO AND TCPR.CAT = TVIS.CAT AND TCPR.TIP = TVIS.TIP) 
      WHERE TVIS.IVI = IVI 
     ) LOOP 
      datos.extend; 
      datos(datos.count) := prog; 
     END LOOP; 
    END; 

    BEGIN 
     FOR tarea IN (
      SELECT TTAR.DES 
      FROM TIVI TVIS 
      JOIN TITAR TBTAR ON TBTAR.IVI = TVIS.IVI 
      JOIN TMTAR TTAR ON TTAR.ITAR = TBTAR.ITAR 
      WHERE TVIS.IVI = IVI 
     ) LOOP 
      datos.extend; 
      datos(datos.count) := tarea; 
     END LOOP; 
    END; 

    return datos; 
END FX_A; 

私はこのスクリプトを実行すると、私は応答を取得:コンパイラのログを確認

エラーをコンパイル

機能FX_DATOSVISITAここ

コードです

そしてコンパイラのログで私は参照してください:

エラー(17,13):PL/SQL:ステートメント

を無視エラー(17,37):PLS-00382:式が

エラー(30、間違ったタイプのものであり13):PL/SQL:無視ステートメント

エラー(30,37):PLS-00382:式が間違っているタイプのものであり

影響を受ける行は両方とも "END LOOP;"です。ライン。

私を助けることができますか? ありがとうございました!

EDIT 1:

[OK]を、今私はすべてのエラーを持っていないが、関数が何も返さない:

create or replace FUNCTION FX_A (IVI NUMBER) 
RETURN ListadoStrings 
AS 
    datos ListadoStrings; 
    dato VARCHAR2(4000); 
    idx NUMBER; 
BEGIN 
    datos := ListadoStrings(); 
    BEGIN 
     FOR prog IN (
      SELECT TCPR.DES as des 
      FROM TIVI TVIS 
      JOIN TICPR TCPR ON (TCPR.PRO = TVIS.PRO AND TCPR.CAT = TVIS.CAT AND TCPR.TIP = TVIS.TIP) 
      WHERE TVIS.IVI = IVI 
     ) LOOP 
      DBMS_OUTPUT.PUT_LINE(prog.des); 
      datos.extend; 
      datos(datos.count) := prog.des; 
     END LOOP; 
    END; 

    BEGIN 
     FOR tarea IN (
      SELECT TTAR.DES as des 
      FROM TIVI TVIS 
      JOIN TITAR TBTAR ON TBTAR.IVI = TVIS.IVI 
      JOIN TMTAR TTAR ON TTAR.ITAR = TBTAR.ITAR 
      WHERE TVIS.IVI = IVI 
     ) LOOP 
      DBMS_OUTPUT.PUT_LINE(tarea.des); 
      datos.extend; 
      datos(datos.count) := tarea.des; 
     END LOOP; 
    END; 

    return datos; 
END FX_A; 

私はDBMS_OUTPUT.PUT_LINEの結果(tarea.des)を見ることができます; FTWコンソールではなく、関数の戻りは唯一の「ART_MOVIL.VISITA_DATOS(」

あなたは?

+2

変数を 'datos(datos.count):= prog.des 'と' datos(datos.count):= tarea.des'に変更してみてください。行のタイプ。 –

+0

@HepCあなたは編集をチェックすることができますか? –

+0

投稿した出力、 '' ART_MOVIL.VISITA_DATOS( "'、意味がありません。更新された関数がデータを集めて返さなければならないというデータがある。それがない場合は、ここに投稿していないことをしていることがあります。したがって、私たちがあなたを助けるためにできることは何もありません。 TYPEとTABLEの定義とサンプルデータを使って再現可能なテストケースを投稿すると、さらに役立つかもしれません。 – APC

答えて

0

代替実装を助けることができる。そして、それらを一緒にsquoosh地元の収集に収集一括でループを交換している。セットの操作!

create or replace FUNCTION FX_A (IVI NUMBER) 
RETURN ListadoStrings 
AS 
    datos1 ListadoStrings; 
    datos2 ListadoStrings; 
    datos ListadoStrings; 
BEGIN 
    datos := ListadoStrings(); 

    SELECT TCPR.DES 
    bulk collect into datos1 
    FROM TIVI TVIS 
    JOIN TICPR TCPR ON (TCPR.PRO = TVIS.PRO AND TCPR.CAT = TVIS.CAT AND TCPR.TIP = TVIS.TIP) 
    WHERE TVIS.IVI = IVI; 

    SELECT TTAR.DES 
    bulk collect into datos2 
    FROM TIVI TVIS 
    JOIN TITAR TBTAR ON TBTAR.IVI = TVIS.IVI 
    JOIN TMTAR TTAR ON TTAR.ITAR = TBTAR.ITAR 
    WHERE TVIS.IVI = IVI; 

    datos := datos1 multiset union all datos2; 

    return datos; 
END FX_A; 
+0

編集を確認できますか? –

関連する問題