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/的一个级别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 所说,这可能就在顶部,介于 theIS和 first之间BEGIN,因为那是过程级DECLARE部分(它不需要显式DECLARE关键字)。

于 2012-10-22T10:39:21.100 回答