5

SQL Server では、SQL コードをアプリケーションからコピーして SSMS に貼り付け、SQL に存在する変数を宣言して割り当て、実行することができました。素晴らしいデバッグ シナリオです。

例(私は錆びており、構文が間違っている可能性があることに注意してください):

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

pgAdmin (または別の postgres ツール、推奨事項) で Postgres と同様のことをしたいのですが、SQL (params & all) を Postgres DB に対して実行されるものにドロップするだけです。

pgscriptを作成できることはわかっていますが、あまり良くないようです。たとえば、上記と同等のことを行った場合、@xの値を一重引用符で囲みません。それらを2倍にすると、後でテーブルが出なくなります-テキストのみ...

現在、私は誰かが書いた SQL の一部を持っています。これには、それぞれ約 6 回使用される 3 つの一意の変数が含まれています...

したがって、問題は、他の人がどのように 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 プロシージャは、デバッグが難しいことで有名です。私の不十分だが実用的な解決策は、次のようにログメッセージをログテーブルに書き込むことでした(構文の問題を許してください):

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;

きれいではありませんが、すべての DB で機能します。

于 2010-07-17T12:41:50.933 に答える