//Callable Statement

import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.CallableStatement;
import java.sql.Connection;

public class StatementDemo {
    public static void main(String[] args) {
        String DB_URL = "jdbc:oracle:thin:@//localhost:1521/XE";
        String user = "system";
        String pass = "1234";

        try (Connection conn = DriverManager.getConnection(DB_URL, user, pass)) {
            String insertQuery = "{call insert_employee(?, ?)}";
            try (CallableStatement cstmt = conn.prepareCall(insertQuery)) {
                cstmt.setString(1, "Queen");
                cstmt.setDouble(2, 400000);
                cstmt.execute();
                System.out.println("Sucessfully Inserted a record");
            }

        } catch (SQLException se) {
            System.out.println("An error occured");
            se.printStackTrace();
        }
    }
}

//Procedure

CREATE OR REPLACE PROCEDURE insert_employee(
    p_name IN VARCHAR2,
    p_salary IN NUMBER
) IS
BEGIN
    -- Insert the employee with the given name and salary
    INSERT INTO employees (name, salary)
    VALUES (p_name, p_salary);

    -- Commit the transaction
    COMMIT;

    DBMS_OUTPUT.PUT_LINE('Employee inserted successfully!');
EXCEPTION
    WHEN OTHERS THEN
        -- Handle exceptions
        ROLLBACK;
        DBMS_OUTPUT.PUT_LINE('Error inserting employee: ' || SQLERRM);
END;
/