Как передать курсор или список записей в процедуру Java в PL / SQL? - PullRequest
0 голосов
/ 26 октября 2019

Мне интересно, как реализовать следующую логику:

CREATE TABLE STUDENT ( 
   STUDENT_ID       NUMBER (5)      NOT NULL, 
   NAME             VARCHAR2 (255)  NOT NULL, 
   SURENAME         VARCHAR2 (255)  NOT NULL,        
   BIRTH_DATE       DATE            NOT NULL, 
   PRIMARY KEY (STUDENT_ID) 
)

Затем предположим, что можно найти похожих учеников, вызвав процедуру PL / SQL:

CREATE OR REPLACE PROCEDURE findStudentByName(p_name IN STUDENT.NAME%TYPE, c_student OUT SYS_REFCURSOR)
           IS
  BEGIN
       OPEN c_student FOR
       SELECT * FROM STUDENT WHERE NAME LIKE p_name || '%';
  END;
  /

Затем ...

DECLARE 
    c_student SYS_REFCURSOR;
    temp_student STUDENT%ROWTYPE;
BEGIN
  -- records are assign to cursor 'c_student' after calling findStudentByName procedure
  findStudentByName('John',c_student);

    LOOP
       --fetch cursor 'c_student' into STUDENT table type 'temp_student'
       FETCH c_student INTO temp_student;

       -- exit if no more records
       EXIT WHEN c_student%NOTFOUND;

       -- call java procedure the matched name
       -- HOW CAN I PASS ARRAY OF STUDENT%ROWTYPE to java procedure?

    END LOOP;
    CLOSE c_student;
END;
/

И мой вопрос, как я могу передать Массив записей в Java-процедуру ?

1 Ответ

0 голосов
/ 27 октября 2019

Вам необходимо вызывать хранимую процедуру в виде строки запроса либо в формате Oracle, либо в стандартном синтаксисе оператора вызова JDBC.

Последний блок кода, начинающийся с DECLARE .., не требуется, достаточно использовать хранимую процедуру findStudentByname.

Предпочитайте использовать REGEXP_LIKE как

OPEN c_student FOR SELECT * FROM STUDENT WHERE REGEXP_LIKE(NAME,p_name,'i').

против проблем чувствительности к регистру для оператора SQL.

По формат Oracle :

private void findStudent(String name)
 throws SQLException {
    String qry = "begin ? := findStudentByName(?); end;";
    //presuming you already constructed an Oracle connection such as
    // Class.forName("oracle.jdbc.OracleDriver");
    //con = DriverManager.getConnection("jdbc:oracle:thin:@//"+dbname,uname,passwd); 
    CallableStatement stmt = con.prepareCall(qry);

    // the out parameter should be registered as Oracle specific type
    stmt.registerOutParameter(1, OracleTypes.CURSOR);

    stmt.setFloat(2, name); //pass your filtering parameter

    // execute and retrieve the result set
    stmt.execute();
    ResultSet rs = (ResultSet)stmt.getObject(1);

    // print out the results
    while (rs.next()) {
     System.out.println("STUDENT_ID : "+rs.getLong(1));
     System.out.println("NAME : "+rs.getString(2));
     System.out.println("SURNAME : "+rs.getString(3));
     System.out.println("BIRTH_DATE : "+rs.getDate(4));
   }

   rs.close();
   stmt.close();
}

По Синтаксис JDBC :

private void findStudent(String name)
 throws SQLException {
    String qry = "{ call ? := findStudentByName(?) }";
    CallableStatement stmt = con.prepareCall(qry);

    stmt.registerOutParameter("out_crs", OracleTypes.CURSOR);    
    stmt.setFloat("in_st_name", name); 

    stmt.execute();
    ResultSet rs = (ResultSet)stmt.getObject("out_crs");

    while (rs.next()) {
     System.out.println("STUDENT_ID : "+rs.getLong("student_id"));
     System.out.println("NAME : "+name);
     System.out.println("SURNAME : "+rs.getString("surname"));
     System.out.println("BIRTH_DATE : "+rs.getDate("birth_date"));
   }

   rs.close();
   stmt.close();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...