Fonksiyon içinde "temporary table", "execute" into sorunu

Lists: pgsql-tr-genel
From: Mustafa Yörükoğlu <Mustafa(at)Yorukoglu(dot)name(dot)tr>
To: PostgreSQL Türkiye -Genel <pgsql-tr-genel(at)PostgreSQL(dot)org>
Subject: Fonksiyon içinde "temporary table", "execute" into sorunu
Date: 2006-04-03 17:25:12
Message-ID: 44315A78.4010504@Yorukoglu.name.tr
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-tr-genel

Selamlar,
Bir fonknsiyon içinde temporary bir tablo oluşturup bu tablonun içini
bazı hesaplarla doldurup, parametre ile belirttiğim uygun bir değerini
geriye döndürme çabasındayım;
Bu amacıma ulaşmak için güzelce fonksiyonumu yazdım. Fonksiyonu bir kere
çağırdığımda herşey mükemmel. Ancak bir alana bağlı olarak çağırdığımda
http://www.postgresql.org/docs/faqs.FAQ.html#item4.19 ile belirtilen
hata mesajını aldım. (fonksiyonum volatile) Çözüm tavsiyesini uyguladım
ve fonksiyon içindeki bütün sorgularımı execute ile çalıştırabileceğim
yapıya soktum. Ancak bu sefer;
execute sorgu into sonuc;
satırlarında hatalar alıyorum. Hatanın burada olduğunu EMS Postgresql
Manager ile fonksiyonu debug ederek tespit edebildim. Fonksiyonu normal
bir sorguda kullandığımda: "ERROR: current transaction is aborted,
commands ignored until end of transaction block" hatası alıyorum.

Nedeni hakkında fikri olan var mı?

Teşekkürler,
Mustafa Yörükoğlu

_Örnek Kullanım:_
declare sonuc numeric;
declare sorgu varchar;
begin
..
sorgu:='select diff from xtable where id='||$1;
execute sorgu into sonuc;
..
end;


From: Volkan YAZICI <yazicivo(at)ttnet(dot)net(dot)tr>
To: Mustafa Yörükoğlu <Mustafa(at)Yorukoglu(dot)name(dot)tr>
Cc: pgsql-tr-genel(at)PostgreSQL(dot)org
Subject: Re: Fonksiyon içind
Date: 2006-04-03 17:52:58
Message-ID: 20060403175258.GA215@alamut
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-tr-genel

On Apr 03 08:25, Mustafa Yörükoğlu wrote:
> fonksiyon içindeki bütün sorgularımı execute ile çalıştırabileceğim
> yapıya soktum. Ancak bu sefer;
> execute sorgu into sonuc;
> satırlarında hatalar alıyorum.

Şöyle örnek bir kod parçası denediğimde aynı sorun ben de çıkmadı:

BEGIN;

CREATE FUNCTION test_f() RETURNS integer AS $$
DECLARE
sorgu text;
sonuc integer;
BEGIN
sorgu := 'CREATE TEMP TABLE temp_t (i integer);';
EXECUTE sorgu;

sorgu := 'INSERT INTO temp_t VALUES (random()*100);'
|| 'INSERT INTO temp_t VALUES (random()*100);'
|| 'INSERT INTO temp_t VALUES (random()*100);'
|| 'INSERT INTO temp_t VALUES (random()*100);'
|| 'INSERT INTO temp_t VALUES (random()*100);';
EXECUTE sorgu;

sorgu := 'SELECT i FROM temp_t ORDER BY i LIMIT 1;';
EXECUTE sorgu INTO sonuc;

RETURN sonuc;
END;
$$ LANGUAGE 'plpgsql' VOLATILE;

SELECT test_f();

ROLLBACK;

> Hatanın burada olduğunu EMS Postgresql
> Manager ile fonksiyonu debug ederek tespit edebildim.

EMS ne yapmış bilemem ama PostgreSQL 8.2 sürümü için Tom Lane güzel bir
yamada bulundu: Parser kaynaklı hatalarda, hataya sebep olan kod
kısmınının altına bir ^ işareti konarak, PostgreSQL, kodunuzu daha kolay
debug edebileceğiniz bir hata mesajı üretiyor. Ve aynı özellik,
PL/pgSQL prosedürlerinde (tamamen olmasa da) büyük oranda - parser
kaynaklı debug işlemi için - geçerli. Sunucunuza, CVS ağacından bu
sürümü kurup, prosedürlerinizi burada deneyebilirsiniz.

> Nedeni hakkında fikri olan var mı?

Bir fikrim yok, çünkü (eğer sorunuzu doğru anladıysam) kod bende
çalışıyor. Tam bir test-case gönderirseniz, daha sağlıklı cevap
verebiliriz.

İyi çalışmalar.