Bagikan melalui


Pernyataan FETCH

Berlaku untuk:check ditandai ya Databricks Runtime 18.1 ke atas

Mengambil baris berikutnya dari kursor terbuka ke dalam variabel.

Pernyataan mengambil FETCH satu baris sekaligus dari kumpulan hasil kursor dan menetapkan nilai kolom ke variabel yang ditentukan. Jika tidak ada lagi baris yang tersedia, kondisi CURSOR_NO_MORE_ROWS dinaikkan (SQLSTATE '02000').

Pernyataan ini hanya dapat digunakan dalam pernyataan gabungan .

Nota

Untuk FETCH, kesalahan transmisi (misalnya, DATATYPE_MISMATCH) dapat dinaikkan saat menetapkan nilai kolom ke variabel. Kesalahan runtime seperti DIVIDE_BY_ZERO juga dapat terjadi dan tidak terkait dengan baris yang diambil, karena sifat pemrosesan SQL yang berorientasi pada set.

Syntax

FETCH [ [ NEXT ] FROM ] cursor_name INTO variable_name [, ...]

Parameter-parameternya

  • cursor_name

    Nama kursor terbuka. Kursor dapat secara opsional memenuhi syarat dengan label pernyataan gabungan (misalnya, outer_label.my_cursor).

  • NEXT FROM

    Kata kunci opsional. NEXT dan FROM merupakan gula sintaktik dan tidak mempengaruhi perilaku. Hanya pengambilan penerusan yang didukung.

  • variable_name

    Variabel lokal atau sesi untuk menerima nilai kolom. Jumlah variabel harus cocok dengan jumlah kolom dalam tataan hasil kursor, dengan satu pengecualian; jika tidak , ASSIGNMENT_ARITY_MISMATCH dinaikkan:

    • Jika tepat satu variabel ditentukan dan merupakan STRUCT jenis, dan kursor mengembalikan beberapa kolom, nilai kolom ditetapkan ke bidang struct berdasarkan posisi.

    Jenis data kolom harus kompatibel dengan variabel target (atau bidang struct) sesuai dengan aturan penetapan penyimpanan.

Catatan

Ketika tidak ada lagi baris yang tersedia, FETCH menaikkan kondisi CURSOR_NO_MORE_ROWS (SQLSTATE '02000'). Ini adalah kondisi penyelesaian, bukan pengecualian: ini tidak membatalkan eksekusi. Penghandel NOT FOUND atau CURSOR_NO_MORE_ROWS dapat memprosesnya; NOT FOUND menangkap semua kondisi SQLSTATE '02xxx' .

Mengambil dari kursor yang tidak terbuka menimbulkan CURSOR_NOT_OPEN. Kompatibilitas jenis mengikuti aturan penetapan penyimpanan: jenis yang tidak kompatibel menimbulkan kesalahan DATATYPE_MISMATCH ; cast implisit diterapkan jika memungkinkan.

Variabel dapat berupa variabel lokal yang dideklarasikan dalam pernyataan gabungan atau variabel sesi yang dibuat dengan DECLARE VARIABLE pada tingkat sesi.

Contoh

-- Basic fetch into variables
> BEGIN
    DECLARE x INT;
    DECLARE y STRING;
    DECLARE my_cursor CURSOR FOR
      SELECT id, 'row_' || id FROM range(3);

    OPEN my_cursor;
    FETCH my_cursor INTO x, y;
    VALUES (x, y);
    CLOSE my_cursor;
  END;
0|row_0

-- Fetch multiple rows with REPEAT loop
> BEGIN
    DECLARE x INT;
    DECLARE done BOOLEAN DEFAULT false;
    DECLARE total INT DEFAULT 0;
    DECLARE sum_cursor CURSOR FOR SELECT id FROM range(5);

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;

    OPEN sum_cursor;
    REPEAT
      FETCH sum_cursor INTO x;
      IF NOT done THEN
        SET total = total + x;
      END IF;
    UNTIL done END REPEAT;
    CLOSE sum_cursor;

    VALUES (total);
  END;
10

-- Fetch into a struct variable
> BEGIN
    DECLARE result STRUCT<id: INT, name: STRING>;
    DECLARE struct_cursor CURSOR FOR
      SELECT id, 'name_' || id FROM range(3);

    OPEN struct_cursor;
    FETCH struct_cursor INTO result;
    VALUES (result.id, result.name);
    CLOSE struct_cursor;
  END;
0|name_0

-- Using NEXT FROM (optional syntax)
> BEGIN
    DECLARE x INT;
    DECLARE cursor1 CURSOR FOR SELECT id FROM range(3);

    OPEN cursor1;
    FETCH NEXT FROM cursor1 INTO x;
    VALUES (x);
    CLOSE cursor1;
  END;
0