5

我在从 plv8.elog() 获取正确输出时遇到问题。刚开始,我在 Ubuntu 12.10 上使用 pgxn 安装的 PostgreSQL 9.2、plv8 1.4.1。我正在构建一个包含嵌套游标循环并使用许多准备好的语句的函数。我正确地关闭了游标并释放了准备好的语句。所有这些功能都会生成一个对象数组,这些对象是将插入许多不同表中的记录。

它发生故障的地方是我使用对象中的数据循环遍历该数组以生成查询字符串。我正处于这部分代码的构建阶段,所以在我通常会执行查询字符串的地方,我尝试将其输出到控制台。这就是腐败发生的地方。

当输出它在我的测试中生成的 9 个查询字符串时,只显示其中的 7 个。当我进入 postgres 日志时,我发现在 2 个缺失的查询字符串的末尾,有一个看起来像带有问号的菱形的字符。基本上是一些在当前字符集中无法显示的字符。我已经测试了查询生成器代码的所有部分,但找不到任何原因。我相信 plv8.elog() 函数或 plv8 引擎的字符串连接功能由于某种原因正在损坏。

我遇到的问题是,如果它是字符串连接功能,我不能相信查询字符串能够正确执行。我已经通过从函数中删除代码并使用数组中的静态信息来测试代码。在这种情况下,它工作正常,所以我知道这部分代码没有问题。

首先,有没有其他人见过这个?plv8.elog() 的损坏或怪异行为?当您的函数达到一定的大小或复杂性时,是否有任何数据损坏?如果是这样,您是否能够找到一种至少解决它的方法?

另外,如果它是 plv8.elog() 函数,还有另一种获取变量值的方法吗?我知道应该有 v8 调试器功能,但我没有成功让它工作。如果有人有让它工作的经验,你能帮我让它工作吗?谢谢。

4

2 回答 2

1

发生这种情况是因为 plv8 的日志输出仅限于一定数量的字节/位。如果您要连接几个长字符串并将其发送到plv8.elog(),它将在达到最大字节/位数后切断字符串。为了解决这个问题,我这样做:

plv8.elog(INFO, myString.substring(0,800));
plv8.elog(INFO, myString.substring(801,1600));
plv8.elog(INFO, myString.substring(1601,2400));

我认为限制是 1024,但其中一些被INFO:部分日志输出占用。

于 2015-08-14T22:39:50.127 回答
0

正如bendy 所说,这似乎是一个plv8/postgresql 限制(我从未尝试在plpgsql 中输出如此大的字符串......)。

我搜索了太多次没有运气的解决方案,所以我做了自己的工作:

plv8_console.js

它远非完美,但删除 'NOTICE: -> ' 部分并加入 (:s/\n// in vim) 可以恢复任何大小的有效 JSON。

希望它可以有用...

于 2015-10-09T16:45:25.593 回答