2014-05-20 3 views
0
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?

+0

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

+0

pourquoi tort -je pense que cela fonctionne bien lorsqu'il est exécuté dans le cadre de la procédure ? –

+0

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? –

Répondre

1

votre problème réside dans l'utilisation de vos paramètres INCOMING. Voici votre code:

SELECT COUNT (*) INTO bbg_yest 
FROM Crd_Own.Bbg_Oiv v 
WHERE asof_date = TO_DATE ('last_bus_day', 'mm/dd/yyyy'); 

'last_bus_day' est une chaîne constante. Oracle essaie d'obtenir mm (mois en nombre) et échoue.

votre paramètre: last_bus_day EN DATE

Par conséquent, vous n'avez pas besoin de conversions:

SELECT COUNT (*) INTO bbg_yest 
FROM Crd_Own.Bbg_Oiv v 
WHERE asof_date = last_bus_day; 
1
SELECT COUNT (*) INTO bbg_yest 
FROM Crd_Own.Bbg_Oiv v 
WHERE asof_date = TO_DATE ('last_bus_day', 'mm/dd/yyyy'); 

Ce sont pas requêtes valides. La fonction to_date attend une chaîne représentant une date et une chaîne de format indiquant le format du premier paramètre. Last_bus_day ne correspond pas mm/dd/yyyy, donc il échoue. Un exemple de chaîne correspondante serait 05/19/2014.

Étant donné que votre paramètre entrant est une date, vous devez changer vos questions à ressembler à ceci:

SELECT COUNT (*) INTO bbg_yest 
FROM Crd_Own.Bbg_Oiv v 
WHERE asof_date = last_bus_day; 

parce que vous n'avez pas besoin de convertir la chaîne à une date, puis à une date à nouveau.

+0

Merci maçon ... et tous ceux qui ont répondu. –

+0

Maintenant, j'ai une autre question à ce sujet, en essayant d'appeler la procédure ci-dessus du script shell-prix_date = "20/05/2014" last_bus_day = "19/05/2014" ORAPWD = 'cat/appl/$ {ENV_BASE} données/données/U/contrôle/.xfile_svc_op' model_check = 'sqlplus -s' << .... FIN svc_op/$ {orapwd} @ $ {} oracle_server var numéro return_val; définir un retour sur définir en-tête définir la taille de la page 0 exécuter PM_OWN.emav_input_check (TO_DATE ($ last_bus_day, 'MM/JJ/AAAA'), TO_DATE ($ price_date, 'MM/JJ/AAAA'),: return_val); print return_val; .... END echo $ model_check –

+0

@ user3488955 Vous devriez publier cette question comme nouvelle question. – mason

Questions connexes