【问题标题】:Variable in UPDATE oracle in procedure : invalid identifier过程中 UPDATE oracle 中的变量:标识符无效
【发布时间】:2012-10-22 08:58:04
【问题描述】:

我不明白为什么服务会抱怨 Fehler(36,11):PL/SQL:ORA-00904:“FOUND_VP”:标识符无效

变量在第一个开始时声明... 是不是不能直接在查询中使用变量?

在尝试存储以下程序时:

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 ;

【问题讨论】:

    标签: oracle plsql plsqldeveloper


    【解决方案1】:

    您的问题是 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
    

    【讨论】:

      【解决方案2】:

      确保

      FPWL_VP_MAPPING.SYFA_VP
      

      类型相同
      IFT_INFO_LAUF.VP
      

      并确保

      SELECT SYFA_VP INTO found_VP FROM FPWL_VP_MAPPING WHERE INFO_VP=search_VP ;
      

      不返回多行。 但我怀疑您给出的错误是否属于这种情况。

      【讨论】:

        【解决方案3】:

        由于错误消息指的是第 36 行,而代码示例中对 found_VP 的引用位于第 18 行,因此您省略了实际存在问题的代码部分。

        您的范围似乎有问题;您在内部块中声明found_VPDECLARE/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 所说,这可能就在顶部,在 IS 和第一个 BEGIN 之间,因为那是过程级别的 DECLARE 部分(它不需要显式的 DECLARE 关键字) .

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多