Stored procedures PLS-00103:在预期以下情况之一时遇到符号“文件结束”:=(@%;

Stored procedures PLS-00103:在预期以下情况之一时遇到符号“文件结束”:=(@%;,stored-procedures,dynamic,oracle11g,plsqldeveloper,execute-immediate,Stored Procedures,Dynamic,Oracle11g,Plsqldeveloper,Execute Immediate,我试图动态地执行一个存储过程,因为我根据一个简单的数字得到了很多存储过程,所以我创建了另一个过程来执行,但我一直得到问题标题上的错误,下面是我的过程: PROCEDURE P_EXEC_REG(p_Register IN VARCHAR2, p_LineBuff IN VARCHAR2, p_User IN VARCHAR2) IS l_Procedure VARCHAR2(50); l_Sentence VARCHAR2(500); BEGIN l_Pro

我试图动态地执行一个存储过程,因为我根据一个简单的数字得到了很多存储过程,所以我创建了另一个过程来执行,但我一直得到问题标题上的错误,下面是我的过程:

PROCEDURE P_EXEC_REG(p_Register IN VARCHAR2, p_LineBuff IN VARCHAR2, p_User IN VARCHAR2) IS  

  l_Procedure   VARCHAR2(50);
  l_Sentence    VARCHAR2(500);

BEGIN    
  l_Procedure := 'P_REG_' || TRIM(p_Register);
  l_Sentence := 'BEGIN CTS.PK_INTEGRATE_MANIFESTO.' || l_Procedure || '(:A, :B); END;';
  EXECUTE IMMEDIATE l_Sentence
  USING IN p_LineBuff, p_User;    
END;
由于我们有数百个过程,使用if语句是一件痛苦的事情,希望有人能在这方面帮助我,同时,我会告诉你我是如何称呼它的:

PROCEDURE P_LOAD_FILE(p_Linebuff IN VARCHAR2, p_User IN VARCHAR2) IS

l_Register        VARCHAR2(3);

BEGIN
    BEGIN
       SELECT SUBSTR(p_Linebuff,1,3)
       INTO   l_Register
       FROM   DUAL;                 
    EXCEPTION
         WHEN NO_DATA_FOUND THEN
            --p_result := false;
            NULL;
    END;
    CTS.PK_INTEGRATE_MANIFESTO.P_EXEC_REG(l_Register, p_Linebuff, p_User);

    EXCEPTION
      WHEN OTHERS THEN
      NULL;         
END;

谢谢大家,我找到了这个问题的答案,多亏了@John Heller的评论,通过这个命令我可以注意到它实际上正在执行,但是当我发送动态参数(isl_寄存器)时,我没有检查空值,所以它直接直接执行,最后是一个带有空参数的过程。现在看起来像这样:

PROCEDURE P_LOAD_FILE(p_Linebuff IN VARCHAR2, p_User IN VARCHAR2, p_Error OUT BOOLEAN, p_Message OUT VARCHAR2) IS

  l_MessageLevel    NUMBER(1);
  l_Register        VARCHAR2(3);
  l_Command         VARCHAR2(50);
  l_Procedure       VARCHAR2(4000);
  l_Error           NUMBER(1);

  BEGIN              

  IF p_Linebuff IS NOT NULL OR p_Linebuff <> '' THEN
        BEGIN
           SELECT SUBSTR(p_Linebuff,1,3)
           INTO   l_Register
           FROM   DUAL;

           IF LENGTH(TRIM(l_Register)) = 3 THEN
              P_EXEC_REG(l_Register, p_Linebuff, p_User, l_Error, p_Message);
           END IF;               
        EXCEPTION
             WHEN NO_DATA_FOUND THEN
                NULL;
        END;
    END IF;

  EXCEPTION
  WHEN OTHERS THEN
      p_Error := TRUE;
      p_Message := 'Sucedio un error al procesar el archivo.';      
  END;

谢谢你的帮助,如果这是一个愚蠢的问题,我也很抱歉:

在execute immediate之前添加dbms\u output.put\u linel\u语句,并向我们显示最后一行调用的语句。好的,这就是我从该语句concontando a la base de datos Manifiestos\u Lazaro中得到的。BEGIN CTS.PK\u INTEGRATE\u MANIFESTO.p\u REG\u 900:p\u LineBuff,:p\u User;END;El proceoha terminado.Desconectando de la base de datos Manifiestos_Lazaro.我会翻译这部分,它说:连接到数据库Manifiestos_Lazaro.开始CTS.PK_INTEGRATE_Manifiesto.P_REG_900:P_LineBuff,:P_User;END;进程已完成。断开与数据库Manifiestos_Lazaro的连接