3

なぜサービスが Fehler(36,11): PL/SQL: ORA-00904: "FOUND_VP": invalid identifier に文句を言っているのかわかりません

変数は最初の開始時に宣言されています...クエリで直接変数を使用することはできませんか?

次の手順で保存しようとすると:

create or replace PROCEDURE fpwl_update_vp(
     my_zn IN NUMBER, my_verwaltung IN VARCHAR2 , my_variante IN NUMBER, my_vp IN NUMBER 
   ) IS



BEGIN

DECLARE
search_VP IFT_INFO_LAUF.VP%TYPE;
found_VP IFT_INFO_LAUF.VP%TYPE;
INFOversion number := 25;


BEGIN -- search SYFA_VP

          SELECT SYFA_VP
          INTO found_VP
          FROM FPWL_VP_MAPPING
          WHERE INFO_VP=search_VP ;


          exception
          when no_data_found then
           dbms_output.put_line ('Kein SYFA VP : Importiere aus SYFA');
          --found_VP:=:=cus_info25.pa_info_data.fn_insert_syfa_vp(my_vp,25);

          WHEN OTHERS THEN
          ROLLBACK;
          RETURN;
END; -- SYFA VP


-- Update VP
UPDATE IFT_INFO_LAUF
 SET vp = found_VP
WHERE id_kopf IN 
  (SELECT id_kopf 
    FROM ift_info_kopf 
    WHERE fahrtnummer= my_zn  
    AND verwaltung= my_verwaltung
    AND variante = my_variante
  )
;


  --COMMIT;
    EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;

END ;
4

3 に答える 3

5

あなたの問題は、found_VP が範囲外になることです。

「DECLARE」ブロックの内容を「IS」の直後に移動します。

create or replace PROCEDURE fpwl_update_vp(
 my_zn IN NUMBER, my_verwaltung IN VARCHAR2 , my_variante IN NUMBER, my_vp IN NUMBER 
) IS
  search_VP IFT_INFO_LAUF.VP%TYPE;
  found_VP IFT_INFO_LAUF.VP%TYPE;
  INFOversion number := 25;
BEGIN
  BEGIN -- search SYFA_VP

  etc
于 2012-10-22T09:13:43.247 に答える
0

ことを確認してください

FPWL_VP_MAPPING.SYFA_VP

と同じタイプです

IFT_INFO_LAUF.VP

そして、それを確認してください

SELECT SYFA_VP INTO found_VP FROM FPWL_VP_MAPPING WHERE INFO_VP=search_VP ;

複数の行を返しません。しかし、あなたが与えたエラーの場合はそうではないと思います。

于 2012-10-22T09:01:54.243 に答える
0

エラー メッセージは 36 行目でありfound_VP、コード サンプルの への参照は 18 行目であるため、実際に問題のあるコードの部分を省略しています。

スコープに問題があるようです。found_VP内側のブロック ( DECLARE/ BEGIN/の 1 つのレベル) で宣言しEND、親ブロックまたは同じレベルの別のブロックのいずれかで、そのブロックの外側で参照しています。問題は、あなたが選択している場所ではなく、found_VP投稿したコードを超えて後で再び参照しているため、変数が宣言されているブロックの外側です.

l_name実証するために、あなたが行ったように、内側のブロックで宣言します:

create or replace procedure p42 is
begin
    declare
        l_name all_tables.table_name%TYPE;
    begin
        select table_name
        into l_name        -- this reference is OK
        from all_tables
        where table_name = 'EMPLOYEES';
    end;

    select table_name
    into l_name            -- this reference errors
    from all_tables
    where table_name = 'JOBS';
end;
/

Warning: Procedure created with compilation errors.

show errors

Errors for PROCEDURE P42:

LINE/COL ERROR
-------- -----------------------------------------------------------------
12/2     PL/SQL: SQL Statement ignored
13/7     PLS-00201: identifier 'L_NAME' must be declared
14/2     PL/SQL: ORA-00904: : invalid identifier

外側のブロックにある行 13 に対してエラーが報告されていることに注意してください。スコープ内にあるため、内側のブロックで文句を言うことはありません。

したがって、適切なレベルで変数を宣言する必要があります。Colin 't Hart が言うように、これはプロシージャ レベルのセクションであるため (明示的なキーワードは必要ありません)、おそらくIS最初の と の間です。BEGINDECLAREDECLARE

于 2012-10-22T10:39:21.100 に答える