Apa yang salah dengan prosedur tersimpan ini?

hampir menjalankan prosedur tersimpan pertama saya. Yang ini dikompilasi tetapi ketika saya menjalankannya dengan call test.fttest5('YEAR'); terjadi kesalahan

Status SQL: 22001 Kode Vendor: -303 Pesan: [SQL0303] Variabel host *N tidak kompatibel. Menyebabkan . . . . . : FETCH, SELECT, CALL, SET, VALUES INTO, GET DIAGNOSTICS, GET DESCRIPTOR, atau SET DESCRIPTOR tidak dapat dilakukan karena tipe data variabel host *N tidak kompatibel dengan tipe data item daftar yang bersangkutan.

Juga bagaimana cara menentukan tipe data tidak terbatas dalam prosedur tersimpan saya? Saya mencoba DECLARE temp VARCHAR(MAX); tetapi tidak berhasil. Platform saya adalah ISeries DB2 V5R4.

create procedure test.fttest5
    (IN ftExpression CHARACTER(30))
    language sql
    reads sql data
    dynamic result sets 1
    begin

    declare cmd VARCHAR(50);
    declare whr VARCHAR(50)
;

    declare x cursor for sl;
    set cmd='select * from testSchema.tempTable' ;
    if ftExpression IS NOT NULL
 THEN
     set whr= ftExpression;
    END IF;

    set cmd=cmd || CASE WHEN whr IS NULL THEN '' ELSE ' ORDER BY ' || whr END;  
    prepare sl from cmd;
    open x;
    return;
    end
    ;

person Zo Has    schedule 19.07.2010    source sumber


Jawaban (2)


Saya yakin kesalahan yang Anda dapatkan di sini sebenarnya terjadi bahkan sebelum prosedur Anda dijalankan. Anda memiliki prosedur yang ditentukan dengan parameter CHAR tetapi Anda memanggilnya dengan VARCHAR. Saat Anda mengetik SQL secara interaktif, parameter seperti itu muncul sebagai VARCHAR.

Coba panggil seperti ini: call test.fttest5(CHAR('YEAR'))

Atau Anda juga dapat mengubah parameternya menjadi VARCHAR, meskipun Anda tetap ingin menguji pemanggilannya dengan CHAR untuk melihat apa yang akan terjadi.

Namun menurut saya Anda melewatkan baris SET RESULT SETS CURSOR x. Saya juga akan mempersiapkannya sebelum deklarasi karena menurut saya pesanannya mungkin penting.

Dokumentasi IBM ada di http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/topic/rzaik/rzaikspresultsets.htm.

person Brandon Peterson    schedule 19.07.2010
comment
Terima kasih, saya akan memeriksa apa yang Anda katakan dan terus memposting thread ini! - person Zo Has; 19.07.2010

Memilih * itu buruk, terutama jika Anda memilih dari tampilan yang kompleks atau besar.

Kursor secara umum buruk karena Anda mengulangi setiap baris, alih-alih bekerja dengan set.

Pikirkan juga apakah SQL dinamis diperlukan di sini?

Apa tujuan dari prosedur tersimpan ini? Kelihatannya agak sederhana dan saya bertanya-tanya apakah Anda dapat menulis ulang dengan menggunakan set, daripada mengulanginya dengan kursor?

person Community    schedule 19.07.2010
comment
Terima kasih atas jawabannya, ini hanya contoh pernyataan dan prosedur pengujian. Skenario sebenarnya adalah klausa Where dinamis untuk filter panjang & permintaan pencarian (DYNAMIC WHERE & ORDER BY). Yang saya tahu sekarang adalah saya harus menggunakan kursor agar prosedur tersimpan saya berfungsi, dapatkah Anda menunjukkan cara menggunakan set dengan contoh saya? - person Zo Has; 19.07.2010