Oracle - Cómo puedo hacer más eficiente esta función

 
Vista:
sin imagen de perfil

Cómo puedo hacer más eficiente esta función

Publicado por Ado (1 intervención) el 23/02/2017 19:45:30
Buenos días,
Les dejo el script de esta función super básica, en la cual, recibiendo dos parámetros, busco las palabras a traducir en la tabla test_translator, en caso de no encontrar la palabra buscada la retorno con el mismo valor pero entre asteriscos.....

A la espera de sus prontas respuestas.
Gracias anticipadas.


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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
SET  SERVEROUTPUT ON;
 
CREATE TABLE TEST_TRANSLATOR
(INGLES VARCHAR2(100),
ESPANOL VARCHAR2(100)
);
INSERT INTO TEST_TRANSLATOR VALUES('YO'         ,'I'        );
INSERT INTO TEST_TRANSLATOR VALUES('SOY'        ,'AM'       );
INSERT INTO TEST_TRANSLATOR VALUES('ES'         ,'IS'       );
INSERT INTO TEST_TRANSLATOR VALUES('QUE'        ,'WHAT'     );
INSERT INTO TEST_TRANSLATOR VALUES('CUANDO'     ,'WHEN'     );
INSERT INTO TEST_TRANSLATOR VALUES('PORQUE'     ,'WHY'      );
INSERT INTO TEST_TRANSLATOR VALUES('COMO'       ,'HOW'      );
INSERT INTO TEST_TRANSLATOR VALUES('DONDE'      ,'WHERE'    );
INSERT INTO TEST_TRANSLATOR VALUES('TU'         ,'YOU'      );
INSERT INTO TEST_TRANSLATOR VALUES('EL'         ,'HE'       );
INSERT INTO TEST_TRANSLATOR VALUES('ELLA'       ,'SHE'      );
INSERT INTO TEST_TRANSLATOR VALUES('SON'        ,'ARE'      );
INSERT INTO TEST_TRANSLATOR VALUES('SI'         ,'YES'      );
INSERT INTO TEST_TRANSLATOR VALUES('NO'         ,'NO'       );
INSERT INTO TEST_TRANSLATOR VALUES('MUSICA'     ,'MUSIC'    );
INSERT INTO TEST_TRANSLATOR VALUES('VIDA'       ,'LIFE'     );
INSERT INTO TEST_TRANSLATOR VALUES('BUENO'      ,'GOOD'     );
INSERT INTO TEST_TRANSLATOR VALUES('MALO'       ,'BAD'      );
INSERT INTO TEST_TRANSLATOR VALUES('DIA'        ,'DAY'      );
INSERT INTO TEST_TRANSLATOR VALUES('NOCHE'      ,'NIGHT'    );
INSERT INTO TEST_TRANSLATOR VALUES('TARDE'      ,'AFTERNOON');
INSERT INTO TEST_TRANSLATOR VALUES('ADIOS'      ,'GODDBYE'  );
INSERT INTO TEST_TRANSLATOR VALUES('BIENVENIDO' ,'WELCOME'  );
INSERT INTO TEST_TRANSLATOR VALUES('TENER'      ,'HAVE'     );
INSERT INTO TEST_TRANSLATOR VALUES('EN'         ,'IN'       );
INSERT INTO TEST_TRANSLATOR VALUES('FUERA'      ,'OUT'      );
INSERT INTO TEST_TRANSLATOR VALUES('NOSOTROS'   ,'WE'       );
INSERT INTO TEST_TRANSLATOR VALUES('APRENDER'   ,'LEARN'    );
INSERT INTO TEST_TRANSLATOR VALUES('PERDER'     ,'LOSE'     );
INSERT INTO TEST_TRANSLATOR VALUES('GANAR'      ,'WIN'      );
 
 
CREATE OR REPLACE
FUNCTION FN_TRADUCTOR (PALABRA IN OUT VARCHAR2, IDIOMA_FIN CHAR)
           RETURN VARCHAR2 IS
  RESUL NUMBER := 1;
  RESUL_ANTE NUMBER;
  RETORNO2 VARCHAR2(100);
  RETORNO  VARCHAR2(200) := '';
BEGIN
  PALABRA := PALABRA||' ';
  LOOP
      BEGIN
        RESUL_ANTE := RESUL;
        RESUL := INSTR(PALABRA,' ', RESUL_ANTE);
        IF RESUL = 0 THEN
           EXIT;
        END IF;
        RESUL := RESUL + 1;
        BEGIN
           SELECT DECODE(IDIOMA_FIN, 'I', INGLES, ESPANOL)
                  INTO RETORNO2
                  FROM TEST_TRANSLATOR
                  WHERE DECODE(IDIOMA_FIN, 'I', ESPANOL, INGLES) =
                        SUBSTR(PALABRA, RESUL_ANTE, RESUL-1-RESUL_ANTE);
        EXCEPTION
          WHEN NO_DATA_FOUND THEN
              RETORNO2 := '*'||TRIM(SUBSTR(PALABRA, RESUL_ANTE, RESUL-1-RESUL_ANTE))||'*';
        END;
        RETORNO := RETORNO||' '||RETORNO2;
      END;
  END LOOP;
  RETURN(RETORNO);
END;
 
--LLAMANDO A LA FUNCIÓN
DECLARE
     PALABRA VARCHAR2(500);
     IDIOMA VARCHAR2(1);
BEGIN
     DBMS_OUTPUT.PUT_LINE(FN_TRADUCTOR(PALABRA, IDIOMA));
END;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de ELVIS STALYN MUÑOZ PRUNA
Val: 209
Plata
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Cómo puedo hacer más eficiente esta función

Publicado por ELVIS STALYN MUÑOZ PRUNA (102 intervenciones) el 24/02/2017 23:03:18
Buenas tardes

Porque no hace sun cursor que reciba la palabra pero en el where usas un LIKE sin % osea SELECT ESPANOL FROM TEST_TRANSLATOR WHERE INGLES LIKE ':INGLES';

Salvo que alguien tenga un mejor criterio de solución,

Espreo comentarios.

Elvis
Gye-Ec
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar