Mostrando postagens com marcador oracle. Mostrar todas as postagens
Mostrando postagens com marcador oracle. Mostrar todas as postagens

quinta-feira, julho 11, 2013

Enviando e-mail a partir do Oracle

HI,

Muito bom esse recurso do Oracle. Implementei hoje uma rotina de envio de e-mail. Pedi pro DBA liberar as permissões. Criei a procedure para enviar o e-mail e outra procedure para pegar os usuários e disparar o e-mail para cada um.

Só enfrentei um problema. Não estava mantendo a acentuação. Mas com uma busca no google encontrei a solução. Pra considerar a acentuação tem que usar o comando UTL_SMTP.WRITE_RAW_DATA(v_mail_conn, UTL_RAW.CAST_TO_RAW(UTL_TCP.CRLF || p_mensagem)); ao invés de utilizar UTL_SMTP.WRITE_DATA(v_mail_conn, UTL_TCP.CRLF || p_mensagem);

Segue os links que utilizei.

Como resolver problema de acentuação usando utl_smtp?
http://glufke.net/oracle/viewtopic.php?t=4670

Email From Oracle PL/SQL (UTL_SMTP)
http://www.oracle-base.com/articles/misc/email-from-oracle-plsql.php

RES: [oracle_br] Enviar e-mail pelo Oracle com Con teúdo HTML
http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/msg16433.html




Fiquem na Paz!!!!

quarta-feira, agosto 01, 2012

Executando um loop entre uma diferença de datas no Oracle

HI,

Vou precisar criar uma procedure para inserir/atualizar dados de acordo com um período informado. Se for para inserir, criar um registro para cada data do período informado.

Ex: Período de 01/06/2012 à 03/06/2012, taxa 5%

Quando for inserir, a procedure vai criar 3 registros na tabela
01/06/2012 - 5
02/06/2012 - 5
03/06/2012 - 5

Antes de partir para a procedure, criei a lógica que vou precisar.


declare


data_inicial date;
data_final date;
num_dias number;

begin


data_inicial := to_date('10/06/2012','DD//MM/YYYY');
data_final := to_date('20/06/2012','DD//MM/YYYY');


dbms_output.put_line( 'data inicial: ' || to_char(data_inicial,'DD/MM/YYYY'));
dbms_output.put_line( 'data final: ' || to_char(data_final,'DD/MM/YYYY'));


num_dias := (data_final - data_inicial)+1;


dbms_output.put_line( 'dias: ' || num_dias);
dbms_output.put_line( '' );


for i in 1..num_dias loop
  dbms_output.put_line( 'data: ' || to_char((data_inicial-1)+i,'DD/MM/YYYY') || ', dia ' || i);
end loop;


end;

Resultado da execução da instrução pl/sql




Nesse endereço tem informações sobre loop no oracle


Fiquem na Paz!!!

terça-feira, junho 26, 2012

Update a partir de uma select no Oracle

HI,

Passei a vida toda apenas utilizando o select/insert para popular uma tabela a partir do resultado de uma consulta. Mas ontem precisei além de inserir, também atualizar. Não queria executar a query duas vezes para fazer isso, um select/insert para inserir e um loop em outra query para atualizar.

Sabia que no MySql tem esse recurso de inserir se não existir, e se existir, atualizar. Então fui perguntar ao Google como fazer isso no Oracle. Descobri que existe o comando MERGE, que serviria para o meu propósito.

Comando MERGE
http://psoug.org/reference/merge.html


Agora vou relatar os problema que enfrentei para conseguir executá-lo.

Eu modifiquei a procedure e passou a ocorrer esse erro: ORA-00918: column ambiguously.

Passei um bom tempo para achar esse erro, já que analisando a query não via nenhum problema aparente já que todos os campos estavam precedidos por aliases. Ex:. a.id = b.id.

Pesquisando no google vi que o problema era a repetição de um campo na select. É que antes no select/insert, existiam dois campos que recebiam o mesmo valor: Insert into teste(id, viagens1, viagens2) select id, viagens, viagens from teste2.

Foi aqui que achei a solução para o problema ORA-00918: column ambiguously no MERGE
https://forums.oracle.com/forums/thread.jspa?messageID=10327846


Outro problema que enfrentei foi esse: ORA-30926: unable to get a stable set of rows in the source tables.

No teste para identificar se o registro existe ou não, coloquei apenas 1 campo e minha chave primaria possui 3 campos.

Achei a solução aqui
http://stackoverflow.com/questions/2337271/ora-30926-unable-to-get-a-stable-set-of-rows-in-the-source-tables

Um outro erro que acontece é se colocar um campo da chave primaria no update para ser atualizado.



Fiquem na Paz!!!



quinta-feira, abril 26, 2012

Erro ORA-06502 usando function do Oracle no Asp.Net

HI,

Mais um erro que deu um pouco de trabalho.

Ao chamar uma function do oracle que retorna um valor string deu o erro ORA-06502. Já tinha usando uma que retornava um valor do tipo data e não deu problema nenhum.

Recorrendo ao google, encontrei essa solução:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small – Solution
http://maniish.wordpress.com/2007/05/16/ora-06502-plsql-numeric-or-value-error-character-string-buffer-too-small-solution/


Foi só definir o tamanho Size do parâmetro de retorno que ficou beleza.


command.Parameters.Add(new OracleParameter("valor_config", OracleDbType.Varchar2, ParameterDirection.ReturnValue));
command.Parameters["valor_config"].Size = 100;




Fiquem na Paz!!!

quarta-feira, abril 25, 2012

Autonomous Transactions - ORACLE

HI,

Ontem precisei criar uma trigger que de acordo com determinada condição iria provocar um raise_application_error e com isso abortar o processo de um sistema web adquirido aqui na empresa que trabalho.

Como a mensagem de erro desse raise não estava sendo exibida para o usuário, resolvi criar uma tabela de log para gravar um registro quando acontecesse esse erro. Percebi que mesmo desabilitando o comando raise, estava provocando erro na aplicação web, então deduzi que seria o COMMIT para salvar os dados dessa tabela de log.

Fui pesquisar como realizar esse commit sem afetar a transação da aplicação web. Foi aí que descobrir esse tal de Autonomous Transactions.

Autonomous Transactions
http://www.oracle-base.com/articles/misc/autonomous-transactions.php

Implementei uma procedure para gravar o registro e ficou na medida usando esse recurso de transação autônoma.

Para maiores informações tem esse site aqui.
http://pscoliveira.blogspot.com.br/2007/11/autonomous-transactions.html


Tem uma dica aqui de como criar a sua exceção
http://stackoverflow.com/questions/6020450/oracle-pl-sql-raise-user-defined-exception-with-custom-sqlerrm



Fiquem na Paz!!!!


PS: De acordo com contador do blog esse é o Post de número 200. Ebaaaaaaaaaa!!!!!!


segunda-feira, abril 09, 2012

Obter o retorno de uma procedure do oracle através de parâmetro no C#

HI,

Estava precisando obter a matrícula de um usuário que foi criado no banco de dados, para exibir em um dialogo no navegador.

Já sabia como receber o resultado de uma query para exibir em um grid, por exemplo, utilizando procedure, mas obter apenas um valor, ainda não.

Achei essa dica aqui sobre o assunto

Getting values back from Oracle Procedures in C# .Net
http://csharpdeveloper.wordpress.com/2009/01/14/getting-values-back-from-oracle-procedures-in-c-net/

Nessa dica também tem como pegar o resultado de uma função do Oracle.


Fiquem na Paz!!!

segunda-feira, fevereiro 27, 2012

Obter o valor da sequence gerada ao inserir um registro no oracle.

HI,

Acabei de aprender isso e já estou disponibilizando aqui.

Situação:

Criei uma procedure para chamar duas outras procedures. Uma cria o registro Pai e a outra o registro Filho.

Eu tinha que passar o código do registro Pai para a procedure dois.

Antes tinha resolvido isso armazenando o valor da sequence em uma variável e depois passava para as duas procedures, ficando assim:


create or replace procedure INSERIR_MSG_USUARIO(pusr_id    number,
                            ptitulo   varchar2, pmensagem   varchar2, pcod_sistema     number)
is
        seq number := 0;
begin
        select cam_nrid.nextval into seq from dual;
   
        inserir_campanha('MENSAGEM AUTOMÁTICA AO USUÁRIO',
                         ptitulo, pmensagem, pcod_sistema, seq);
                            
        inserir_registro_envio(seq, pusr_id, sysdate);    
end;

Essa procedure é só para exemplificar.

Pesquisando no google achei como obter o código da sequence na clausula INSERT, e retornar o seu valor através de um parâmetro do tipo OUT.

Obtendo o valor da Sequence

Retornado um valor através da procedure


Usando o returning não precisei mais dessa linha: select cam_nrid.nextval into seq from dual;

Espero que possa ser útil.

Fiquem na Paz!!!

quarta-feira, janeiro 25, 2012

Erro Oracle + Windows Forms

HI,

Hoje fiz meu primeiro programa em Windows Forms Application (será que vou abandonar o Delphi 7, hehehe?).

E é um programa pra valer, não é teste de aprendizado. E tinha que acessar o Oracle.

Só que ao executar um select, deu o seguinte erro: System.IO.FileNotFoundException was unhandled oracle

Achei a solução aqui
https://forums.oracle.com/forums/thread.jspa?threadID=696384

A solução é essa
This issue occurs when your on a 64bit version of Windows. Change the target CPU in to x86 and things work fine.

ou seja: vai em propriedades do projeto, opção Build, e altera a propriedade Plataform target para x86

Fiquem na Paz!!!

terça-feira, janeiro 10, 2012

Exibir uma foto armazenada no oracle em um site asp.net

HI,

Precisei aprender isso hoje.

Pegar a foto de um cadastro e exibir na página. As imagens encontram-se armazenadas no banco de dados.

Consegui usando esses códigos

Insert /retrieve an image into/ from a blob field in Oracle database using C#.Net
http://www.codeproject.com/KB/database/Blobfield.aspx

Aconteceu esse erro: Não foi possível localizar uma parte do caminho

Achei a solução nesse forum
http://www.devmedia.com.br/forum/net/398027-Upload-Com-Asp-Net-C.html

Usei o this.Server.MapPath para gravar corretamente a imagem em disco para poder exibir no componente Image.


Fiquem na Paz!!!!

segunda-feira, julho 11, 2011

Abreviando nome no Oracle

HI,

Para melhorar a comparação entre um nome digitando com um armazenado no banco, resolvi utilizar uma função para auxiliar. Dei preferência por essa que retorna apenas o primeiro e último nome. Assim se tiver armazenado abreviado, não tem problema. Não se trata de uma comparação crítica, é para validar a abertura de uma conta aonde o usuário precisa acertar um documento de identificação, a data de nascimento e o nome da mãe.

Código da função


CREATE OR REPLACE FUNCTION abrevia_nome (pValue IN VARCHAR2)
RETURN VARCHAR2 IS

nome VARCHAR2(100);
Saida VARCHAR2(2000);

BEGIN
nome := pValue;
SELECT SubStr(nome, 1, INSTR(UPPER(NOME), ' ')) ||
REVERSE(Trim(SubStr(REVERSE(nome), 1, INSTR(UPPER(REVERSE(NOME)), ' ')))) INTO saida FROM dual;

RETURN Nvl(Saida, pValue);
END; -- Funcao abrevia_nome


achei ela aqui

Fiquem na Paz!!!!

sábado, março 21, 2009

Retornar a data do primeiro e do último dia da semana

HI,

Estou trabalhando em uma rotina para enviar a rota da semana para os vendedores. Minha idéia foi de enviar todos os registros da semana, e não apenas do dia atual até o último dia da semana.

Então como fazer para enviar os registros que estão entre Domingo e Sábado ?

Abrir o delphi e fiz um algotimo para pegar a data do primeiro dia (Domingo) da semana e do último (Sábado) dia.

Ficou assim:

procedure TForm1.BitBtn1Click(Sender: TObject);
Var DiaSemanaHoje : Byte;
begin
DiaSemanaHoje := DayOfWeek(Date());

Edit2.Text := DateToStr(Date() - (DiaSemanaHoje - 1));
Edit3.Text := DateToStr(Date() + (7 - DiaSemanaHoje));
end;

Preciso utiliza isso no Oracle. Então lá vou eu para a home page do banco de dados (utilizo o oracle express aqui no note).

Peguei o exemplo que se encontra aqui no blog para pegar o dia da semana e bolei essa Sql:

select SYSDATE AS HOJE,
SYSDATE - (to_char(SYSDATE, 'D') - 1) AS DOMINGO,
SYSDATE + (7 - to_char(SYSDATE, 'D')) AS SABADO
from dual

Pronto. Já posso trabalhar com essa lógica no Where.

Mas aí achei um jeito mais simples, hehehe.

Pegar pelo dia da semana no ano.

Então o Where vai ficar assim (Delphi):

Sql.Add('Where to_char(SYSDATE, ''WW'') = ' + IntToStr(WeekOfTheYear(Date)));

Espero que possa ajudar mais alguém com isso.


[editando]

Mostrei esse código a um amigo que é DBA e ele me mostrou outra maneira de pegar as datas do primeiro e último dia da semana utilizando a função do NEXT_DAY do Oracle.

select sysdate AS HOJE ,
TRUNC(next_day(sysdate,'MONDAY')-8) as DOMINGO,
TRUNC(next_day(sysdate,'SATURDAY')) as SABADO
from dual

Acabei utilizando essa lógina no meu Where. É que pegando a semana do Ano deu bug, hehehe. Não retornou a Segunda e a Terça.

Where TRUNC(Data) BetWeen TRUNC(next_day(sysdate,'MONDAY')-8) and TRUNC(next_day(sysdate,'SATURDAY'))

Esse TRUNC é para retornar a data sem a parte da hora.

[/editando]

Até +

segunda-feira, março 02, 2009

Formatação de Datas no Oracle

Dica para formatar uma data no Oracle.

AM - AM ou PM
CC - Século
D - Dia da semana (1-7)
DAY - Dia da semana ('SUNDAY')
DD - Dia do mês (1-31)
DDD - Dia do ano
DY - Dia da semana abreviado ('SUN')
FM - Tira os blanks ou Zeros da esquerda
HH - Hora do dia (0-12)
HH24 - Hora do dia (0-24)
MI - Minutos da Hora
MM - Mês com 2 dígitos
MON - Mês abreviado ('NOV')
MONTH - Mês por extenso ('NOVEMBER')
PM - AM ou PM
RR - Ano com 2 dígitos - especial
RRRR - Ano com 4 dígitos
SS - Segundos do minuto(0 - 59)
SSSSS- Segundos do dia
W - Semana do Mês
WW - Semana do Ano
YEAR - Ano por extenso
YY - Ano com 2 dígitos
YYYY - Ano com 4 dígitos


Achei essa dica quando precisei semana passada pegar o dia da semana, para determinar se era dia útil, sábado ou domingo.

Exemplo: select to_char(SYSDATE, 'D') from dual

Até Mais.

domingo, agosto 26, 2007

Mais Bancos di Grátis


Empregos Manager Online





Quando eu tava procurando material sobre o Oracle 10g, acabei descobrindo que a IBM também lançou as versão freeware do DB2, e lembrei que a Microsoft já tinha disponibilizado uma versão freeeware do SQL Server

Downloads

DB2 Express-C
SQL Server 2005 Express Edition

Mais detalhes nesse artigo do IDG Now!

Falows


----
Data Original: 2006-02-10 2:17:21 am

Oracle 10g di grátis

Essa versão freeware do Oracle veio em boa hora, tou precisando fazer uma aplicação minha conectar no Oracle. Poderia até instalar um pirata aqui, mas freeware é bem melhor, é só para desenvolver mesmo.

Limitações:

Máximo de 4G e 1Gb de Ram, mesmo que você tenha 10 giga de memória ram.

Download -> Oracle 10g Express Edition

Descrição na Página da Info

A versão gratuita do banco de dados da Oracle oferece interfaces SQL e PL/SQL, além de ter suporte à linguagens como Java, .NET e PHP. O Database XE traz também o recurso Oracle HTML DB, que fornece um rápido desenvolvimento e implementação de aplicativos da web. O banco de dados está disponível para os sistemas operacionais Linux e Windows de 32 bits. A versão gratuita armazena, no máximo, 4GB de informação e trabalha no limite de 1GB de memória RAM.

Falows


----
Data Original: 2006-02-10 1:40:23 am