Procédure stockée Exception ORA-01858
Bonjour tout le monde,
J'essaie de lancer une procédure stockée ORACLE à partir de code JAVA généré par l'ETL TALEND, mais j'ai l'exception suivante :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| java.sql.SQLException: ORA-20001: An error was encountered - -1858 -ERROR- ORA-01858: caractère non numérique rencontré à la place d'un numérique
ORA-06512: à "CFAMDATA1.PRETRAITEMENT_EOD", ligne 78
ORA-06512: à ligne 1
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:215)
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:965)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1170)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3339)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3445)
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4394)
at test.a_sr_0_1.preTraitementEOD.tFixedFlowInput_1Process(preTraitementEOD.java:1638)
at test.a_sr_0_1.preTraitementEOD.tOracleConnection_1Process(preTraitementEOD.java:619)
at test.a_sr_0_1.preTraitementEOD.tMsgBox_2Process(preTraitementEOD.java:497)
at test.a_sr_0_1.preTraitementEOD.tMsgBox_1Process(preTraitementEOD.java:405)
at test.a_sr_0_1.preTraitementEOD.runJobInTOS(preTraitementEOD.java:2031)
at test.a_sr_0_1.preTraitementEOD.main(preTraitementEOD.java:1876) |
Voici le code de ma procédure stockée ORACLE :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| FUNCTION getlastexedate (p_date VARCHAR2, p_entite VARCHAR2)
RETURN number
IS
v_date DATE;
p_date_1 DATE;
BEGIN
SELECT MAX (ap.posting_date)
INTO v_date
FROM t1 ap, t2 ae
WHERE ap.col3 = ae.ID
AND ae.col2 = p_entite
AND ap.col1 IN (2, 3, 4);
p_date_1 := j_1_ouvre (p_date);
IF p_date_1 = v_date
THEN
RETURN 1;
END IF;
RETURN -1;
EXCEPTION
WHEN OTHERS
THEN
raise_application_error (-20001,
'An error was encountered - '
|| SQLCODE
|| ' -ERROR- '
|| SQLERRM
);
END; |
En fait il s'agit de la date que je passe en paramètre sous la forme String date = "25/01/2011" qui cause problème.
Le code généré par TALEND utilise le JDBC c'est pour ça que je poste ce problème ici.
Si vous avez une idée S.V.P n'hésitez pas.
Merci par avance.
Convertir la string en date
Bonjour,
Voici le détail de la doc Oracle sur le message d'erreur.
Citation:
ORA-01858: a non-numeric character was found where a numeric was expected
Cause:
The input data to be converted using a date format model was incorrect.
The input data did not contain a number where a number was required by the format model.
Action:
Fix the input data or the date format model to make sure the elements match in number and type. Then retry the operation.
Vous comparez la string 25/01/2011 à des dates.
Or vous ne pouvez pré-supposer qu'elle sera acceptée en tant que date.
La première des choses à faire dans la routine PlSql est de déclarer une variable de type date et de convertir votre chaîne en date EN PRECISANT LE FORMAT.
Code:
1 2 3 4 5 6 7 8 9
|
-- Declare
-- Paramètres
ld_date date;
Begin
-- Paramètres
ld_date := to_date(p_date, 'DD/MM/YYYY');
... |
Pozzo
PS : Accessoirement les variables du genre v_date, p_date, ld_date sont un peu "muettes" c'est un peu casse figure (surtout en maintenance) mais vu le nom des tables et des colonnes je suppose que c'est une présentation simplifiée de votre soucis.