J'ai créé un curseur pour sélectionner les données réelles et les parcourir pour produire la valeur brute et la valeur après la conversion en nombre. L'application génère parfois des erreurs de nombre non valides. Ci-dessous, mon code de test (sans inclure le code de sélection) et la sortie.PlSql Traduire la question de la fonction
LOOP
FETCH myCursor into v_answer;
EXIT WHEN myCursor%notfound;
DBMS_OUTPUT.PUT_LINE('Raw answer: ' || v_answer);
v_instr := INSTR(v_answer, '.',1 , 2) ;
v_number := TO_NUMBER(REPLACE(TRANSLATE (CASE v_instr
WHEN 0 THEN UPPER(v_answer)
ELSE 0
END,'ABCDEFGHIJKLMNOPQURSTWVXYZ+<>:',' '), ' ',''));
DBMS_output.put_line('As number: ' || v_number);
Voici la sortie:
Raw answer: 4
As number: 4
Raw answer: 3
As number: 3
Raw answer: 1.00
As number: 1
Raw answer: <3
Je reçois:
PL/SQL: numeric or value error: character to number conversion error
... quand la réponse Raw est '< 3'.
S'il vous plaît noter que le code réel utilisé par l'application ressemble à ceci:
AND TO_NUMBER(REPLACE(TRANSLATE (decode(INSTR(hra_ans.answer_text, '.',1 , 2), 0 , UPPER(hra_ans.answer_text) , 0),'ABCDEFGHIJKLMNOPQURSTWVXYZ+<>:',' '), ' ',''))
et fait partie de la clause where dans une chaîne SQL dynamique. J'ai remplacé l'instruction de décodage par l'instruction case car j'obtenais une fonction ou une pseudo-colonne "DECODE" qui peut être utilisée dans une erreur d'instruction SQL uniquement.
Enfin, mes questions sont les suivantes:
- Pourquoi pas la fonction traduire en remplaçant le signe inférieur et
- Quelle est la différence (en termes simples) entre les ORA-1722 et Ora- 06502 erreurs?
EDIT: J'ai remarqué que lorsque je change la déclaration de cas:
CASE v_instr
WHEN 0 THEN UPPER(v_answer)
ELSE '0'
,
Je ne reçois l'erreur 06502. En regardant la ligne de code d'origine que j'ai posté, y a-t-il des suggestions quant à ce qui peut causer l'erreur de nombre invalide (en supposant qu'aucun caractère n'existe dans la chaîne à traduire ne sont pas pris en compte)? Ou, y a-t-il une meilleure façon d'accomplir ce que le développeur original essayait de faire?
Voici les déclarations de variables:
v_answer varchar2(2000);
v_number number;
v_instr number;
Les informations sur les tags pour les erreurs associées peuvent fournir des informations sur votre # 2.Je voudrais voir la déclaration de la variable, basée sur ce que je lis pour ORA-06502 –
Voir ma modification. Je vais vérifier les tags. Merci! –