Penulis artikel ini memperkenalkan cara memanggil prosedur tersimpan SQL Server melalui Java, dan menjelaskan secara rinci lima jenis penyimpanan berbeda. Silakan lihat di bawah untuk detailnya
1. Gunakan prosedur tersimpan tanpa parameter
Saat menggunakan driver JDBC untuk memanggil prosedur tersimpan tanpa parameter, Anda harus menggunakan urutan escape panggilan SQL. Sintaks untuk urutan escape panggilan tanpa parameter adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
{nama prosedur panggilan}
Sebagai contoh, buat prosedur tersimpan berikut di database sampel SQL Server 2005 AdventureWorks:
Copy kode kodenya sebagai berikut:
BUAT PROSEDUR GetContactFormalNames
SEBAGAI
MULAI
PILIH 10 Judul TERATAS + ' ' + Nama Depan + ' ' + Nama Belakang SEBAGAI Nama Formal
DARI Orang.Kontak
AKHIR
Prosedur tersimpan ini mengembalikan kumpulan hasil tunggal yang berisi kolom data yang terdiri dari judul, nama depan, dan nama belakang sepuluh kontak pertama dalam tabel Person.Contact.
Dalam contoh berikut, fungsi ini meneruskan koneksi terbuka ke database sampel AdventureWorks, dan kemudian prosedur tersimpan GetContactFormalNames dipanggil menggunakan metode mengeksekusiQuery.
Copy kode kodenya sebagai berikut:
public static void eksekusiSprocNoParams(Koneksi dengan) ...{
mencoba...{
Pernyataan stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("{panggilan dbo.GetContactFormalNames}");
sementara (rs.next()) ...{
System.out.println(rs.getString("NamaFormal"));
}
rs.close();
stmt.tutup();
}
menangkap (Pengecualian e) ...{
e.printStackTrace();
}
}
2. Gunakan prosedur tersimpan dengan parameter input
Saat menggunakan driver JDBC untuk memanggil prosedur tersimpan dengan parameter, Anda harus menggunakan urutan escape panggilan SQL bersama dengan metode prepCall dari kelas SQLServerConnection. Sintaks untuk urutan escape panggilan dengan parameter IN adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
{panggil nama-prosedur[([parameter][,[parameter]]...)]}
Saat membuat urutan escape panggilan, gunakan karakter ? (tanda tanya) untuk menentukan parameter IN. Karakter ini berfungsi sebagai pengganti nilai parameter yang akan diteruskan ke prosedur tersimpan. Anda dapat menggunakan salah satu metode penyetel kelas SQLServerPreparedStatement untuk menentukan nilai parameter. Metode penyetel yang tersedia ditentukan oleh tipe data parameter IN.
Saat meneruskan nilai ke metode penyetel, Anda harus menentukan tidak hanya nilai sebenarnya yang akan digunakan dalam parameter, tetapi juga posisi ordinal parameter dalam prosedur tersimpan. Misalnya, jika prosedur tersimpan berisi satu parameter IN, nilai ordinalnya adalah 1. Jika prosedur tersimpan berisi dua parameter, nilai ordinal pertama adalah 1 dan nilai ordinal kedua adalah 2.
Sebagai contoh cara memanggil prosedur tersimpan yang berisi parameter IN, gunakan prosedur tersimpan uspGetEmployeeManagers di database sampel SQL Server 2005 AdventureWorks. Prosedur tersimpan ini menerima parameter masukan tunggal bernama EmployeeID, yang merupakan nilai integer, dan mengembalikan daftar rekursif karyawan dan manajernya berdasarkan EmployeeID yang ditentukan. Berikut adalah kode Java yang memanggil prosedur tersimpan ini:
Copy kode kodenya sebagai berikut:
public static void eksekusiSprocInParams(Koneksi dengan) ...{
mencoba...{
PreparedStatement pstmt = con.prepareStatement("{panggilan dbo.uspGetEmployeeManagers(?)}");
pstmt.setInt(1, 50);
ResultSet rs = pstmt.executeQuery();
sementara (rs.next()) ...{
System.out.println("KARYAWAN:");
System.out.println(rs.getString("Nama Belakang") + ", " + rs.getString("Nama Depan"));
System.out.println("MANAJER:");
System.out.println(rs.getString("ManagerLastName") + ", " + rs.getString("ManagerFirstName"));
Sistem.keluar.println();
}
rs.close();
pstmt.close();
}
menangkap (Pengecualian e) ...{
e.printStackTrace();
}
}
3. Gunakan prosedur tersimpan dengan parameter keluaran
Saat memanggil prosedur tersimpan tersebut menggunakan driver JDBC, Anda harus menggunakan urutan escape panggilan SQL bersama dengan metode prepCall dari kelas SQLServerConnection. Sintaks untuk urutan escape panggilan dengan parameter OUT adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
{panggil nama-prosedur[([parameter][,[parameter]]...)]}
Saat membuat urutan escape panggilan, gunakan karakter ? (tanda tanya) untuk menentukan parameter OUT. Karakter ini berfungsi sebagai pengganti nilai parameter yang akan dikembalikan dari prosedur tersimpan ini. Untuk menentukan nilai parameter OUT, Anda harus menggunakan metode registerOutParameter dari kelas SQLServerCallableStatement untuk menentukan tipe data setiap parameter sebelum menjalankan prosedur tersimpan.
Nilai yang ditentukan untuk parameter OUT menggunakan metode registerOutParameter harus berupa salah satu tipe data JDBC yang terdapat dalam java.sql.Types, yang selanjutnya dipetakan ke salah satu tipe data SQL Server asli. Untuk informasi selengkapnya tentang tipe data JDBC dan SQL Server, lihat Memahami Tipe Data Driver JDBC.
Saat Anda meneruskan nilai ke metode registerOutParameter untuk parameter OUT, Anda tidak hanya harus menentukan tipe data yang akan digunakan untuk parameter tersebut, tetapi Anda juga harus menentukan posisi ordinal parameter atau nama parameter dalam prosedur tersimpan. Misalnya, jika prosedur tersimpan 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.
Sebagai contoh, buat prosedur tersimpan berikut dalam database sampel SQL Server 2005 AdventureWorks: Berdasarkan parameter integer IN yang ditentukan (ID karyawan), prosedur tersimpan ini juga mengembalikan parameter integer OUT tunggal (managerID). Berdasarkan EmployeeID yang terdapat dalam tabel HumanResources.Employee, nilai yang dikembalikan dalam parameter OUT adalah ManagerID.
Dalam contoh berikut, fungsi ini meneruskan koneksi terbuka ke database sampel AdventureWorks, dan kemudian prosedur tersimpan GetImmediateManager dipanggil menggunakan metode eksekusi:
Copy kode kodenya sebagai berikut:
public static void eksekusiStoredProcedure(Koneksi dengan) ...{
mencoba...{
CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}");
cstmt.setInt(1, 5);
cstmt.registerOutParameter(2, java.sql.Types.INTEGER);
cstmt.execute();
System.out.println("ID MANAJER: " + cstmt.getInt(2));
}
menangkap (Pengecualian e) ...{
e.printStackTrace();
}
}
Contoh ini menggunakan posisi ordinal untuk mengidentifikasi parameter. Alternatifnya, parameter dapat diidentifikasi berdasarkan namanya, bukan berdasarkan posisi ordinalnya. Contoh kode berikut memodifikasi contoh sebelumnya untuk mengilustrasikan cara menggunakan parameter bernama dalam aplikasi Java. Perhatikan bahwa nama parameter ini sesuai dengan nama parameter dalam definisi prosedur tersimpan: 11x16CREATE PROCEDURE GetImmediateManager
Copy kode kodenya sebagai berikut:
@employeeID INT,
@managerID INT KELUARAN
SEBAGAI
MULAI
PILIH @managerID = ID Manajer
DARI Sumber Daya Manusia.Karyawan
DIMANA EmployeeID = @employeeID
AKHIR
Prosedur tersimpan dapat mengembalikan jumlah pembaruan dan beberapa rangkaian hasil. Driver JDBC Microsoft SQL Server 2005 mematuhi spesifikasi JDBC 3.0, yang menyatakan bahwa beberapa rangkaian hasil dan jumlah pembaruan harus diambil sebelum mengambil parameter OUT. Artinya, aplikasi harus terlebih dahulu mengambil semua objek ResultSet dan memperbarui hitungannya, lalu menggunakan metode CallableStatement.getter untuk mengambil parameter OUT. Jika tidak, ketika parameter OUT diambil, objek ResultSet dan jumlah pembaruan yang belum diambil akan hilang.
4. Gunakan prosedur tersimpan dengan status pengembalian
Saat memanggil prosedur tersimpan menggunakan driver JDBC, Anda harus menggunakan urutan escape panggilan SQL bersama dengan metode prepCall dari kelas SQLServerConnection. Sintaks untuk urutan escape panggilan yang mengembalikan parameter status adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
{[?=]panggil nama prosedur[([parameter][,[parameter]]...)]}
Saat membuat urutan escape panggilan, gunakan karakter ? (tanda tanya) untuk menentukan parameter status pengembalian. Karakter ini berfungsi sebagai pengganti nilai parameter yang akan dikembalikan dari prosedur tersimpan ini. Untuk menentukan nilai parameter status pengembalian, Anda harus menentukan tipe data parameter menggunakan metode registerOutParameter kelas SQLServerCallableStatement sebelum menjalankan prosedur tersimpan.
Selain itu, ketika meneruskan nilai parameter status pengembalian ke metode registerOutParameter, Anda harus menentukan tidak hanya tipe data parameter yang akan digunakan, tetapi juga posisi ordinal parameter dalam prosedur tersimpan. Posisi ordinal parameter status pengembalian selalu 1 karena selalu menjadi parameter pertama ketika prosedur tersimpan dipanggil. Meskipun kelas SQLServerCallableStatement mendukung penggunaan nama parameter untuk menunjukkan parameter tertentu, Anda hanya dapat menggunakan nomor posisi urut parameter untuk parameter status pengembalian.
Sebagai contoh, buat prosedur tersimpan berikut di database sampel SQL Server 2005 AdventureWorks:
Copy kode kodenya sebagai berikut:
BUAT PROSEDUR PeriksaContactCity
(@namakota CHAR(50))
SEBAGAI
MULAI
JIKA ((PILIH JUMLAH(*)
DARI Orang.Alamat
DIMANA Kota = @namakota) > 1)
KEMBALI 1
KALAU TIDAK
KEMBALI 0
AKHIR
Prosedur tersimpan mengembalikan nilai status 1 atau 0, bergantung pada apakah kota yang ditentukan oleh parameter cityName dapat ditemukan di tabel Person.Address.
Dalam contoh berikut, fungsi ini meneruskan koneksi terbuka ke database sampel AdventureWorks, dan kemudian prosedur tersimpan CheckContactCity dipanggil menggunakan metode eksekusi:
Copy kode kodenya sebagai berikut:
public static void eksekusiStoredProcedure(Koneksi dengan) ...{
mencoba...{
CallableStatement cstmt = con.prepareCall("{? = panggilan dbo.CheckContactCity(?)}");
cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
cstmt.setString(2, "Atlanta");
cstmt.execute();
System.out.println("STATUS KEMBALI: " + cstmt.getInt(1));
}
cstmt.close();
menangkap (Pengecualian e) ...{
e.printStackTrace();
}
}
5. Gunakan prosedur tersimpan dengan jumlah pembaruan
Setelah Anda menggunakan kelas SQLServerCallableStatement untuk membuat panggilan ke prosedur tersimpan, Anda dapat menggunakan metode eksekusi atau eksekusiUpdate untuk memanggil prosedur tersimpan. Metode eksekusiUpdate mengembalikan nilai int yang berisi jumlah baris yang dipengaruhi oleh prosedur tersimpan ini, namun metode eksekusi tidak mengembalikan nilai ini. Jika Anda menggunakan metode eksekusi dan ingin menghitung jumlah baris yang terpengaruh, Anda dapat memanggil metode getUpdateCount setelah menjalankan prosedur tersimpan.
Sebagai contoh, buat tabel berikut dan prosedur tersimpan di database sampel SQL Server 2005 AdventureWorks:
Copy kode kodenya sebagai berikut:
BUAT TABEL TestTable
(Kol1 ke dalam IDENTITAS,
Col2 varchar(50),
Kol3 ke dalam);
BUAT PROSEDUR UpdateTestTable
@Col2 varchar(50),
@ Col3 ke dalam
SEBAGAI
MULAI
PERBARUI Tabel Tes
SET Kol2 = @Kol2, Kol3 = @Kol3
AKHIR;
Dalam contoh berikut, fungsi ini meneruskan koneksi terbuka ke database sampel AdventureWorks, menggunakan metode eksekusi untuk memanggil prosedur tersimpan UpdateTestTable, dan kemudian menggunakan metode getUpdateCount untuk mengembalikan jumlah baris yang terpengaruh oleh prosedur tersimpan.
Copy kode kodenya sebagai berikut:
public static void eksekusiUpdateStoredProcedure(Koneksi dengan) ...{
mencoba...{
CallableStatement cstmt = con.prepareCall("{call dbo.UpdateTestTable(?, ?)}");
cstmt.setString(1, "A");
cstmt.setInt(2, 100);
cstmt.execute();
int hitungan = cstmt.getUpdateCount();
cstmt.close();
System.out.println("BARIS YANG TERPENGARUH: " + hitungan);
}
menangkap (Pengecualian e) ...{
e.printStackTrace();