4

背景: 私はPL/pgSQL 関数の最初のpgTAPテスト ケースを作成しており、psql テスト スクリプトから始めています。それについては問題ありませんが、psql 変数で小さな問題に遭遇しました。

私のテスト スクリプトでは、最初にかなりの量のテスト データを関連するテーブルにダンプし、後でシーケンスによって生成された主キーを使用してデータを参照します。主キーを含む変数を作成できると便利だと思います。これは私が探しているものです:

scalasb=> \set the_id (select currval('id_data_id_seq'))
scalasb=> \echo :the_id
54754
scalasb=> 

しかし、これは私が得るものです:

scalasb=> \set the_id (select currval('id_data_id_seq'))
scalasb=> \echo :the_id
(selectcurrval('id_data_id_seq'))
scalasb=> 

回避策はありますが (以下の例を参照してください)、psql 変数はこのジョブに適したツールではないようです。または、それらは、私が Oracle sqlplusバインド変数で使用したものとはまったく異なります...

私の質問: SQL クエリの戻り値を psql スクリプトの変数にバインドするにはどうすればよいですか?

私は9.1のLinuxに取り組んでいます。

-- this is a simplified example to illustrate the problem
begin;

create table id_data(id serial primary key, data text not null);

create or replace function get_text(p_id bigint)
returns text
as $$
declare
  v_data constant text := data from id_data where id = p_id;
begin
  return v_data;
end;
$$ language plpgsql;

insert into id_data(data) values('lorem ipsum');

-- this works correctly but is a rather verbose (especially when one have
-- more of these, in the same query/function)
select get_text((select currval('id_data_id_seq')));

-- instead I'd like to set the id to a variable and use that but this
-- seems to be impossible with psql, right ?
\set the_id (select currval('id_data_id_seq'))
\echo First try: :the_id
--select get_text(:the_id); -- this will fail

-- this works and reveals psql variables' true nature - they are just a
-- textual replacements
\set the_id '(select currval(\'id_data_id_seq\'))'
\echo Second try: :the_id
select get_text(:the_id);

rollback;
4

1 に答える 1

5

残念ながら、あなたはそれを行うことができません-psqlのパッチをいくつか書きましたが、コアにはありません

回避策を使用できます:

postgres=# \set myvar `psql -A -t -c "select version()" postgres `
postgres=# \echo :myvar
PostgreSQL 9.1.4 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.7.0 20120507 (Red Hat 4.7.0-5), 64-bit
于 2012-07-25T16:47:27.453 に答える