AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 23612
Accepted
Luc M
Luc M
Asked: 2012-09-04 20:47:38 +0800 CST2012-09-04 20:47:38 +0800 CST 2012-09-04 20:47:38 +0800 CST

Como obter avisos para o fluxo de saída?

  • 772

Eu tenho mensagens de depuração em funções. Essas mensagens são levantadas como

RAISE NOTICE 'Value of id : %', id;

Eu configurei meu arquivo de log com\o messages.txt

Então eu faço o que eu preciso fazer com\i process.sql

E quando a execução é encerrada, \o.

O problema é que não tenho as mensagens geradas por avisos em messages.txt. As mensagens são exibidas na tela, mas eu quero que elas sejam escritas em messages.txt

Como eu poderia fazer isso?

Tentei usar RAISE LOG...e as mensagens são escritas em arquivo de log... Não é o que eu quero.

Eu tenho um trabalho com

plsql -f /path/to/process.sql > messages.txt 2>&1

mas gostaria de saber como poderia usar \i e \o no cliente plsql tendo as mensagens no arquivo especificado em \o

Meu cliente, no cygwin é o psql (PostgreSQL) 8.2.11 e a versão do servidor é 9.0.7

postgresql
  • 4 4 respostas
  • 33840 Views

4 respostas

  • Voted
  1. Best Answer
    dezso
    2012-09-05T00:44:19+08:002012-09-05T00:44:19+08:00

    Receio que você não goste desta resposta, mas atualmente parece impossível. Da documentação do psql :

    Salva os resultados da consulta futura no nome do arquivo ou canaliza os resultados futuros em um shell Unix separado para executar o comando. Se nenhum argumento for especificado, a saída da consulta será redefinida para a saída padrão.

    "Resultados da consulta" inclui todas as tabelas, respostas de comando e avisos obtidos do servidor de banco de dados, bem como a saída de vários comandos de barra invertida que consultam o banco de dados (como \d), mas não mensagens de erro.

    E como você notou, não há como redirecionar mensagens de erro ao usar psqlinterativamente.

    (Eu tenho brincado com todos os tipos de redirecionamento de \o sem sucesso. Parece que o canal de saída da consulta é diferente daquele que recebe mensagens de erro - e até mesmo erros do servidor e gerados em seus procedimentos seguem caminhos diferentes .

    test=# SHOW client_min_messages;
     client_min_messages
    ---------------------
     notice
    
    -- added the above to show it's not a config problem
    
    CREATE FUNCTION raise_test() RETURNS integer AS
    $body$
    BEGIN
        RAISE NOTICE 'notice';
        RETURN 1;
    END;
    $body$
    LANGUAGE plpgsql;
    
    test=# \o | cat > out.sql
    test=# SELECT raise_test(); -- you could put this in a file and call \i your_file, it's just the same
    NOTICE:  notice
    
    test=# \o | cat > out.sql 2>&1
    test=# SELECT raise_test();
    NOTICE:  notice
    

    out.sql contém

     raise_test
    ------------
              1
    (1 row)
    

    em ambos os casos. É por isso que não tenho ideia de qual descritor de canal/arquivo é usado para gerar as mensagens geradas por um procedimento.) )

    (Há um tópico sobre hackers do PostgreSQL que pode esclarecer esse problema: http://postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html )

    O que se poderia fazer é começar psqlcomo

    psql test >/tmp/psql.out 2>&1
    

    e isso redirecionará toda a saída para o arquivo especificado. O único problema com isso é que você nem tem um prompt e perde os recursos de edição da linha de comando.

    • 10
  2. Brain90
    2018-04-17T21:36:03+08:002018-04-17T21:36:03+08:00

    Podemos executar o comando shell diretamente do psql usando \!o comando meta.

    user@db=# \! psql -U user -h localhost your_db -e 'select your_function()' &> debug.txt
    

    aberto debug.txtcom \e.

    localhost:5432 user@db=# \e debug.txt
    

    mensagem de aumento será mostrada em seu editor padrão. um pouco complicado, ainda bastante útil para o amante do commandLine.

    • 4
  3. Father Stack
    2015-09-18T07:33:24+08:002015-09-18T07:33:24+08:00

    Não é uma solução para a pergunta original, mas uma adição à solução alternativa do OP (que não funcionou para mim)


    Com o seguinte como raiseTest.sql

    BEGIN;
    
    CREATE FUNCTION count_to_hundred() RETURNS VOID AS
    $_$
    BEGIN
        FOR i IN 1..100 
        LOOP
            RAISE NOTICE '%', i;
        END LOOP;
    
        RETURN;
    END;
    $_$
    LANGUAGE plpgsql;
    
    
    SELECT count_to_hundred();
    
    ROLLBACK;
    



    Não tenho certeza, por que escrever a saída em um arquivo como observado no OP não funciona, mas canalizá-lo para o tee realmente funcionou:

    psql -f raiseTest.sql 2>&1 | tee messages.txt
    


    Tee grava o stdin em um ou mais arquivos e volta no stdout. Assim, você terá todas as instruções RAISE em seu console e no(s) arquivo(s) fornecido(s). (cf. página de manual do tee )


    Configuração:

    • Postgres 8.4
    • Cygwin 2.0.2
    • tee 8,23
    • 0
  4. mosh
    2020-10-10T21:10:15+08:002020-10-10T21:10:15+08:00

    Aqui está uma função para imprimir em stdout e stderr, útil para rastrear execuções de script na nuvem.

      CREATE OR REPLACE
    Function debug_info(message text) Returns Text
      LANGUAGE plpgsql AS $_$
      declare
          -- Since server time will be in another TZ
          timeis text := to_char(now() at 
                   time zone 'Asia/Kolkata', 
                   'YYYY-MM-DD-HH24:MI');
          val    text := '';
      BEGIN
      RAISE   notice 'Date=% [%]', timeis, message;
      val :=  concat(timeis,' ',message);
      Return        val;
      END $_$;
    
    -- Usage in pgsql script
    ...
    select result from debug_info('doing hello world') as result;
    ..
    
    -- Outputs on stdout
    2018-11-11-20:25 doing hello world
    
    -- Output on stderr
    Date=2018-11-11-20:25 [doing hello world]
    
    • 0

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve