[oracle_br] Re: Rodar script no Unix a partir do PL/sql

2012-01-13 Por tôpico José Laurindo
 Denis, pelo que entendi acho que não é isso não que o colega quer : o Múcio 
tinha pedido "Como rodar um script no Unix partindo de rotina em PL/SQL", e o 
que vc faz abaixo é o contrário, ie, a partir de um shell script vc está 
conectando no Oracle via sqlplus e executando um SQL ou PL/SQL, é o inverso...

 []s

   Chiappa

--- Em oracle_br@yahoogrupos.com.br, "Denis G"  escreveu
>
> Múcio,
>  Crie um script neste formato. A query abaixo verifica o tamanho das 
> tablespaces.
> 
> Onde,
> /usr/bin/su - useroracle -c "sqlplus /nolog" < 
> 
> /usr/bin/su - oracle -c "sqlplus /nolog" < connect /as sysdba
> SET PAGESIZE 80 
> spool /scripts/checklist/log/chktb.log
> 
> select  a.TABLESPACE_NAME,
> ((a.BYTES/1024)/1024) BYTES_USED_MB,
> round(((b.BYTES/1024)/1024),2) BYTES_FREE_MB,
> round(((a.BYTES-b.BYTES)/a.BYTES)*100,2) percent_used
> from
> (
> select  TABLESPACE_NAME,
> sum(BYTES) BYTES 
> fromdba_data_files 
> group   by TABLESPACE_NAME
> )
> a,
> (
> select  TABLESPACE_NAME,
> sum(BYTES) BYTES ,
> max(BYTES) largest 
> fromdba_free_space 
> group   by TABLESPACE_NAME
> )
> b
> where   a.TABLESPACE_NAME=b.TABLESPACE_NAME
> order   by ((a.BYTES-b.BYTES)/a.BYTES) desc;
> 
> spool OFF
> quit
> EOF
> #
> 
> Lembrando, você deve estar com o korn shell.
> 
> Abraços
> 
> --- Em oracle_br@yahoogrupos.com.br, Mucio Oliveira  escreveu
> >
> > Grande Chiappa,
> >   Vou dar uma olhada nas tuas dicas e ver o que consigo...
> > Muito obrigado.
> > abs
> > 
> > Em 12 de janeiro de 2012 17:23, José Laurindo escreveu:
> > 
> > > **
> > >
> > >
> > > Múcio, primeiro ponto o PL/SQl roda NO SERVIDOR ORACLE, então o script a
> > > ser executado TEM QUE estar gravado/situado no servidor Oracle... Segundo,
> > > com 100% de certeza o PL/SQL é ** incapaz ** de interpretar/executar
> > > comandos Unix, ele teria que executar um programa que seja capaz, então a
> > > sua pergunta se torna :
> > >
> > > "Como executar um programa externo ao database no PL/SQL ?"
> > >
> > > Nós ** necessariamente ** precisamos dos detalhes do ambiente pra te dar a
> > > resposta exata (detalhes como : versão e Edição EXATA do RDBMS, versão
> > > exata do Sistema Operacional aonde o RDBMS roda - pra poder executar shell
> > > script ele deve ser algum unix-like, mas precisaríamos saber qual,
> > > exatamente- , o shell sendo usado pelo usuário do SO que executa o RDBMS,
> > > etc), mas de qquer maneira
> > > http://asktom.oracle.com/pls/asktom/f?p=100:11:0P11_QUESTION_ID:16212348050lista
> > >  algumas das opções pré-10g , e no 10g em diante nós temos a opção do
> > > SCHEDULER, que é capaz de não só executar comandos PL/SQL mas também
> > > executar programas externos,
> > > http://oracle-online-help.blogspot.com/2007/01/running-shell-script-from-oracle.htmltem
> > >  um exemplo...
> > >
> > > []s
> > >
> > > Chiappa
> > >
> > > --- Em oracle_br@yahoogrupos.com.br, Mucio Oliveira  escreveu
> > >
> > > >
> > > > Pessoal,
> > > > Grande 2012 p/ todos!
> > > >
> > > > Um help por favor.
> > > >
> > > > Como rodar um script no Unix partindo de rotina em PL/SQL ?
> > > >
> > > > Grato,
> > > > Mucio
> > > >
> > > >
> > > > [As partes desta mensagem que não continham texto foram removidas]
> > > >
> > >
> > >  
> > >
> > 
> > 
> > 
> > -- 
> > 'Ao sair do elevador, verifique se o andar está parado à sua frente.'
> > 
> > 
> > [As partes desta mensagem que não continham texto foram removidas]
> >
>




[oracle_br] Re: Rodar script no Unix a partir do PL/sql

2012-01-13 Por tôpico Denis G
Múcio,
 Crie um script neste formato. A query abaixo verifica o tamanho das 
tablespaces.

Onde,
/usr/bin/su - useroracle -c "sqlplus /nolog" < escreveu
>
> Grande Chiappa,
>   Vou dar uma olhada nas tuas dicas e ver o que consigo...
> Muito obrigado.
> abs
> 
> Em 12 de janeiro de 2012 17:23, José Laurindo escreveu:
> 
> > **
> >
> >
> > Múcio, primeiro ponto o PL/SQl roda NO SERVIDOR ORACLE, então o script a
> > ser executado TEM QUE estar gravado/situado no servidor Oracle... Segundo,
> > com 100% de certeza o PL/SQL é ** incapaz ** de interpretar/executar
> > comandos Unix, ele teria que executar um programa que seja capaz, então a
> > sua pergunta se torna :
> >
> > "Como executar um programa externo ao database no PL/SQL ?"
> >
> > Nós ** necessariamente ** precisamos dos detalhes do ambiente pra te dar a
> > resposta exata (detalhes como : versão e Edição EXATA do RDBMS, versão
> > exata do Sistema Operacional aonde o RDBMS roda - pra poder executar shell
> > script ele deve ser algum unix-like, mas precisaríamos saber qual,
> > exatamente- , o shell sendo usado pelo usuário do SO que executa o RDBMS,
> > etc), mas de qquer maneira
> > http://asktom.oracle.com/pls/asktom/f?p=100:11:0P11_QUESTION_ID:16212348050lista
> >  algumas das opções pré-10g , e no 10g em diante nós temos a opção do
> > SCHEDULER, que é capaz de não só executar comandos PL/SQL mas também
> > executar programas externos,
> > http://oracle-online-help.blogspot.com/2007/01/running-shell-script-from-oracle.htmltem
> >  um exemplo...
> >
> > []s
> >
> > Chiappa
> >
> > --- Em oracle_br@yahoogrupos.com.br, Mucio Oliveira  escreveu
> >
> > >
> > > Pessoal,
> > > Grande 2012 p/ todos!
> > >
> > > Um help por favor.
> > >
> > > Como rodar um script no Unix partindo de rotina em PL/SQL ?
> > >
> > > Grato,
> > > Mucio
> > >
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> >
> >  
> >
> 
> 
> 
> -- 
> 'Ao sair do elevador, verifique se o andar está parado à sua frente.'
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>




RES: [oracle_br] Re: AJUDA COM MERGE

2012-01-13 Por tôpico José Laurindo
  Então : primeiro de tudo, é normal o programador não ter privilégios de 
criação de tabela : necessariamente num ambiente controlado e gerenciado, ** 
nunca ** é o programador que cria tabelas, e sim o DBA ou no mínimo um DA, ou 
quando muito um Analista-chefe  Até por isso , o que sugerimos foi o 
programador *** usar *** apenas a nova tabela no programa dele, que (claro) 
necessariamente Teria que ser criada antes por alguém autorizado e dado o 
acesso para o programador poder usar...

 Porém, esse outro ponto que vc só agora nos dá muda ABSOLUTAMENTE tudo : cfrme 
nós dissemos, por definição o comando MERGE serve para ler uma ** TABELA ** 
origem, pesquisar a chave lida numa TABELA destino e se houve match fazer um 
UPDATE na tabela destino, e se não houve match fazer um INSERT na tabela 
destino - agora que vc fala que a origem dos dados NÂO é uma tabela mas sim um 
arquivo (XML, mas um ARQUIVO)  isso MUDA a história, completamente, nos 
AFASTAMOS do paradigma do MERGE ... 

  Em vista desse novo cenário, uma possibilidade pra se continuar usando o 
MERGE (isso SE o arquivo XML está criado no mesmo servidor Oracle aonde o RDBMS 
roda, E o usuário de SO que roda o RDBMS tem privilégio) é ** transformar ** 
(logicamente falando) o arquivo-texto numa 'tabela externa' : isso é um objeto 
que ao se fazer SELECT * dele , o banco busca os dados no arquivo-texto 
externo... Isso não cria nenhum segmento dentro do banco de dados, não exige de 
forma nenhuma que os dados do arquivo sejam importados pro database, o database 
é que vai abrir e ler o arquivo texto externo, como se estivesse fazendo FETCH 
de uma tabela via cursor, a "transformação" é LÓGICA, apenas... Isso 
funcionando, aí vc simplesmente usaria no MERGE como fonte de dados um SELECT * 
FROM tabelaexternaqueapontaproarquivoXML , e como destino no MATCH/NOMATCH a 
tabela real destino mesmo aonde os dados devem ser inseridos/updateados... 
  Eu não tenho aqui comigo um exemplo, mas a criação da tabela-externa seria + 
ou - algo tipo o mostrado em 
http://www.packtpub.com/article/external-tables-oracle-10g-11g-database-part2 
 

  Caso vc tenha problemas com o fato do arquivo ser XML (por exemplo, os dados 
não estão num formato consolidado, ou vc está usando um database que não te dá 
direito às as funções XML todas, como o cacareco do XE, por exemplo) , uma 
opção pra vc continuar usando essa técnica de acessar o arquivo como tabela é 
transformar o xml em arquivo-texto flat via algum utilitário , como 
http://xmlstar.sourceforge.net/overview.php por exemplo.

 Numa última opção, se vc realmente não puder transformar o arquivo numa tabela 
com o recurso do external table, aí vc Fatalmente não conseguirá usar o MERGE, 
aí sim seria o caso do programador fazer um loop/cursor, lendo cada linha do 
arquivo e fazendo a lógica de match/nomatch manualmente...

 []s

  Chiappa


--- Em oracle_br@yahoogrupos.com.br, "Giovanni Ferreira de Sousa" 
 escreveu
>
> Bom dia,
>  
> Chiappa e Ricardo,
>  
> É o seguinte, os dados de origem estão em um arquivo XML, e o programador não 
> tem privilégios para criar as tabelas, inserir os dados nessas tabelas, para 
> depois executar o MERGE. Sendo assim, gostaria de saber qual a melhor forma 
> carregar os dados do XML para a tabela de destino, tendo em vista que essa 
> tabela já possui dados.
>  
> Atenciosamente,
>  
> Giovanni.
>  
> 
> 
> 
> De: oracle_br@yahoogrupos.com.br em nome de José Laurindo
> Enviada: qui 12/1/2012 15:43
> Para: oracle_br@yahoogrupos.com.br
> Assunto: [oracle_br] Re: AJUDA COM MERGE
> 
> 
>   
> 
> É isso mesmo... O Colega vai explicar melhor, mas pelo jeito ele quer fazer 
> um UPSERT (UPdate se o dado existe, inSERT se o dado não existe), e realmente 
> pra se fazer isso via MERGE a origem e o destino tem que ser diferentes
> O que ele poderia fazer talvez é ** copiar ** os dados que servirão de origem 
> (até pra uma GTT, talvez) e aí sim fazer o MERGE, aí especificando a GTT como 
> fonte de dados para o MERGE e a tabela real tanto pra MATCH quanto pra 
> NON-MATCH ...
> 
> []s
> 
> Chiappa
> 
> --- Em oracle_br@yahoogrupos.com.br  , 
> Ricardo Tajiri  escreveu
> >
> > Oi Giovanni,
> > 
> > A idéia do MERGE é que você tem dados que estão em uma origem e quer
> > modificar um destino de acordo com estes dados.
> > 
> > Se o dado não existe na origem então você não vai conseguir inserir na mão
> > usando o MERGE... Agora, pra poder opinar melhor
> > em alguma outra solução é necessário que você nos dê mais informações sobre
> > o seu problema de verdade...
> > 
> > 
> > Ricardo Hideyuki Tajiri
> > LaRCom - FEEC - UNICAMP
> > 
> > 
> > Em 11 de janeiro de 2012 16:44, Giovanni Ferreira de Sousa <
> > giovanni.sousa@> escreveu:
> > 
> > > **
> > >
> > >
> > > Ricardo,
> > >
> > > É verdade, não estava atento a isso...vacilei ...
> > >
> > >
> > > Para este caso, se não existir, quero especificar (inserir) 

RES: [oracle_br] Re: AJUDA COM MERGE

2012-01-13 Por tôpico Giovanni Ferreira de Sousa
Bom dia,
 
Chiappa e Ricardo,
 
É o seguinte, os dados de origem estão em um arquivo XML, e o programador não 
tem privilégios para criar as tabelas, inserir os dados nessas tabelas, para 
depois executar o MERGE. Sendo assim, gostaria de saber qual a melhor forma 
carregar os dados do XML para a tabela de destino, tendo em vista que essa 
tabela já possui dados.
 
Atenciosamente,
 
Giovanni.
 



De: oracle_br@yahoogrupos.com.br em nome de José Laurindo
Enviada: qui 12/1/2012 15:43
Para: oracle_br@yahoogrupos.com.br
Assunto: [oracle_br] Re: AJUDA COM MERGE


  

É isso mesmo... O Colega vai explicar melhor, mas pelo jeito ele quer fazer um 
UPSERT (UPdate se o dado existe, inSERT se o dado não existe), e realmente pra 
se fazer isso via MERGE a origem e o destino tem que ser diferentes
O que ele poderia fazer talvez é ** copiar ** os dados que servirão de origem 
(até pra uma GTT, talvez) e aí sim fazer o MERGE, aí especificando a GTT como 
fonte de dados para o MERGE e a tabela real tanto pra MATCH quanto pra 
NON-MATCH ...

[]s

Chiappa

--- Em oracle_br@yahoogrupos.com.br  , 
Ricardo Tajiri  escreveu
>
> Oi Giovanni,
> 
> A idéia do MERGE é que você tem dados que estão em uma origem e quer
> modificar um destino de acordo com estes dados.
> 
> Se o dado não existe na origem então você não vai conseguir inserir na mão
> usando o MERGE... Agora, pra poder opinar melhor
> em alguma outra solução é necessário que você nos dê mais informações sobre
> o seu problema de verdade...
> 
> 
> Ricardo Hideyuki Tajiri
> LaRCom - FEEC - UNICAMP
> 
> 
> Em 11 de janeiro de 2012 16:44, Giovanni Ferreira de Sousa <
> giovanni.sousa@...> escreveu:
> 
> > **
> >
> >
> > Ricardo,
> >
> > É verdade, não estava atento a isso...vacilei ...
> >
> >
> > Para este caso, se não existir, quero especificar (inserir) o dado na mão
> > mesmo.
> > Tem como fazer isso, utilizando o merge. O que você sugere?
> >
> > Desde já agradeço a sua colaboração...
> >
> > Atenciosamente
> >
> > Giovanni.
> >
> >
> > 
> >
> > De: oracle_br@yahoogrupos.com.br   
> > em nome de Ricardo Tajiri
> > Enviada: qua 11/1/2012 15:28
> > Para: oracle_br@yahoogrupos.com.br  
> > Assunto: Re: [oracle_br] AJUDA COM MERGE
> >
> >
> > Oi Giovanni,
> >
> > A sua compreensão do comando MERGE que está incompleta...
> >
> > Como você mesmo disse, ele não existe na tabela
> > dbfunasasiasiprod.tb_carga_siasi_new.
> >
> > O MERGE executa as modificações na tabela em que está sendo feito o MERGE
> > de acordo com
> > dados provenientes de outro local. A idéia do WHEN NOT MATCHED seria a
> > seguinte:
> >
> > Se não existe na tabela com o álias "carga" do seu comando e *EXISTE* na
> >
> > tabela (subconsulta) com álias "x"
> > ele executa o INSERT. Porém, como você está usando a mesma tabela, tanto
> > para "carga" quanto para "x"
> > o dado não vai retornar em "x" e tb não executar o insert.
> >
> > Ricardo Hideyuki Tajiri
> > LaRCom - FEEC - UNICAMP
> >
> > Em 11 de janeiro de 2012 16:04, Giovanni Ferreira de Sousa <
> > giovanni.sousa@...> escreveu:
> >
> > > **
> >
> > >
> > >
> > > Prezados,
> > >
> > > Boa Tarde,
> > >
> > > Estou preparando o seguinte comando:
> > >
> > > merge into dbfunasasiasiprod.tb_carga_siasi_new carga
> > > using
> > > (
> > > select * from dbfunasasiasiprod.tb_carga_siasi_new
> > > where dbfunasasiasiprod.tb_carga_siasi_new.comando = 'teste7'
> > > )x
> > > on(carga.comando = x.comando)
> > > WHEN MATCHED THEN
> > > UPDATE SET
> > > carga.lote = 'atualizou'
> > > WHEN NOT MATCHED THEN
> > > INSERT (carga.comando,carga.lote,carga.dt_atualizacao)
> > > values(x.COMANDO,'inseriu',sysdate).
> > >
> > > Quando o dado existe o update é feito corretamente.
> > >
> > > Neste caso, o registro 'teste7' não existe na tabela, então, deveria ser
> > > feito o insert. O que há de errado? Gostaria que me ajudassem.
> > >
> > > Atenciosamente
> > >
> > > Giovanni
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> > >
> > >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> > 
> >
> >
> > --
> > >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de
> > inteira responsabilidade de seus remetentes.
> > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
> > --
> > >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package »
> > Procedure » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO!
> > VISITE: http://www.oraclebr.com.br/
> > -- Links do
> > Yahoo! Grupos
> >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> > 
> >
> 
> 
> [As