Como executar procedure oracle em um arquivo .sql

Tenho esse script dentro de um arquivo de nome xxx.sql

como faço a chamada desse arquivo para ser executado no java?

DECLARE

   PROCEDURE P_GERA_LOG(P_TEXTO IN VARCHAR2)
   IS
   BEGIN
      DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE, 'DD/MM/YY HH24:MI:SS')||' - '||P_TEXTO);
   END P_GERA_LOG;  
  
   PROCEDURE SLEEP(P_SEGUNDOS IN INT) IS
      V_NOW DATE := SYSDATE;
   BEGIN
      LOOP
         EXIT WHEN SYSDATE >= V_NOW + (P_SEGUNDOS * (1/86400));
      END LOOP;   
   END SLEEP;
END;
/
DISCONNECT;
EXIT;
/

6.3 Using JDBC CallableStatements to Execute Stored Procedures

acho que com o fonte fica mais claro o meu “problema”:

esse arquivo xxx.sql possui o script que postei anteriormente, mas não consigo fazê-lo executar chamando-o dessa forma:

public class EnvioXXXXX {

public static void main(String[] args) throws ClassNotFoundException, SQLException {
	
	String scriptSQL = "C:\\xxx.sql";		

	Class.forName("oracle.jdbc.driver.OracleDriver");
	try (Connection con = DriverManager.getConnection(
			"jdbc:oracle:thin:@xxx.xx.x.xxx:1521:RAC3", "xxxx",	"xxxx");
			Statement stmt = con.createStatement();) {
		
		regerarOcorren(con, scriptSQL);

	} catch (SQLException e) {
		e.printStackTrace();
	}		
}
	
private static void ......(Connection con, String scriptSQL) {
	try {
		ScriptRunner sr = new ScriptRunner(con);
		Reader reader = new BufferedReader(new FileReader(scriptSQL));
		sr.runScript(reader);
	} catch (Exception e) {
		System.err.println("Erro na execucao ...." + e.getMessage());
	}
}

}

Poderiam me ajudar a entender onde estou errando, por favor?

Dá algum erro? E de onde é esse ScriptRunner?

Dá erro pq o meu exemplo não se aplica, é apenas para mostrar a minha intenção de execução. Dentro do arquivo xxx.sql tenho esse script:

DECLARE

   PROCEDURE P_GERA_LOG(P_TEXTO IN VARCHAR2)
   IS
   BEGIN
      DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE, 'DD/MM/YY HH24:MI:SS')||' - '||P_TEXTO);
   END P_GERA_LOG;  
  
   PROCEDURE SLEEP(P_SEGUNDOS IN INT) IS
      V_NOW DATE := SYSDATE;
   BEGIN
      LOOP
         EXIT WHEN SYSDATE >= V_NOW + (P_SEGUNDOS * (1/86400));
      END LOOP;   
   END SLEEP;
END;
/
DISCONNECT;
EXIT;
/

Se dentro do arquivo xxx.sql tivesse um SELECT, INSERT ou UPDATE funcionaria. A procedure do arquivo não está armazenada na base de dados (banco) quero executá-la apartir do arquivo xxx.sql. É possível fazer dessa forma?

ScriptRunner (https://ibatis.apache.org/docs/java/dev/com/ibatis/common/jdbc/ScriptRunner.html)

Link com um exemplo fazendo exatamente o que vc quer: https://mkyong.com/jdbc/jdbc-callablestatement-stored-procedure-in-parameter-example/

no arquivo XXXX.sql tenho isso:

DECLARE
   PROCEDURE P_GERA_LOG(P_TEXTO IN VARCHAR2)
   IS
   BEGIN
      DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE, 'DD/MM/YY HH24:MI:SS')||' - '||P_TEXTO);
   END P_GERA_LOG;
   PROCEDURE SLEEP(P_SEGUNDOS IN INT) IS
      V_NOW DATE := SYSDATE;
   BEGIN
      LOOP
         EXIT WHEN SYSDATE >= V_NOW + (P_SEGUNDOS * (1/86400));
      END LOOP;   
   END SLEEP;
   PROCEDURE P_GERA_OCOREN_NATURA (
      P_ID                    IN   NUMBER,
      P_CAMINHO_ARQUIVO       IN   VARCHAR2 := NULL,
      P_NOME_ARQUIVO          IN   VARCHAR2 := NULL,
      P_FORMATO_ARQUIVO       IN   VARCHAR2 := NULL,
      P_COMPLEMENTO_ARQUIVO   IN   VARCHAR2 := NULL,
      P_EXTENSAO_ARQUIVO      IN   VARCHAR2 := NULL
   )
   IS   
      CURSOR C_CLIENTES
      IS
      SELECT 
         CE.CAIXA_POSTAL_REMETENTE AS ID_REMETENTE,
         CE.CAIXA_POSTAL_DESTINATARIO AS ID_DESTINATARIO,
         PES.ID_PESSOA AS ID_CLIENTE,
         PES.NM_PESSOA,
         PES.NR_IDENTIFICACAO
      FROM 
         CLIENTES_EDIS CE, 
         LMS_PD.PESSOA PES
      WHERE
         1 = 1
         AND PES.NR_IDENTIFICACAO = LPAD(CE.CLIB_PESS_ID_MATRIZ, 14, '0')
         AND CE.CLIB_PESS_ID_MATRIZ = P_ID;
      R_CLIENTES             C_CLIENTES%ROWTYPE;
      CURSOR DOCS IS
      SELECT
         TMP.*
      FROM
         (
            SELECT
               ROW_NUMBER() OVER(ORDER BY DS.ID_FILIAL_ORIGEM, DS.ID_DOCTO_SERVICO) AS RN,
               DS.ID_DOCTO_SERVICO,
               R.ID_DEVEDOR,
               CT.TP_FRETE,
               DS.ID_FILIAL_ORIGEM,
               PF.NR_IDENTIFICACAO AS CNPJ_FILIAL,
               CT.BL_INDICADOR_EDI,
               PES_REM.NR_IDENTIFICACAO AS CNPJ_REMETENTE,
               PES_DES.NR_IDENTIFICACAO AS CNPJ_DESTINATARIO               
            FROM
               (
                  SELECT
                     PES.ID_PESSOA
                  FROM 
                     CLIENTES_EDIS_FILIAIS CEF
                     JOIN LMS_PD.PESSOA PES ON (PES.NR_IDENTIFICACAO = LPAD(CEF.CLIB_PESS_ID_FILIAL, 14, '0'))
                  WHERE 
                     CEF.CLIB_PESS_ID_MATRIZ = P_ID
               ) TBL,    
               EDI_CARGA.TMP_NATURA_REGEN R,
               LMS_PD.DOCTO_SERVICO DS,
               LMS_PD.CONHECIMENTO CT,
               LMS_PD.PESSOA PF,
               LMS_PD.PESSOA PES_REM,
               LMS_PD.PESSOA PES_DES
            WHERE
               1 = 1
               AND R.ID_DEVEDOR = TBL.ID_PESSOA
               AND DS.ID_DOCTO_SERVICO = R.ID_DOCTO_SERVICO
               AND CT.ID_CONHECIMENTO = DS.ID_DOCTO_SERVICO
               AND PF.ID_PESSOA = DS.ID_FILIAL_ORIGEM
               AND PES_REM.ID_PESSOA = DS.ID_CLIENTE_REMETENTE
               AND PES_DES.ID_PESSOA = DS.ID_CLIENTE_DESTINATARIO
               AND R.DT_GERACAO IS NULL
         ) TMP
      WHERE
         1 = 1
      ORDER BY
         TMP.RN;      
      CURSOR C_EVENTOS(P_ID_DOCTO_SERVICO IN NUMBER) IS
      SELECT
         TMP.*,
         CASE
            WHEN TMP.ID_DOC_NF_REENTREGA IS NOT NULL THEN
               (
                  SELECT
                     SUBSTR(MAX(TRIM(DC.DS_VALOR_CAMPO)),1,3) 
                  FROM
                     LMS_PD.DADOS_COMPLEMENTO DC,
                     LMS_PD.INFORMACAO_DOCTO_CLIENTE IDC
                  WHERE
                     1 = 1
                     AND DC.ID_CONHECIMENTO = TMP.ID_DOC_NF_REENTREGA
                     AND IDC.ID_INFORMACAO_DOCTO_CLIENTE = DC.ID_INFORMACAO_DOCTO_CLIENTE
                     AND UPPER(IDC.DS_CAMPO) LIKE '%NATURA%'   
                     AND UPPER(IDC.DS_CAMPO) LIKE '%CONTROLE%'    
               )         
            WHEN TMP.ID_DOC_NF_DEVOLUCAO IS NOT NULL THEN
               (
                  SELECT
                     SUBSTR(MAX(TRIM(DC.DS_VALOR_CAMPO)),1,3) 
                  FROM
                     LMS_PD.DADOS_COMPLEMENTO DC,
                     LMS_PD.INFORMACAO_DOCTO_CLIENTE IDC
                  WHERE
                     1 = 1
                     AND DC.ID_CONHECIMENTO = TMP.ID_DOC_NF_DEVOLUCAO
                     AND IDC.ID_INFORMACAO_DOCTO_CLIENTE = DC.ID_INFORMACAO_DOCTO_CLIENTE
                     AND UPPER(IDC.DS_CAMPO) LIKE '%NATURA%'   
                     AND UPPER(IDC.DS_CAMPO) LIKE '%CONTROLE%'    
               )         
         END AS NR_CONTROLE_NF_ORIGEM    
      FROM            
         (         
            SELECT
               EDS.*,
               NFC.ID_NOTA_FISCAL_CONHECIMENTO,
               NFC.NR_NOTA_FISCAL AS NU_NOTA_FISCAL,
               (
                  SELECT
                     SUBSTR(MAX(TRIM(DC.DS_VALOR_CAMPO)),1,3) 
                  FROM
                     LMS_PD.NF_DADOS_COMP NFD,
                     LMS_PD.DADOS_COMPLEMENTO DC,
                     LMS_PD.INFORMACAO_DOCTO_CLIENTE IDC
                  WHERE
                     1 = 1
                     AND NFD.ID_NOTA_FISCAL_CONHECIMENTO = NFC.ID_NOTA_FISCAL_CONHECIMENTO
                     AND DC.ID_DADOS_COMPLEMENTO = NFD.ID_DADOS_COMPLEMENTO
                     AND IDC.ID_INFORMACAO_DOCTO_CLIENTE = DC.ID_INFORMACAO_DOCTO_CLIENTE
                     AND UPPER(IDC.DS_CAMPO) LIKE '%NATURA%'   
                     AND UPPER(IDC.DS_CAMPO) LIKE '%CONTROLE%'    
               ) AS NR_CONTROLE,
               (
                  SELECT
                     MAX(DSX.ID_DOCTO_SERVICO)
                  FROM
                     LMS_PD.NOTA_FISCAL_CONHECIMENTO NFX,
                     LMS_PD.DOCTO_SERVICO DSX
                  WHERE
                     1 = 1
                     AND NFX.NR_NOTA_FISCAL = NFC.NR_NOTA_FISCAL
                     AND NFX.ID_NOTA_FISCAL_CONHECIMENTO <> NFC.ID_NOTA_FISCAL_CONHECIMENTO
                     --
                     AND DSX.ID_DOCTO_SERVICO = NFX.ID_CONHECIMENTO
                     AND DSX.ID_CLIENTE_REMETENTE = EDS.ID_CLIENTE_REMETENTE
                     AND DSX.DH_EMISSAO < EDS.DH_EMISSAO
               ) AS ID_DOC_NF_REENTREGA,
               (
                  SELECT
                     MAX(DSX.ID_DOCTO_SERVICO)
                  FROM
                     LMS_PD.NOTA_FISCAL_CONHECIMENTO NFX,
                     LMS_PD.DOCTO_SERVICO DSX
                  WHERE
                     1 = 1
                     AND NFX.NR_NOTA_FISCAL = NFC.NR_NOTA_FISCAL
                     AND NFX.ID_NOTA_FISCAL_CONHECIMENTO <> NFC.ID_NOTA_FISCAL_CONHECIMENTO
                     --
                     AND DSX.ID_DOCTO_SERVICO = NFX.ID_CONHECIMENTO
                     AND DSX.ID_CLIENTE_REMETENTE = EDS.ID_CLIENTE_DESTINATARIO
                     AND DSX.DH_EMISSAO < EDS.DH_EMISSAO
               )  AS ID_DOC_NF_DEVOLUCAO                  
            FROM
               (            
                  SELECT
                     EDS.*,
                     ETCD.CD_OCORRENCIA_CLIENTE AS CD_OCORRENCIA,
                     TO_CHAR(EDS.DH_EVENTO,'DDMMYYYYHH24MI') AS DT_OCORRENCIA,
                     F_RETIRA_CARACTER_ESPECIAL(ETCD.DS_OCORRENCIA) AS DS_OCORRENCIA
                  FROM      
                     (           
                        SELECT
                           DS.ID_DOCTO_SERVICO,
                           DS.DH_EMISSAO,
                           DS.ID_CLIENTE_REMETENTE,
                           DS.ID_CLIENTE_DESTINATARIO,
                           DS.ID_FILIAL_DESTINO,
                           EDS.ID_EVENTO_DOCUMENTO_SERVICO,
                           EDS.ID_FILIAL  AS ID_FILIAL_EVENTO,
                           EDS.ID_EVENTO,
                           EDS.ID_OCORRENCIA_ENTREGA,
                           EDS.ID_OCORRENCIA_PENDENCIA,
                           EDS.DH_EVENTO
                        FROM
                           LMS_PD.DOCTO_SERVICO DS,
                           LMS_PD.EVENTO_DOCUMENTO_SERVICO EDS
                        WHERE
                           1 = 1
                           AND EDS.ID_DOCTO_SERVICO = DS.ID_DOCTO_SERVICO             
                           AND EDS.BL_EVENTO_CANCELADO = 'N'
                           AND DS.ID_DOCTO_SERVICO = P_ID_DOCTO_SERVICO   
                     ) EDS,
                     EDI_PD.EDI_TABELA_OCOREN_DET ETCD
                  WHERE
                     1 = 1
                     AND ETCD.ID_EDI_TABELA_OCOREN = 1
                     AND (
                              (ETCD.ID_LMS = EDS.ID_OCORRENCIA_ENTREGA AND ETCD.TP_OCORRENCIA = 1)
                              OR 
                              (ETCD.ID_LMS = EDS.ID_OCORRENCIA_PENDENCIA AND ETCD.TP_OCORRENCIA = 2)
                              OR 
                              (ETCD.ID_LMS = EDS.ID_EVENTO AND ETCD.TP_OCORRENCIA = 3 AND ETCD.ID_LMS <> 601)
                              OR
                              (ETCD.ID_LMS = EDS.ID_EVENTO AND ETCD.TP_OCORRENCIA = 3 AND ETCD.ID_LMS = 601 AND EDS.ID_FILIAL_EVENTO = EDS.ID_FILIAL_DESTINO)
                          )   
               ) EDS,
               LMS_PD.NOTA_FISCAL_CONHECIMENTO NFC
            WHERE
               1 = 1
               AND NFC.ID_CONHECIMENTO = EDS.ID_DOCTO_SERVICO
         ) TMP
      WHERE
         1 = 1 
      ORDER BY
         TMP.DH_EVENTO,
         TMP.ID_EVENTO_DOCUMENTO_SERVICO;     
      
      V_ARQUIVO               UTL_FILE.FILE_TYPE;
      V_NM_ARQUIVO            VARCHAR2 (256);
      V_SEQUENCIA_ARQ         NUMBER(10) := 0;
      V_LINHA                 VARCHAR2 (1024);
      V_EXISTE                BOOLEAN;
      V_FILE_LEN              NUMBER(20);
      V_FILE_BLO              NUMBER(20); 
      V_ID_FILIAL             NUMBER (10) := -1;
      V_TMP_CONTROLE          VARCHAR(3);  
      V_EMISSOR_NF            NUMBER(14);       
      V_CNT_DOCS     NUMBER(5) := 0;
      V_QUEBRA       NUMBER(5) := 3000;            
   BEGIN
      OPEN C_CLIENTES;
      LOOP
         FETCH C_CLIENTES INTO R_CLIENTES;
         EXIT WHEN C_CLIENTES%NOTFOUND;                  
         FOR R_DOCS IN DOCS LOOP            
            IF (V_ID_FILIAL <> R_DOCS.ID_FILIAL_ORIGEM) OR
               (V_CNT_DOCS >= V_QUEBRA)
            THEN                  
               V_ID_FILIAL := R_DOCS.ID_FILIAL_ORIGEM;
               V_CNT_DOCS  := 0;
               IF UTL_FILE.IS_OPEN (V_ARQUIVO) THEN
                  UTL_FILE.FCLOSE (V_ARQUIVO);                        
                  COMMIT;
               END IF;               
               V_EXISTE := TRUE;
               LOOP
                  V_SEQUENCIA_ARQ := V_SEQUENCIA_ARQ + 1;                        
                  V_NM_ARQUIVO    := P_NOME_ARQUIVO || TO_CHAR(SYSDATE, P_FORMATO_ARQUIVO) || P_COMPLEMENTO_ARQUIVO || '.' || P_EXTENSAO_ARQUIVO;                             
                  UTL_FILE.FGETATTR(P_CAMINHO_ARQUIVO, V_NM_ARQUIVO, V_EXISTE, V_FILE_LEN, V_FILE_BLO);
                  IF NOT V_EXISTE THEN
                     V_ARQUIVO := UTL_FILE.FOPEN(P_CAMINHO_ARQUIVO, V_NM_ARQUIVO, 'w');
                  END IF;                               
                  EXIT WHEN UTL_FILE.IS_OPEN(V_ARQUIVO);
               END LOOP;  
               V_LINHA :=  '341'
                           || R_DOCS.CNPJ_FILIAL
                           || RPAD(R_CLIENTES.ID_REMETENTE, 35, ' ');               
               V_LINHA := RPAD (V_LINHA, 120, ' ');
               UTL_FILE.PUT_LINE (V_ARQUIVO, V_LINHA||CHR(13));
            END IF;  
            FOR R IN C_EVENTOS(R_DOCS.ID_DOCTO_SERVICO) LOOP               
               UPDATE
                  EDI_CARGA.TMP_NATURA_REGEN X
               SET
                  X.CNT_EVENTO = NVL(X.CNT_EVENTO,0) + 1
               WHERE
                  1 = 1
                  AND X.ID_DOCTO_SERVICO = R_DOCS.ID_DOCTO_SERVICO; 
               IF R_DOCS.TP_FRETE = 'C' THEN
                  V_EMISSOR_NF := R_DOCS.CNPJ_REMETENTE;  
               ELSIF R_DOCS.TP_FRETE = 'F' THEN
                  V_EMISSOR_NF := R_DOCS.CNPJ_DESTINATARIO;
               END IF;
               V_TMP_CONTROLE := LPAD(TRIM(NVL(R.NR_CONTROLE_NF_ORIGEM, R.NR_CONTROLE)),3,'0');               
               IF (V_TMP_CONTROLE IS NULL) OR 
                  (V_TMP_CONTROLE = '000') OR 
                  (V_TMP_CONTROLE = '001')  
               THEN
                  IF V_EMISSOR_NF = 71673990003940  THEN
                     V_TMP_CONTROLE := '012';
                  ELSIF V_EMISSOR_NF = 71673990003605 THEN
                     V_TMP_CONTROLE := '002';
                  ELSIF V_EMISSOR_NF = 71673990003788 THEN
                     V_TMP_CONTROLE := '002';  
                  ELSE
                     V_TMP_CONTROLE := '   ';
                     P_GERA_LOG('Erro ao definir número de controle Natura - ID_DOCTO_SERVICO:'||TO_CHAR(R.ID_DOCTO_SERVICO));               
                  END IF;
               END IF;     
               V_LINHA :=  '342'
                           || LPAD(V_EMISSOR_NF, 14, '0')
                           || V_TMP_CONTROLE
                           || LPAD(R.NU_NOTA_FISCAL, 9, '0')
                           || LPAD(TRIM(R.CD_OCORRENCIA), 2, '0')
                           || R.DT_OCORRENCIA
                           || '  '
                           || RPAD(R.DS_OCORRENCIA, 70, ' ');
               IF P_ID = 71673990000177 THEN
                  V_LINHA := RPAD (V_LINHA, 220, ' ');
               ELSE
                  V_LINHA := RPAD (V_LINHA, 215, ' ');
               END IF;
               UTL_FILE.PUT_LINE (V_ARQUIVO, V_LINHA||CHR(13));
            END LOOP;
            UPDATE
               EDI_CARGA.TMP_NATURA_REGEN X
            SET
               X.DT_GERACAO = SYSDATE,
               X.NM_ARQUIVO = V_NM_ARQUIVO
            WHERE
               1 = 1
               AND X.CNT_EVENTO > 0
               AND X.ID_DOCTO_SERVICO = R_DOCS.ID_DOCTO_SERVICO;                    
            V_CNT_DOCS := V_CNT_DOCS+1;
         END LOOP;         
         IF UTL_FILE.IS_OPEN (V_ARQUIVO) THEN
            UTL_FILE.FCLOSE (V_ARQUIVO);
            COMMIT;
         END IF;         
      END LOOP;
      CLOSE C_CLIENTES;      
      COMMIT;
   END P_GERA_OCOREN_NATURA;
BEGIN  
   P_GERA_OCOREN_NATURA (P_ID                       => 71673990002544,
                         P_CAMINHO_ARQUIVO          => 'ARQ_UTL_FILE_GM',
                         P_NOME_ARQUIVO             => 'SAPOCO970',
                         P_FORMATO_ARQUIVO          => 'YYMMDDHH24MISS',
                         P_COMPLEMENTO_ARQUIVO      => NULL,
                         P_EXTENSAO_ARQUIVO         => 'TXT'
                        );                        
   SLEEP(5);   
   P_GERA_OCOREN_NATURA (P_ID                       => 71673990003605,
                         P_CAMINHO_ARQUIVO          => 'ARQ_UTL_FILE_GM',
                         P_NOME_ARQUIVO             => 'SAPOCO970',
                         P_FORMATO_ARQUIVO          => 'YYMMDDHH24MISS',
                         P_COMPLEMENTO_ARQUIVO      => NULL,
                         P_EXTENSAO_ARQUIVO         => 'TXT'
                        );
   SLEEP(5);   
   P_GERA_OCOREN_NATURA (P_ID                       => 71673990003788,
                         P_CAMINHO_ARQUIVO          => 'ARQ_UTL_FILE_GM',
                         P_NOME_ARQUIVO             => 'SAPOCO970',
                         P_FORMATO_ARQUIVO          => 'YYMMDDHH24MISS',
                         P_COMPLEMENTO_ARQUIVO      => NULL,
                         P_EXTENSAO_ARQUIVO         => 'TXT'
                        );
   SLEEP(5); 
   P_GERA_OCOREN_NATURA (P_ID                       => 71673990003869,
                         P_CAMINHO_ARQUIVO          => 'ARQ_UTL_FILE_GM',
                         P_NOME_ARQUIVO             => 'SAPOCO970',
                         P_FORMATO_ARQUIVO          => 'YYMMDDHH24MISS',
                         P_COMPLEMENTO_ARQUIVO      => NULL,
                         P_EXTENSAO_ARQUIVO         => 'TXT'
                        );
   SLEEP(5); 
   P_GERA_OCOREN_NATURA (P_ID                       => 71673990003940,
                         P_CAMINHO_ARQUIVO          => 'ARQ_UTL_FILE_GM',
                         P_NOME_ARQUIVO             => 'SAPOCO970',
                         P_FORMATO_ARQUIVO          => 'YYMMDDHH24MISS',
                         P_COMPLEMENTO_ARQUIVO      => NULL,
                         P_EXTENSAO_ARQUIVO         => 'TXT'
                        );
END

que é executado assim:

try (Connection con = DriverManager.getConnection("...."); Statement stmt = con.createStatement();) {
			ScriptRunner sr = new ScriptRunner(con);
			Reader reader = new BufferedReader(new FileReader(..."XXX.sql".....));
			sr.setAutoCommit(true);
	        sr.setStopOnError(true);
	        sr.runScript(reader);
			System.out.println("Arquivos gerados em:... ");
		} catch (Exception e) {
			System.err.println("Erro ao regerar ocorren: " + e.getMessage());
		}

E tenho esse erro reportado:

Error executing: DECLARE
PROCEDURE P_GERA_LOG(P_TEXTO IN VARCHAR2)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE, ‘DD/MM/YY HH24:MI:SS’)||’ - '||P_TEXTO)
. Cause: java.sql.SQLException: ORA-06550: linha 6, coluna 0:
PLS-00103: Encountered the symbol “end-of-file” when expecting one of the following:

:= . ( % ;

Erro ao regerar ocorren: Error executing: DECLARE
PROCEDURE P_GERA_LOG(P_TEXTO IN VARCHAR2)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE, ‘DD/MM/YY HH24:MI:SS’)||’ - '||P_TEXTO)
. Cause: java.sql.SQLException: ORA-06550: linha 6, coluna 0:
PLS-00103: Encountered the symbol “end-of-file” when expecting one of the following:
:= . ( % ;

Essa procedure está criada no banco de dados? E de qual pacote é essa classe ScriptRunner? No link que passei tem um exemplo de como executar uma procedure da forma que vc quer.

A procedure não está na base de dados, ela é executada diretamente. A solução que encontrei foi:

    ScriptRunner sr = new ScriptRunner(conexão com BD);
    Reader reader = new BufferedReader(new FileReader("aqui o arquivo xxx.sql"));
    sr.setSendFullScript(true); // adicionei isso
    sr.setAutoCommit(true);
    sr.setStopOnError(true);
    sr.runScript(reader);
    sr.closeConnection();

OBS: ScriptRunner é do pacote org.apache.ibatis.jdbc.ScriptRunner