Menggunakan prosedur tersimpan dengan parameter output

Unduh driver JDBC

Prosedur tersimpan SQL Server yang dapat Anda panggil adalah prosedur yang mengembalikan satu atau beberapa parameter OUT, yang merupakan parameter yang digunakan prosedur tersimpan untuk mengembalikan data ke aplikasi panggilan. Driver Microsoft JDBC untuk SQL Server menyediakan kelas SQLServerCallableStatement , yang dapat Anda gunakan untuk memanggil prosedur tersimpan semacam ini dan memproses data yang dikembalikannya.

Ketika Anda memanggil prosedur tersimpan semacam ini dengan menggunakan driver JDBC, Anda harus menggunakan call urutan escape SQL bersama dengan metode prepareCall dari kelas SQLServer Koneksi ion. Sintaks untuk call urutan escape dengan parameter OUT adalah sebagai berikut:

{call procedure-name[([parameter][,[parameter]]...)]}

Catatan

Untuk informasi selengkapnya tentang urutan escape SQL, lihat Menggunakan urutan escape SQL.

Saat Anda membuat call urutan escape, tentukan parameter OUT dengan menggunakan ? (tanda tanya) karakter. Karakter ini bertindak sebagai tempat penampung untuk nilai parameter yang akan dikembalikan dari prosedur tersimpan. Untuk menentukan nilai untuk parameter OUT, Anda harus menentukan jenis data dari setiap parameter dengan menggunakan metode registerOutParameter dari kelas SQLServerCallableStatement sebelum Anda menjalankan prosedur tersimpan.

Nilai yang Anda tentukan untuk parameter OUT dalam metode registerOutParameter harus merupakan salah satu jenis data JDBC yang terkandung dalam java.sql.Type, yang pada gilirannya memetakan ke salah satu jenis data SQL Server asli. Untuk informasi selengkapnya tentang jenis data JDBC dan SQL Server, lihat Memahami jenis data Driver JDBC.

Ketika Anda meneruskan nilai ke metode registerOutParameter untuk parameter OUT, Anda harus menentukan tidak hanya jenis data yang akan digunakan untuk parameter, tetapi juga penempatan ordinal parameter atau nama parameter dalam prosedur tersimpan. Misalnya, jika prosedur tersimpan Anda berisi satu parameter OUT, nilai ordinalnya adalah 1; jika prosedur tersimpan berisi dua parameter, nilai ordinal pertama adalah 1, dan nilai ordinal kedua adalah 2.

Catatan

Driver JDBC tidak mendukung penggunaan jenis data CURSOR, SQLVARIANT, TABLE, dan TIMESTAMP SQL Server sebagai parameter OUT.

Sebagai contoh, buat prosedur tersimpan berikut dalam database sampel AdventureWorks2022:

CREATE PROCEDURE GetImmediateManager  
   @employeeID INT,  
   @managerID INT OUTPUT  
AS  
BEGIN  
   SELECT @managerID = ManagerID
   FROM HumanResources.Employee
   WHERE EmployeeID = @employeeID  
END

Prosedur tersimpan ini mengembalikan satu parameter OUT (managerID), yang merupakan bilangan bulat, berdasarkan parameter IN (employeeID) yang ditentukan, yang juga merupakan bilangan bulat. Nilai yang dikembalikan dalam parameter OUT adalah ManagerID berdasarkan EmployeeID yang terkandung dalam tabel HumanResources.Employee.

Dalam contoh berikut, koneksi terbuka ke database sampel AdventureWorks2022 diteruskan ke fungsi, dan metode eksekusi digunakan untuk memanggil prosedur tersimpan GetImmediateManager:

public static void executeStoredProcedure(Connection con) throws SQLException {  
    try(CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}");) {  
        cstmt.setInt(1, 5);  
        cstmt.registerOutParameter(2, java.sql.Types.INTEGER);  
        cstmt.execute();  
        System.out.println("MANAGER ID: " + cstmt.getInt(2));  
    }  
}

Contoh ini menggunakan posisi ordinal untuk mengidentifikasi parameter. Atau, Anda dapat mengidentifikasi parameter dengan menggunakan namanya alih-alih posisi ordinalnya. Contoh kode berikut memodifikasi contoh sebelumnya untuk menunjukkan cara menggunakan parameter bernama dalam aplikasi Java. Perhatikan bahwa nama parameter sesuai dengan nama parameter dalam definisi prosedur tersimpan:

public static void executeStoredProcedure(Connection con) throws SQLException {  
    try(CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}"); ) {  
        cstmt.setInt("employeeID", 5);  
        cstmt.registerOutParameter("managerID", java.sql.Types.INTEGER);  
        cstmt.execute();  
        System.out.println("MANAGER ID: " + cstmt.getInt("managerID"));  
    }  
}

Untuk driver versi 12.6 ke atas, properti koneksi baru, useFlexibleCallableStatements diperkenalkan. Ketika diatur ke true properti ini mempertahankan perilaku lama driver, memungkinkan pengguna untuk menggunakan campuran posisi ordinal dan nama parameter saat mengidentifikasi parameter. Ketika diatur ke false, pengguna harus menggunakan satu atau yang lain, tetapi tidak dapat menggunakan keduanya.

Selain itu, useFlexibleCallableStatements mempertahankan perilaku yang ada mengenai parameter pernyataan pesanan fleksibel dapat diatur, ketika properti diatur ke true. Namun, ketika diatur ke false , pesanan harus cocok dengan definisi prosedur tersimpan. Kedua fitur ini untuk useFlexibleCallableStatements=true dapat dilihat dalam contoh berikut:

public static void executeStoredProcedure(Connection con) throws SQLException {  
    try(CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}"); ) {
        cstmt.registerOutParameter("managerID", java.sql.Types.INTEGER);
        cstmt.setInt(1, 5);  
        cstmt.execute();  
        System.out.println("MANAGER ID: " + cstmt.getInt("managerID"));  
    }  
}

Catatan

Contoh-contoh ini menggunakan metode eksekusi kelas SQLServerCallableStatement untuk menjalankan prosedur tersimpan. Ini digunakan karena prosedur tersimpan tidak juga mengembalikan tataan hasil. Jika ya, metode executeQuery akan digunakan.

Prosedur tersimpan dapat mengembalikan jumlah pembaruan dan beberapa tataan hasil. Driver Microsoft JDBC untuk SQL Server mengikuti spesifikasi JDBC 3.0, yang menyatakan bahwa beberapa kumpulan hasil dan jumlah pembaruan harus diambil sebelum parameter OUT diambil. Artinya, aplikasi harus mengambil semua objek ResultSet dan memperbarui jumlah sebelum mengambil parameter OUT dengan menggunakan metode CallableStatement.getter. Jika tidak, objek ResultSet dan jumlah pembaruan yang belum diambil akan hilang saat parameter OUT diambil. Untuk informasi selengkapnya tentang jumlah pembaruan dan beberapa tataan hasil, lihat Menggunakan prosedur tersimpan dengan jumlah pembaruan dan Menggunakan Beberapa Tataan Hasil.

Baca juga

Menggunakan pernyataan dengan prosedur tersimpan