AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 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

如何获得输出流的通知?

  • 772

我在函数中有调试消息。这些信息被提出来

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

我将我的日志文件设置为\o messages.txt

然后我做我需要做的事情\i process.sql

而当执行终止时,\o.

问题是我没有将通知引发的消息放入messages.txt。消息显示在屏幕上,但我希望将它们写入messages.txt

我怎么能那样做?

我尝试使用RAISE LOG...并将消息写入日志文件中......这不是我想要的。

我有一个解决办法

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

但我想知道如何在 plsql 客户端上使用 \i 和 \o 将消息放入 \o 中指定的文件中

我的客户端,在 cygwin 上是 psql (PostgreSQL) 8.2.11,服务器版本是 9.0.7

postgresql
  • 4 4 个回答
  • 33840 Views

4 个回答

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

    恐怕您不会喜欢这个答案,但目前似乎不可能。从psql 文档:

    将未来的查询结果保存到文件 filename 或将未来的结果通过管道传输到单独的 Unix shell 以执行命令。如果没有指定参数,查询输出将被重置为标准输出。

    “查询结果”包括从数据库服务器获取的所有表、命令响应和通知,以及查询数据库的各种反斜杠命令的输出(如 \d),但不包括错误消息。

    psql正如您所注意到的,交互式使用时无法重定向错误消息。

    (我一直在玩从 \o 到无济于事的各种重定向。看起来查询输出通道与获取错误消息的通道不同 - 甚至来自服务器的错误和在您的程序中引发的错误也会以不同的方式出现.

    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 包含

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

    在这两种情况下。这就是为什么我对用于输出从过程中引发的消息的通道/文件描述符一无所知的原因。))

    (PostgreSQL-hackers 上有一个帖子可能会阐明这个问题: http: //postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html)

    一个人可能做的就是psql开始

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

    这会将所有输出重定向到指定的文件。唯一的问题是您甚至没有提示,并且失去了命令行编辑功能。

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

    \!我们可以使用meta 命令直接从 psql 执行 shell命令。

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

    打开. debug.txt_\e

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

    raise 消息将显示在您的默认编辑器中。有点棘手,对于命令行爱好者来说仍然很方便。

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

    不是原始问题的解决方案,而是 OP 解决方法的补充(这对我不起作用)


    使用以下作为 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;
    



    我不确定,为什么将输出写入 OP 中所述的文件不起作用,但将其通过管道传输到tee实际上可以解决:

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


    Tee 将标准输入写入一个或多个文件并返回标准输出。因此,您将在控制台和您提供的文件中拥有所有 RAISE 语句。(参见tee 的手册页)


    配置:

    • Postgres 8.4
    • 赛格温 2.0.2
    • 三通 8.23
    • 0
  4. mosh
    2020-10-10T21:10:15+08:002020-10-10T21:10:15+08:00

    这是一个打印到 stdout 和 stderr 的函数,可用于跟踪云上的脚本运行。

      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

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve