Pesquisar no Programero

segunda-feira, 29 de setembro de 2008

Função INSTR do Oracle no Delphi

O Oracle possui uma função chamada INSTR(), ela procura por ocorrências de uma determinada palavra dentro de outra, começando de uma determinada posição, e retorna o índice quando encontrado.
Ex.:

SELECT INSTR('EDUARDO TEIXEIRA','ER', 1, 2) "Teste com INSTR"
FROM DUAL;

Teste com INSTR
----------
13

No exemplo acima a busca começa no primeiro caracter da frase 'EDUARDO TEIXEIRA' e procura pelo índice da segunda ocorrência da palavra 'ER', e o resultado foi a 13º posição.
Existe algo parecido no Delphi, é a função POEX, porém ela não trata ocorrências, trazendo sempre o índice da primeira encontrada, então ai vai uma função para o Delphi que faz o mesmo que o INSTR do Oracle:

function INSTR_Delphi(p_busca: string; p_buscado: string; p_inicio: integer; p_incidencia: integer): integer;
var
v_posi : integer; //guarda última posição encontrada
v_inc : integer;   //incidências já encontradas
v_i : integer;       //contador para loop

begin
//pego a primeira incidência do que é procurado
v_posi := PosEx(p_buscado, p_busca, p_inicio);
//
//se retornou alguma coisa continuo testando

if (v_posi 0) and (p_incidencia > 1) then 
begin
//ja pegou uma vez
v_inc := 1; 
//
//repito o teste até o final da palavra alvo
for v_i := v_posi to Length(p_busca) do
begin
//se eu encontrar agora partindo da posição encontrada anteriormente
//guardo a nova posição, se o limite de incidência não foi atingido

if (PosEx(p_buscado, p_busca, v_posi+1) 0) and (v_inc) then
begin
//guardo nova posição
v_posi := PosEx(p_buscado, p_busca, v_posi+1); 
//incremento incidência
v_inc := v_inc + 1;
end; //if (PosEx(p_buscado, p_busca, v_posi+1) 0) and (v_inc) then
end; //for v_i := v_posi to Length(p_busca) do 
end; //if (v_posi 0) and (p_incidencia > 1) then 
//
result := v_posi;
end;//function

terça-feira, 23 de setembro de 2008

Procurando emprego?

Responda rápido, qual empresa possui a marca mais valiosa do mundo (80 bilhões de dólares), conta com mais de 19 mil funcionários em 36 países, oferece um massagista 3 vezes por semana, possuiu um Wii e um Xbox no lounge, além de um fliperama e uma mesa de sinuca? Sim senhores, para aqueles que responderam Google acertaram, 40% das vagas no Brasil ainda não foram preenchidas. Os interessados devem se preparar bastante pois o processo de seleção é bem puxado, antes ocorriam até 30 entrevistas, hoje o numero foi bem reduzido chegando a 5 ou 6 entrevistas.

Mais alguns numeros do Google:
  • US$ 16,6 bilhões de faturamento em 2007
  • 19604 funcionários
  • 50 escritorios em 20 países
  • 1 milhão de usuarios ativos do Google Docs
  • 60 milhões de usuários do orkut
  • 10 mil clientes do Google Enterprise
  • 40 bilhões de páginas indexadas à ferramenta de busca

segunda-feira, 15 de setembro de 2008

BLOGAGEM COLETIVA "Justiça para Flavia"

No dia de hoje não falaremos sobre tecnologias, dicas ou truques, iremos ceder nosso espaço para um ato de cidadania, pois exigir que a lei se faça não é mais do que a obrigação de cada cidadão.
Irei redigir aqui uma matéria que foi extraída na integra do blog Flavia, Vivendo em Coma... , que é mantido por uma mãe que perdeu sua filha a mais de dez anos em função de um acidente fatal, causado pela má instalação de um ralo na piscina. Ela pede apenas que justiça seja feita.


Domingo, 27 de Julho de 2008

PISCINA SEGURA, RESPONSABILIDADE DOS PAIS?!

Foto por mim scaneada do Jornal A Folha de São Paulo.
Transcrevo alguns trechos da matéria publicada no Jornal FOLHA DE SÃO PAULO de domingo passado, dia 20 de Julho de 2008, no caderno “Construção”. A matéria está assinada por Mariana Desimone e vem com o título de PISCINA SEGURA. Infelizmente, não consegui o link na Internet para direcionar vocês para a reportagem. Quem por acaso puder me informar esse link, ficarei agradecida. Tentei, mas também não consegui contato com a jornalista.

Título da reportagem:
"PISCINA SEGURA
SUCÇÃO DO RALO REPRESENTA POSSIBILIDADE DE ACIDENTE”

Nesta matéria fica claro que a sucção do ralo representa perigo e “o pior que pode acontecer é uma criança ficar presa pelos cabelos em um ralo desses”. Realmente, é o pior que pode acontecer e infelizmente aconteceu - e continua acontecendo - com várias pessoas, conforme vem sendo documentado neste blog e infelizmente foi também o que aconteceu com Flavia. Seus cabelos foram sugados “por um desses ralos”. Venho, há mais de nove anos tentando provar isto na justiça paulista, sendo que tanto o Condomínio Jardim da Juriti, quanto à empresa JACUZZI DO BRASIL , vêm se negando a admitir esta evidência provada nos autos do processo de Flavia. Que provas são essas? A piscina onde Flavia sofreu o acidente foi esvaziada quatro vezes e "periciada" por profissional designado pela própria justiça. No laudo está escrito:
“O condomínio autor forneceu ao signatário, cópias de duas plantas, mas que, no entanto, não representam fielmente a realidade local. Nas aludidas plantas notou-se que o projeto sugeria conjunto motor/bomba com 0,50 cv. (meio cavalo vapor) sendo que atualmente, pelas informações prestadas e colhidas na primeira visita, o referido equipamento foi substituído pelo condomínio, posteriormente, muito embora antes do acidente com a co-autora, o qual está lá instalado, até a presente data em funcionamento, tem potência de 1,5 cv (um e meio cavalo-vapor)”.

Conclusões da perícia:
“... a perícia pôde concluir que:
Houve substituição do conjunto motor/bomba/filtro e a instalação de um aquecedor, o que aconteceu antes do acidente. O equipamento anterior possuía potência de 0,50 cv (cavalo motor) e o atual, adquirido pelo condomínio é de 1,50 cv, da marca Jacuzzi....... o conjunto motor/bomba/filtro adquirido pelo condomínio, possui potência acima das necessidades locais, adequado para uma piscina de 104 m3 de água. A piscina da presente ação possui 43 m3, podendo ser considerado o conjunto, superdimensionado em 78%.

“....... o signatário entende que a sucção, da forma como aconteceu com a co-autora, não estaria relacionada com o seu peso, podendo tal fato ter ocorrido, mesmo que ela possuísse maior ou menor massa, desde que seus cabelos se aproximassem do aludido ralo....”.

Frase minha: O parágrafo acima explica porque também adultos têm sido vitimadas por acidentes com ralos de piscinas.

Está ainda no artigo da Folha de São Paulo:
“Uma vez pronta a piscina, outras medidas são necessárias para que o lazer aquático seja seguro para todos."
"Augusto Araújo, diretor da fabricante Sodramar, aponta a sucção como um dos elementos que devem receber a atenção especial dos pais. “Dependendo do tamanho da piscina, há uma força muito grande nas saídas de água. O pior que pode acontecer é uma criança ficar presa pelo cabelo em um ralo desses”, alerta.

O texto a seguir não faz parte da reportagem - são palavras minhas.

Sr. Augusto Araújo:
Pois esse pior aí a que o senhor se refere, aconteceu com minha filha Flavia. A forte sucção do ralo da piscina em que ela nadava, sugou o cabelo dela, deixando-a presa embaixo dágua o que lhe causou um quase afogamento. As seqüelas? Flavia entrou em coma vigil irreversível, e vive – em sofrimento – há mais de 10 anos.

Sr. Augusto Araújo:
Não concordo que sejam os pais a "darem atenção especial" e terem que se preocupar se a sucção do ralo da piscina onde suas crianças brincam e se divertem, está ou não tão forte que lhes ofereça perigo de vida. Como exigir dos pais capacidade técnica para avaliar essa condição de perigo?! São os pais por acaso conhecedores da correta relação entre potência do motor de sucção e a metragem cúbica de água da piscina onde seus filhos brincam e se divertem?! Essa preocupação Sr. Augusto, deveria ser em primeiro lugar do fabricante do sistema de sucção da piscina, que deveria além de fazer constar em seus manuais a possibilidade de acidentes, caso exista desproporção entre o sistema de sucção da água e o tamanho da piscina, assim como também disponibilizar pessoa tecnicamente habilitada para orientar verbalmente o consumidor final. Em se tratando de evitar acidentes e mortes Sr.Augusto, isto seria o mais correto a ser feito. E essa preocupação deveria ser também do responsável pela manutenção e funcionamento da piscina. E - de novo – em se tratando de evitar acidentes graves, não seria demais que piscinas de uso público e coletivo tivessem obrigatoriamente que passar por fiscalização periódica e no caso de serem constatadas irregularidades, os responsáveis punidos, não simbolicamente claro, mas exemplarmente.

Ricardo Bargieri, presidente da fabricante Jacuzzi, participa desta matéria, mas limita-se a falar da limpeza da piscina. Senhor Ricardo Bargieri, o que falta para a empresa que o senhor preside admitir que minha filha teve os cabelos sugados por um ralo de fabricação Jacuzzi – instalado fora dos padrões técnicos de segurança por falta de informação da Jacuzzi? Senhor Ricardo Bargieri, o que falta para a empresa que o senhor preside assumir uma postura de responsabilidade civil e indenizar Flavia com um valor adequado e coerente com a dimensão e gravidade do acidente que lhe deixou em coma irreversível?! Senhor Ricardo Bargieri, uma empresa não se mantém líder apenas por estar bem posicionada no mercado, mas sim por assumir uma postura de responsabilidade social, onde fique claro que essa empresa está mais preocupada com vidas humanas do que com o seu próprio lucro.

Senhores juizes: E depois de mais de nove anos de luta pelos direitos de Flavia, o que ainda lhes falta para que a empresa Jacuzzi do Brasil seja exemplarmente condenada a pagar a Flavia uma indenização que me permita cuidar dela com a qualidade de vida que ela precisa e que lhe proporcione uma sobrevida digna!?

Obs: Os negritos do texto são meus.

Diversos

Todos os assuntos que não estiverem classificados nos outros tópicos serão listados aqui, independente de estarem relacionados com tecnologia.



  1. Ruby
  2. Programação Orientada a Objetos (POO)
  3. E você ? Ficando rico também ?
  4. Fiscalização acirrada !
  5. Geoprocessamento
  6. Internet sob rede elétrica
  7. BLOGAGEM COLETIVA "Justiça para Flavia"
  8. Premio Dardos
  9. Procurando emprego?
  10. Open Hack Day
  11. Google “paga eu”
  12. Cursos de Graduação Gratuitos
  13. O Google me achou, coincidências à parte…
  14. 6 coisas e 6 links
  15. E o Android chegou nos notebooks
  16.  
  17. Maldito Layout de terceiro…
  18. Pedido de Desculpas…
  19. Aos poucos…
  20. Menu horizontal com CSS (Tableless)
  21. Um pouco sobre o twitter
  22. Nem só de anuncios viverá o google…
  23. O crescimento do twitter
  24. O que fazer com televisores (monitores) velhos?
  25. Já usou seu pen drive hoje?
  26. Woverine já na internet
  27. QR Code
  28. E o FireFox ultrapassa o IE na Europa
  29. Internet pela rede elétrica regulamentada
  30. A possível quebra de paradigma do FireFox
  31. Malandro também se liga no Google
  32. Doe sangue você também
  33. Oracle compra a Sun
  34. Um terabyte de capacidade?
  35. A escória tem que escutar
  36. Pagar viagem para FDP só se for para a PQP (e sem volta)
  37. Um pouco sobre a TV máfia (vulgo TV Globo)
  38. CPI da Petrobras
  39. Nanotecnologia em cigarros?
  40. Bug do Twitter?
  41. Processador de 1THz? Também quero
  42. Como é que eu nunca usei o Oper antes?
  43. Queremos Edmar castelão na prisão
  44. A Microsoft e seu projeto Natal
  45. Será que agora o PT ainda segura ele?
  46. Tio Bill confirma projeto Natal em PCs
  47. Desativar o IE?
  48. Firmada grande parceria em buscas na web
  49. E a gripe suína?
  50. Cara de pau é pouco…
  51. Pen Drive espião (Stealth iBot Computer Spy)
  52. Pede pra sair bigode fdp !
  53. Campanha de amor a pátria
  54. A nuvem em alta
  55. Os processos do Castelão
  56. Campanha ficha limpa
  57. Blog Action Day
  58. Conheça um pouco mais sobre energia limpa
  59. Lista de políticos com ficha suja
  60. De volta, aos poucos…
  61. É possível ficar pior ?
  62. Android e eu
  63. Um exemplo a ser seguido (até agora) deputado José Reguffe
  64. Boa Senador

quarta-feira, 3 de setembro de 2008

Usando o Oracle I


Olá a todos, nesta série de artigos vamos dar uma pincelada nos fundamentos SQL, como criar usuarios, tabelas, procedimentos, entre outras coisas.
Nesse que será o primeiro vamos criar uma pequena base de dados para os artigos seguintes, para os que ainda não possuem, podem baixar a versão gratuita do Oracle aqui, para a instalação existe um documento oficial, não é complicado de se fazer, devemos apenas nos atentar para não esquecer a senha dos usuários de administração do banco.
Criando um usuário
Antes de mais nada, devemos logar no banco como SYSTEM para podermos criar nosso usuário para então iniciar o processo de construção de nossa base:
Criando o usuário CURSO_SQL com senha de mesmo nome:
CREATE USER CURSO_SQL IDENTIFIED BY CURSO_SQL;
Agora precisamos garantir a esse usuário direitos de acesso e criação na base:
GRANT CREATE TABLE, CREATE PROCEDURE, CREATE TRIGGER, CREATE SEQUENCE, CREATE VIEW, CREATE SESSION TO CURSO_SQL;
E por fim garantir acesso a tablespace:
GRANT UNLIMITED TABLESPACE TO CURSO_SQL;
Criando as tabelas
Após logar com o usuário criado anteriormente devemos criar nossa tabelas, antes dos códigos SQL vamos dar uma olhada em alguns dos tipos de dados e depois nos comandos necessários.
  • VARCHAR2(tamanho) - Conjunto de caracteres de comprimento variável, caso o tamanho especificado não seja atingido o que resta não ocupa espaço no banco.
  • CHAR(tamanho) - Conjunto de caracter de comprimento fixo, mais utilizado para campos de tamanho fixo.
  • NUMBER(t, d) - Números fixos ou de ponto flutuante, onde o numero apos a virgula define o total de casas decimais
  • DATE - Datas, armazena inclusive horas, minutos, segundos e século.
  • NVARCHAR2 - Conjunto de caracteres de comprimento variável que usam o conjunto nacional de caracteres, como o japones.
  • NCHAR - Conjunto de comprimento fixo que usam o conjunto nacional de caracter.
  • ROWID - Usado para armazenar rowids físicos (Endereço físico do registro no Banco de Dados).
  • RAW e LONG RAW - Usado para armazenar grandes quantidades de dados binários e figuras
  • BLOB - Dados binários de até 4 gigabytes.
  • BFILE - Dados binários armazenados em um arquivo externo.
Devemos respeitar certas regras antes da criação das tabelas:
  • Os nome devem iniciar com uma letra;
  • Devem ter de 1 a 30 caracteres;
  • Devem conter somente AZ, az, 09, _, $ e #;
  • Não podem ter o mesmo nome de outro objeto do mesmo usuário;
  • Não podem duplicar o nome de um objeto do Oracle;
O comando para criação:
  • CREATE TABLE [esquema.]tabela(coluna tipo_de_dados [DEFAULT expr][, ...]);
ou com base em uma subconsulta:
  • CREATE TABLE tabela[(coluna, coluna...)] AS subconsulta;
Para adicionar, modificar ou eliminar colunas:
  • ALTER TABLE tabela ADD (coluna tipo_de_dados [DEFAULT expr][,coluna tipo_de_dados]...);
  • ALTER TABLE tabela MODIFY (coluna tipo_de_dados [DEFAULT expr][,colun tipo_de_dados]...);
  • ALTER TABLE tabela DROP (coluna);
Para apagar uma tabela
  • DROP TABLE tabela;
Restrições
Além da criação das tabelas precisamos definir um conjunto de restrições para garantir a integridade relacional da base.
Podemos definir as restrições durante a criação da tabela
Nivel de coluna
  • CREATE TABLE [esquema.]tabela (coluna tipo_de_dados [DEFAULT expr][restrição_de_coluna],...[restrição_de_tabela][,...]);
ou Nivel de tabela
  • CREATE TABLE employees(employee_id  NUMBER(6), first_name   VARCHAR2(20), ... job_id VARCHAR2(10) NOT NULL,  CONSTRAIN emp_emp_id_pk  PRIMARY KEY (EMPLOYEE_ID));
Tipos de restrição
  • NOT NULL - Garante que na coluna indicada não serão aceitos valores nulos;
  • UNIQUE - Impossibilita que existam valores repetidos para determinada coluna;
  • PRIMARY KEY - Chave primária da tabela, pode haver apenas uma para cada tabela, identifica exclusivamente cada registro na tabela (é a combinação de NOT NULL E UNIQUE);
  • FOREIGN KEY - Chave estrangeira, responsável pela integridade referencial, estabelece um relacionamento entre a chave primaria ou exclusiva na mesma tabela ou em uma outra;
  • CHECK - Define uma condição a ser satisfeita no momento dacriação de uma tabela;
Criando as tabelas para os artigos posteriores
Nosso esquema será como o modelo abaixo:
Agora o código:
--
--
-- ## FORNECEDORES ##
CREATE TABLE FORNECEDORES( FORNECEDOR_ID NUMBER(9),
                           NOME          VARCHAR2(50),
                           EMAIL         VARCHAR2(30)
                          );   
--
ALTER TABLE FORNECEDORES ADD CONSTRAINT PK_FORNECEDOR PRIMARY KEY (FORNECEDOR_ID);
--
--
-- ## PRODUTOS ##
CREATE TABLE PRODUTOS( PRODUTO_ID     NUMBER(9),
                       DESCRICAO      VARCHAR2(80),
                       VALOR_UNITARIO NUMBER(10,2),
                       FORNECEDOR_ID  NUMBER(9)
                     );
--
ALTER TABLE PRODUTOS ADD CONSTRAINT PK_PRODUTOS PRIMARY KEY (PRODUTO_ID);
ALTER TABLE PRODUTOS ADD CONSTRAINT FK_PRODUTOS FOREIGN KEY (FORNECEDOR_ID) REFERENCES FORNECEDORES (FORNECEDOR_ID);
--
--
-- ## FUNCIONARIOS ##
CREATE TABLE FUNCIONARIOS( FUNCIONARIO_ID NUMBER(9),
                           NOME           VARCHAR2(50),
                           DATA_ADMISSAO  DATE,
                           DATA_DEMISSAO  DATE
                         );
--
ALTER TABLE FUNCIONARIOS ADD CONSTRAINT PK_FUNCIONARIOS PRIMARY KEY (FUNCIONARIO_ID);
--
--
-- ## CLIENTES ##
CREATE TABLE CLIENTES( CLIENTE_ID NUMBER(9),
                       NOME       VARCHAR2(50),
                       TELEFONE   VARCHAR2(20),
                       ENDERECO   VARCHAR2(100)
                     );
--
ALTER TABLE CLIENTES ADD CONSTRAINT PK_CLIENTES PRIMARY KEY (CLIENTE_ID);
--
--
-- ## PEDIDOS ##
CREATE TABLE PEDIDOS( PEDIDO_ID      NUMBER(9),
                      DATA_PEDIDO    DATE,
                      OBSERVACAO     VARCHAR2(100),
                      FUNCIONARIO_ID NUMBER(9),
                      CLIENTE_ID     NUMBER(9)
                    );
--
ALTER TABLE PEDIDOS ADD CONSTRAINT PK_PEDIDOS PRIMARY KEY (PEDIDO_ID);
ALTER TABLE PEDIDOS ADD CONSTRAINT FK_PEDIDOS_FUN FOREIGN KEY (FUNCIONARIO_ID) REFERENCES FUNCIONARIOS (FUNCIONARIO_ID);
ALTER TABLE PEDIDOS ADD CONSTRAINT FK_PEDIDOS_CLI FOREIGN KEY (CLIENTE_ID) REFERENCES CLIENTES (CLIENTE_ID);
--
--
-- ## ITEM_PEDIDOS ##
CREATE TABLE ITEM_PEDIDOS( PEDIDO_ID      NUMBER(9),
                           SEQUENCIA_ITEM NUMBER(9),
                           QUANTIDADE     NUMBER(4),
                           VALOR_ITEM     NUMBER(10,2),
                           PRODUTO_ID     NUMBER(9)
                         );
--
ALTER TABLE ITEM_PEDIDOS ADD CONSTRAINT PK_ITEM_PEDIDOS PRIMARY KEY(PEDIDO_ID, SEQUENCIA_ITEM);
ALTER TABLE ITEM_PEDIDOS ADD CONSTRAINT FK_ITEM_PEDIDOS_PED FOREIGN KEY(PEDIDO_ID) REFERENCES PEDIDOS (PEDIDO_ID);
ALTER TABLE ITEM_PEDIDOS ADD CONSTRAINT FK_ITEM_PEDIDOS_PRO FOREIGN KEY(PRODUTO_ID) REFERENCES PRODUTOS (PRODUTO_ID);
--
Bom, essa foi a introdução, agora que nossa base está construida iremo nos proximos artigos manipular as informações.