ordenada sem repeticao baseado nos pergaminhos.Implementar a precedencia das letras, e implementar a ordenacao palavra por palavra, e um tanto trabalhoso. Ordenar palavras do nosso alfabeto o Oracle faz brincando, pena que ele nao conhece inicialmente o alfabeto Googlon. A funcao TRANSLATE do Oracle 11g R2 x86_64 ira traduzir o alfabeto Google para o nosso alfabeto, entao e so ordenar as palavras usando ORDER BY, simples nao?A ordenacao foi resolvida, agora falta a ausencia repeticao. Na consulta que ira retornar as PALAVRAS, basta utilizar a clausula DISTINCT no SELECT.De modo geral, temos que fazer um procedimento que selecione as palavras excluindo as repeticoes e ordenando pelo alfabeto traduzido. Montar a lista de vocabulario, concatenando palavra por palavra separado por espaco. No final, armazenar a lista de vocabulario na tabela PERGAMINHOS.Segue a implementacao do procedimento PALAVRAS_TO_LISTA_VOCABULARIO:PROCEDURE PALAVRAS_TO_LISTA_VOCABULARIO(P_PERGAMINHO_ID NUMBER) IS L_LISTA_VOCABULARIO VARCHAR2(4000); L_ALFABETO_GOOGLON VARCHAR2(20) := 'dcxkjsmvrlgftwpqznbh'; L_ALFABETO_PORTUGUES VARCHAR2(20) := 'abcdefghijklmnopqrst';BEGIN L_LISTA_VOCABULARIO := NULL; FOR REGISTRO IN (SELECT DISTINCT PALAVRA FROM PALAVRAS WHERE PERGAMINHO_ID = P_PERGAMINHO_ID ORDER BY TRANSLATE(PALAVRA, L_ALFABETO_GOOGLON, L_ALFABETO_PORTUGUES)) LOOP L_LISTA_VOCABULARIO := L_LISTA_VOCABULARIO || REGISTRO.PALAVRA || GOOGLE_DEV_DAY_BRASIL_2011.SEPARADOR; END LOOP; UPDATE PERGAMINHOS SET LISTA_VOCABULARIO = L_LISTA_VOCABULARIO WHERE PERGAMINHO_ID = P_PERGAMINHO_ID; EXCEPTION WHEN OTHERS THEN BEGIN DBMS_OUTPUT.PUT_LINE(SQLERRM); END;END;Quinta Questao - Numero Bonito DistintoPara a quinta e ultima questao, vamos criar mais uma tabela e uma sequencia. Como nao e necessario saber quais sao os numeros bonitos distintos, so foi solicitado a quantidade, decidi utilizar uma tabela temporaria, desta forma, nao e necessario apagar os registro da tabela toda vez que for calcular a quantidade de numeros bonitos distintos. Ao executar o COMMIT os registros sao "removidos", as tabelas temporarias utilizam a tablespace TEMP.Criando a tabela NUMEROS, tabela que ira armazenar numeros bonitos dado as PALAVRAS:CREATE GLOBAL TEMPORARY TABLE NUMEROS ( NUMERO_ID NUMBER NOT NULL, PERGAMINHO_ID NUMBER NOT NULL, ORDEM NUMBER NOT NULL, NUMERO NUMBER NOT NULL) ON COMMIT DELETE ROWS;Criando a chave primaria PK_NUMEROS:ALTER TABLE NUMEROS ADD CONSTRAINT PK_NUMEROS PRIMARY KEY(NUMERO_ID);Detalhe, infelizmente tabelas temporarias nao tem suporte a chave estrangeira. Caso tente criar a chave estrangeira, recebera o erro ORA-14455. Caso queira garantir a integridade, pode ser implementado uma trigger.Criando a sequencia NUMEROS_SEQ:CREATE SEQUENCE NUMEROS_SEQMINVALUE 1MAXVALUE 99999999START WITH 1INCREMENT BY 1CACHE 20;A logica empregada nesta questao e a seguinte: Selecionar as palavras do pergaminho, percorrer por meio de um laco cada palavra, em cada palavra percorrer por um outro laco letra por letra da palavra, para cada letra, converter a letra em valor numerico, converter o numero para base 20 e somar todos os valores da palavra, verificar se o numero e bonito, e inserir na tabela NUMEROS. Apos fazer o processo para todas as palavras do pergaminho, fazer uma contagem distinta dos numeros do pergaminho, e armazenar na tabela PERGAMINHOS.Para converter a letra em valor numerico, utilize a funcao LETRA_TO_UNIDADE:FUNCTION LETRA_TO_UNIDADE(P_LETRA CHAR) RETURN NUMBER IS L_UNIDADE NUMBER;BEGIN SELECT DECODE(P_LETRA, 'd',0, 'c',1, 'x',2, 'k',3, 'j',4, 's',5, 'm',6, 'v',7, 'r',8, 'l',9, 'g',10, 'f',11, 't',12, 'w',13, 'p',14, 'q',15, 'z',16, 'n',17, 'b',18, 'h',19) INTO L_UNIDADE FROM DUAL; RETURN L_UNIDADE; EXCEPTION WHEN OTHERS THEN BEGIN DBMS_OUTPUT.PUT_LINE(SQLERRM); END;END;Para verificar se o numero e bonito, foi implementado a funcao IS_NUMERO_BONITO:FUNCTION IS_NUMERO_BONITO(P_NUMERO