2017-10-18 3 views
0

Je rencontre des problèmes de logique en pensant à cette tâche. Ainsi, la tâche demande de renvoyer la position de la première lettre plus grande dans une liste de lettres. Par exemple:Impression de la position de la plus grande lettre dans une liste de caractères

   ABVD -> 3 
      BCDG -> 4 
      CFDE -> 2 

Cette tâche suggère d'utiliser longueur, ascii et bloc nommé, la fonction

donc ce que je pouvais faire à ce jour:

declare 
x varchar2(10) :='ABFD'; 
BEGIN 
FOR i in 1..length(x) LOOP 
dbms_output.put_line(ASCII(SUBSTR(x, i, 1))); 
END LOOP; 
END; 

Ma pensée était de tourner les lettres aux nombres: 65, 66, 70, 68. Le motif est x + 1 et comme le nombre 70 n'est pas égal à 66 + 1, le programme renverra la position de ce nombre, qui est 3. Malheureusement, je Je ne sais pas comment transformer cette idée en code. Pouvez-vous me donner quelques conseils/suggestions? Merci!

+0

Pourquoi convertir en chiffres? Oui, 70> 65, mais aussi 'F'> 'A'. –

+0

Merci pour votre réponse! Je ne savais pas que nous pouvions le faire. – Chopsticks

Répondre

1

Dans l'énoncé du problème, vous avez dit "... use named block, function."

Votre solution est une procédure anonyme. Il n'est nommé nulle part (c'est pourquoi il est appelé "anonyme"). Et ce n'est pas une fonction - elle ne retourne rien.

Je vais vous laisser étudier la documentation pour comprendre la différence entre la fonction et la procédure, et comment nommer une fonction ou une procédure. Ci-dessous, je vais suivre votre exemple et montrer comment vous pouvez modifier votre code pour en faire une procédure anonyme. (Dans la procédure I « print » la valeur finale de ind;. Quand vous mettez ce paramètre à une fonction, vous devriez return cette valeur, au lieu de l'imprimer)

Dans le code affiché, vous imprimez les lettres la chaîne d'entrée, un par un. Vous n'essayez même pas de définir ou affecter à un entier (l'index de la première occurrence de la lettre "la plus haute" dans la chaîne). Cela devrait être fait dans le bloc DECLARE. Ensuite, nous devons également stocker la lettre la plus haute trouvée "jusqu'à présent" (pour les comparaisons futures).

Le code pourrait ressembler à ceci:

declare 
x varchar2(10) :='ABFD'; 
ind number := 1; 
max_letter char(1) := substr(x, 1, 1); 
BEGIN 
FOR i in 2..length(x) LOOP 
    if substr(x, i, 1) > max_letter 
    then max_letter := substr(x, i, 1); 
     ind := i; 
    end if; 
END LOOP; 
dbms_output.put_line(ind); 
END; 
/

Notez que les lettres peuvent être comparés entre eux directement, il n'y a aucune raison de les convertir en nombre.

0

SQL pur en utilisant la clause type

with t(str) as 
(select 'ABVD' from dual 
union all select 'BCDG' from dual 
union all select 'CFDE' from dual) 
select str, instr(str, max_chr) ind 
from t 
model 
partition by (rownum rn) 
dimension by (1 dummy) 
measures (str, chr(1) max_chr) 
rules 
iterate (4e3) until (substr(str[1], iteration_number + 2, 1) is null) 
(max_chr[1] = greatest(max_chr[1], substr(str[1], iteration_number + 1, 1))); 

STR   IND 
---- ---------- 
ABVD   3 
BCDG   4 
CFDE   2