create or replace PROCEDURE emav_input_check
(last_bus_day IN DATE, price_date IN DATE, o_param OUT NUMBER)
AS
bbg_yest NUMBER;
bbg_today NUMBER;
drates_yest NUMBER;
drates_today NUMBER;
equity_yest NUMBER;
equity_today NUMBER;
index_yest NUMBER;
index_today NUMBER;
retval INTEGER;
retval1 INTEGER;
retval2 INTEGER;
retval3 INTEGER;
retval4 INTEGER;
BEGIN
SELECT COUNT (*) INTO bbg_yest
FROM Crd_Own.Bbg_Oiv v
WHERE asof_date = TO_DATE ('last_bus_day', 'mm/dd/yyyy');
SELECT COUNT (*) INTO bbg_today
FROM Crd_Own.Bbg_Oiv
WHERE asof_date = TO_DATE ('price_date', 'mm/dd/yyyy');
SELECT COUNT (*) INTO drates_yest
FROM pm_own.deposit_rates
WHERE asof_date = TO_DATE ('last_bus_day', 'mm/dd/yyyy')
AND currency_code IN (' USD', 'EUR', 'GBP', 'JPY ')
AND TERM_WEEKS = 0;
SELECT COUNT (*) INTO drates_today
FROM pm_own.deposit_rates
WHERE asof_date = TO_DATE ('price_date', 'mm/dd/yyyy')
AND currency_code IN (' USD', 'EUR', 'GBP', 'JPY ');
SELECT COUNT (*) INTO equity_yest
FROM pm_own.BDVD_FORECAST_EQUITY
WHERE asof_date = TO_DATE ('last_bus_day', 'mm/dd/yyyy');
SELECT COUNT (*) INTO equity_today
FROM pm_own.BDVD_FORECAST_EQUITY
WHERE asof_date = TO_DATE ('price_date', 'mm/dd/yyyy');
SELECT COUNT (*) INTO index_yest
FROM pm_own.BDVD_FORECAST_INDEX
WHERE asof_date = TO_DATE ('last_bus_day', 'mm/dd/yyyy');
SELECT COUNT (*) INTO index_today
FROM pm_own.BDVD_FORECAST_INDEX
WHERE asof_date = TO_DATE ('price_date', 'mm/dd/yyyy');
IF bbg_yest != 0
THEN
SELECT ((bbg_today - bbg_yest) * 100)/bbg_yest INTO retval1
FROM DUAL;
ELSE
retval1 := 0;
END IF;
IF drates_yest != 0
THEN
SELECT ((drates_today - drates_yest) * 100)/drates_yest INTO retval2
FROM DUAL;
ELSE
retval2 := 0;
END IF;
IF equity_yest != 0
THEN
SELECT ((equity_today - equity_yest) * 100)/equity_yest INTO retval3
FROM DUAL;
ELSE
retval3 := 0;
END IF;
IF index_yest != 0
THEN
SELECT ((index_today - index_yest) * 100)/index_yest INTO retval4
FROM DUAL;
ELSE
retval4 := 0;
END IF;
retval := 0;
IF retval1 < 0 AND ABS (retval1) > 20
THEN
retval := 1;
ELSIF retval2 < 0 AND ABS (retval2) > 20
THEN
retval := 2;
ESIF retval3 < 0 AND ABS (retval3) > 20
THEN
retval := 3;
ELSIF retval4 < 0 AND ABS (retval4) > 20
THEN
retval := 4;
END IF;
o_param := retval;
END;
Le code ci-dessus correspond à la procédure. Quand je l'exécute AS-Exécution d'une procédure Oracle sans paramètre
declare
return_val number;
BEGIN
pm_own.emav_input_check(TO_DATE('05/19/2014','MM/DD/YYYY'),TO_DATE('05/20/2014','MM/DD/YYYY'),return_val);
dbms_output.put_line(return_val);
END;
Je reçois l'erreur suivante:
Error report:
ORA-01858: a non-numeric character was found where a numeric was expected
ORA-06512: at "PM_OWN.EMAV_INPUT_CHECK", line 19
ORA-06512: at line 4
01858. 00000 - "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.
Toute idée comment corriger cette erreur?
Ce que vous faites dans vos sélections est erroné. 'WHERE asof_date = TO_DATE ('last_bus_day', 'jj/mm/aaaa');' vous essayez de transformer la chaîne 'last_bus_day' en une date, ce qui est impossible bien sûr. Je pense que vous devez supprimer les guillemets. – AndreySarafanov
pourquoi tort -je pense que cela fonctionne bien lorsqu'il est exécuté dans le cadre de la procédure ? –
Vous l'appelez avec une date déjà. Vous passez TO_DATE ('05/19/2014 ',' MM/DD/YYYY ') comme premier paramètre, puis essayez de le convertir à nouveau. Ne devriez-vous pas simplement passer '05/19/2014 ', ou ne pas le convertir dans la fonction aussi? –