5

在 SQL Server 中,我可以从应用程序中复制 sql 代码并将其粘贴到 SSMS 中,声明并分配 sql 中存在的变量并运行。是的,很棒的调试场景。

例如(请注意我生疏了,语法可能不正确):

declare @x as varchar(10)
set @x = 'abc'
select * from sometable where somefield = @x

我想在 pgAdmin(或另一个 postgres 工具,有什么建议吗?)中使用 Postgres 做类似的事情,我可以将我的 SQL(参数和所有)放入将针对 Postgres DB 运行的东西中。

我意识到你可以创建 pgscript,但它似乎不是很好,例如,如果我做上面的等价物,它不会在 @x 中的值周围加上单引号,也不会让我通过将它们加倍,之后您就没有桌子了-只有文字...

目前我有一段 SQL 有人写过,其中有 3 个唯一变量,每个变量使用大约 6 次......

所以问题是其他人如何有效地调试 SQL ,最好以类似于我的 SQL Server 时代的方式。

4

3 回答 3

1

我会尝试编写一个包装查询的SQL 函数。它可以是简单的

CREATE OR REPLACE FUNCTION my_function(integer, integer) 
RETURNS integer
AS
$$
    SELECT $1 + $2;
$$ 
LANGUAGE SQL;

SELECT my_function(1, 2);

我会这样做而不是 PREPARE,因为更新它会更简单。根据函数的复杂程度,您可能还想查看 Postgres 中的其他一些PL

于 2010-07-16T04:10:14.057 回答
1

您可以使用用于处理语句的 PREPARE、EXECUTE、DEALLOCATE 命令来实现这一点,这正是我们在这里讨论的内容。

例如:

PREPARE test AS SELECT * FROM users WHERE first_name = $1;
EXECUTE test ('paul');
DEALLOCATE test;

也许不像某些人喜欢的那样图形化,但肯定是可行的。

于 2012-10-11T09:59:18.307 回答
0

SQL procs 是出了名的难以调试。我蹩脚但实用的解决方案是将日志消息写入日志表,如下所示(请原谅语法问题):

create table log_message (
  log_timestamp timestamp not null default current_timestamp,
  message varchar(1000)
);

然后将行添加到您的存储过程中,例如:

insert into log_message (message) values ("The value of x is " || @x);

然后在运行后:

select * from log_message order by 1;

它不漂亮,但适用于每个数据库。

于 2010-07-17T12:41:50.933 回答