Отладка SQL в pgAdmin, когда SQL содержит переменные - PullRequest
5 голосов
/ 02 июня 2010

В SQL Server я мог бы скопировать код SQL из приложения и вставить его в SSMS, объявить и назначить переменные, которые существуют в SQL, и запустить. уе отличный сценарий отладки.

например. (обратите внимание, что я ржавый и синтаксис может быть неправильным):

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

Я хочу сделать что-то подобное с Postgres в pgAdmin (или другом инструменте postgres, какие-нибудь рекомендации?), Где я могу просто поместить свой SQL (params & all) во что-то, что будет работать с DB Postgres.

Я понимаю, что вы можете создать pgscript, но это не очень хорошо, например, если я делаю эквивалент выше, он не помещает одинарные кавычки вокруг значения в @x, и при этом позвольте мне удвоить их, и вы не получите таблицу после - только текст ...

В настоящее время я написал кусок SQL, в котором есть 3 уникальные переменные, которые используются около 6 раз ...

Таким образом, вопрос заключается в том, как другие люди эффективно отлаживают SQL , предпочтительно аналогично моим дням на SQL Server.

Ответы [ 3 ]

1 голос
/ 11 октября 2012

Этого можно добиться, используя команды PREPARE, EXECUTE, DEALLOCATE для обработки операторов, о чем мы здесь и говорим.

Например:

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

Возможно, не такой графический, как может показаться кому-то, но, безусловно, выполнимый.

1 голос
/ 16 июля 2010

Я бы попробовал написать функцию SQL , которая обернет ваш запрос. Это может быть что-то простое, как

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

SELECT my_function(1, 2);

Я бы сделал это вместо ПОДГОТОВКИ, так как будет проще обновить его. В зависимости от того, насколько сложна функция, вы также можете посмотреть на другие PL в Postgres.

0 голосов
/ 17 июля 2010

SQL-процессы, как известно, трудно отлаживать. Мое слабое, но практичное решение было записывать сообщения журнала в таблицу журнала, например, так (пожалуйста, извините за синтаксические проблемы):

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;

Это не красиво, но работает в каждой БД.

...