Sobes.tech
Middle
180

Ինչպես կանչել պահվող պրոցեդուրան Java-ում?

Պատասխան AI-ից

sobes.tech AI

Java-յում պահվող պրոցեդուրայի կանչելու համար օգտագործվում է CallableStatement java.sql փաթեթից:

Հիմնական քայլերը՝

  1. Կապ հաստատել: Օգտագործվում է Connection օբյեկտը:
    // Օրինակ կապ հաստատելու համար (կախված վարորդից և կոնֆիգուրացիայից)
    Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mydatabase", "user", "password");
    
  2. Ստեղծել CallableStatement: SQL-հանգույցը փոխանցվում է prepareCall() կոնստրուկտորին։ Սինտաքսը կախված է SGBD-ից, բայց հաճախ { call procedure_name(?, ?, ...) } տեսքով:
    // Պրոցեդուրայի կանչ առանց պարամետրերի
    CallableStatement cstmt = conn.prepareCall("{ call my_procedure() }");
    
    // Պրոցեդուրայի կանչ պարամետրերով
    CallableStatement cstmtWithParams = conn.prepareCall("{ call my_procedure_with_params(?, ?) }");
    
  3. Ներմուծել մուտքային պարամետրերը: Եթե պրոցեդուրան ընդունում է պարամետրեր, դրանք պետք է սահմանել setXxx() մեթոդներով, որտեղ Xxx համապատասխանում է տվյալների տիպին:
    // Մուտքային պարամետրերի սահմանում
    cstmtWithParams.setString(1, "value1");
    cstmtWithParams.setInt(2, 123);
    
  4. Գրանցել ելքային պարամետրերը (եթե կան): Եթե պրոցեդուրան վերադարձնում է արժեքներ ելքային պարամետրերով, դրանք պետք է գրանցել registerOutParameter()-ով, նշելով պարամետրի ինդեքսը և JDBC տվյալների տիպը:
    // Ելքային պարամետրով պրոցեդուրա
    CallableStatement cstmtWithOut = conn.prepareCall("{ call my_procedure_with_out(?) }");
    cstmtWithOut.registerOutParameter(1, Types.VARCHAR); // օրինակ՝ VARCHAR
    
  5. Կատարել հարցումը: Օգտագործվում է execute() մեթոդը։ Եթե պրոցեդուրան վերադարձնում է արդյունքների հավաքածու, կարելի է օգտագործել executeQuery():
    // Կատարել պրոցեդուրայի կանչը
    cstmt.execute(); // առանց արդյունքների հավաքածուի
    
    // Կատարել պրոցեդուրայի կանչ, որը վերադարձնում է արդյունքների հավաքածու
    // CallableStatement cstmtWithResultSet = conn.prepareCall("{ call get_data() }");
    // ResultSet rs = cstmtWithResultSet.executeQuery();
    
  6. Աշխատել արդյունքներով: Եթե պրոցեդուրան վերադարձնում է արդյունքների հավաքածու, այն կարելի է մշակել որպես սովորական ResultSet։ Եթե կան ելքային պարամետրեր, դրանց արժեքները ստացվում են getXxx() մեթոդներով:
    // Ելքային պարամետրի մշակումը
    String result = cstmtWithOut.getString(1);
    
    // Արդյունքների հավաքածուի մշակումը
    /*
    while (rs.next()) {
        // Արդյունքների ընթերցում
    }
    rs.close();
    */
    
  7. Փակել ռեսուրսները: Կարևոր է փակել 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-ի համար։