Tidak dapat meneruskan parameter di dalam prosedur tersimpan dalam pergeseran merah

Saya telah menulis prosedur yang memanggil parameter dalam kueri pemilihan, tetapi tidak berfungsi. Saat saya mencetak parameter itu berfungsi dengan baik, tetapi dengan kueri pemilihan, itu tidak berfungsi.

Saya telah menggunakan meja kerja Aginity untuk pergeseran merah untuk menjalankan prosedur tersimpan.

CREATE or replace PROCEDURE get_tbl_name(IN tablename varchar, IN columnname VARCHAR, IN mindate varchar) AS $$
Declare
evalmindate varchar;
BEGIN
Raise info 'tablename = %, columnname = %, mindate = %', tablename,columnname,mindate;
if mindate is null then
select min(columnname) into evalmindate from tablename;
else
evalmindate=mindate;
end if;
END;
$$ LANGUAGE plpgsql;

Calling Proc:
call get_tbl_name('test_bq', 'date',NULL);

Output:
tablename = test_bq, columnname = date, mindate = <NULL>
Error Message
42601: syntax error at or near "$2"

Dari output, kita dapat melihat parameter di dalam prosedur ketika saya mencetak, tetapi saya tidak dapat meneruskan parameter ke kueri pemilihan, karena menimbulkan kesalahan. Mohon bantu saya dengan ini.


person Venugopal Seetharaman    schedule 12.08.2019    source sumber
comment
untuk memulai dengan select min(columnname) into evalmindate from tablename; tidak benar, Anda tidak menggunakan variabel, secara harfiah Anda mencoba menanyakan columnname dalam tabel bernama tablename   -  person demircioglu    schedule 13.08.2019
comment
@ mdem7 Meskipun saya meneruskan parameter ke variabel dan meneruskan variabel ke kueri pemilihan, itu tidak berfungsi. Mendapatkan kesalahan yang sama.   -  person Venugopal Seetharaman    schedule 13.08.2019


Jawaban (1)


Anda tidak bisa menggunakan variabel sebagai nama kolom atau tabel secara langsung dalam kueri prosedur tersimpan. Sebagai gantinya, Anda perlu membuat string kueri dan menjalankannya.

Sintaks INTO var juga harus didahulukan dalam kueri biasa dan terakhir di EXECUTE.

Kamu punya:

select min(columnname) into evalmindate from tablename;

Coba ini:

EXECUTE 'select min('|| columnname ||') from '|| tablename ||';' INTO evalmindate;
person Joe Harris    schedule 14.08.2019