Middle
180
Ինչպես կանչել պահվող պրոցեդուրան Java-ում?
Պատասխան AI-ից
sobes.tech AI
Java-յում պահվող պրոցեդուրայի կանչելու համար օգտագործվում է CallableStatement java.sql փաթեթից:
Հիմնական քայլերը՝
- Կապ հաստատել: Օգտագործվում է
Connectionօբյեկտը:// Օրինակ կապ հաստատելու համար (կախված վարորդից և կոնֆիգուրացիայից) Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mydatabase", "user", "password"); - Ստեղծել
CallableStatement: SQL-հանգույցը փոխանցվում էprepareCall()կոնստրուկտորին։ Սինտաքսը կախված է SGBD-ից, բայց հաճախ{ call procedure_name(?, ?, ...) }տեսքով:// Պրոցեդուրայի կանչ առանց պարամետրերի CallableStatement cstmt = conn.prepareCall("{ call my_procedure() }"); // Պրոցեդուրայի կանչ պարամետրերով CallableStatement cstmtWithParams = conn.prepareCall("{ call my_procedure_with_params(?, ?) }"); - Ներմուծել մուտքային պարամետրերը: Եթե պրոցեդուրան ընդունում է պարամետրեր, դրանք պետք է սահմանել
setXxx()մեթոդներով, որտեղXxxհամապատասխանում է տվյալների տիպին:// Մուտքային պարամետրերի սահմանում cstmtWithParams.setString(1, "value1"); cstmtWithParams.setInt(2, 123); - Գրանցել ելքային պարամետրերը (եթե կան): Եթե պրոցեդուրան վերադարձնում է արժեքներ ելքային պարամետրերով, դրանք պետք է գրանցել
registerOutParameter()-ով, նշելով պարամետրի ինդեքսը և JDBC տվյալների տիպը:// Ելքային պարամետրով պրոցեդուրա CallableStatement cstmtWithOut = conn.prepareCall("{ call my_procedure_with_out(?) }"); cstmtWithOut.registerOutParameter(1, Types.VARCHAR); // օրինակ՝ VARCHAR - Կատարել հարցումը: Օգտագործվում է
execute()մեթոդը։ Եթե պրոցեդուրան վերադարձնում է արդյունքների հավաքածու, կարելի է օգտագործելexecuteQuery():// Կատարել պրոցեդուրայի կանչը cstmt.execute(); // առանց արդյունքների հավաքածուի // Կատարել պրոցեդուրայի կանչ, որը վերադարձնում է արդյունքների հավաքածու // CallableStatement cstmtWithResultSet = conn.prepareCall("{ call get_data() }"); // ResultSet rs = cstmtWithResultSet.executeQuery(); - Աշխատել արդյունքներով: Եթե պրոցեդուրան վերադարձնում է արդյունքների հավաքածու, այն կարելի է մշակել որպես սովորական
ResultSet։ Եթե կան ելքային պարամետրեր, դրանց արժեքները ստացվում ենgetXxx()մեթոդներով:// Ելքային պարամետրի մշակումը String result = cstmtWithOut.getString(1); // Արդյունքների հավաքածուի մշակումը /* while (rs.next()) { // Արդյունքների ընթերցում } rs.close(); */ - Փակել ռեսուրսները: Կարևոր է փակել
CallableStatementևConnection-ը։ Ավելի լավ է օգտագործելtry-with-resourcesբլոկը:// Ռեսուրսների փակումը try-with-resources-ով try (Connection conn = DriverManager.getConnection("...", "...", "...")) { try (CallableStatement cstmt = conn.prepareCall("{ call my_procedure(?) }")) { cstmt.setString(1, "test"); cstmt.execute(); // Արդյունքների մշակումը } } catch (SQLException e) { e.printStackTrace(); }
Օրինակ՝ պրոցեդուրայի կանչում մուտքային և վերադարձվող արժեքներով (RETURN-ով, ոչ թե OUT-պարամետրով, բնորոշ է PostgreSQL/MySQL-ին):
// Բազայի տվյալներում պրոցեդուրա՝ CREATE OR REPLACE FUNCTION add_numbers(a INT, b INT) RETURNS INT AS $$ BEGIN RETURN a + b; END; $$ LANGUAGE plpgsql;
try (Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mydatabase", "user", "password")) {
// Ֆունկցիայի կանչ (շատ հաճախ օգտագործվում է { ? = call function_name(?, ?) } սինտաքսը)
try (CallableStatement cstmt = conn.prepareCall("{ ? = call add_numbers(?, ?) }")) {
// Վերագրանցել վերադարձվող արժեքը
cstmt.registerOutParameter(1, Types.INTEGER);
// Ներմուծել մուտքային պարամետրերը
cstmt.setInt(2, 10);
cstmt.setInt(3, 20);
// Կատարել կանչը
cstmt.execute();
// Ստանալ արդյունքը
int sum = cstmt.getInt(1);
System.out.println("Գումարը: " + sum); // Արդյունք՝ Գումարը: 30
}
} catch (SQLException e) {
e.printStackTrace();
}
Հարցում CallableStatement-ի և PreparedStatement-ի տարբերությունները՝
| Գծագիր | PreparedStatement |
CallableStatement |
|---|---|---|
| Նպատակը | Պարամետրավորված SQL հարցումների կատում | Պահվող պրոցեդուրաների և ֆունկցիաների կանչում |
| Սինտաքսը | SQL հարցում ?-ով |
Դիալեկտային սինտաքս { call ... } կամ նմանը |
| Ելքային պարամետրեր | Չի (միայն արդյունքների հավաքածու) | Կա (registerOutParameter-ով) |
| Վերադարձվող արժեք | Միայն արդյունքների հավաքածու (executeQuery) |
Կարող է լինել RETURN-ով (ինչպես OUT-պարամետրը), արդյունքների հավաքածու |
Պետք է ստուգել սինտաքսը և JDBC տվյալների տիպերի աջակցությունը՝ կոնկրետ օգտագործվող SGBD-ի համար։