You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cayenne.apache.org by Andrus Adamchik <an...@objectstyle.org> on 2015/02/02 13:12:22 UTC

Re: SQLExec query

> 
> On Jan 31, 2015, at 10:08 AM, Aristedes Maniatis <ar...@maniatis.org> wrote:
> 
> Can you give an example of the type of multi-part query you have in mind and how the code would be used.
> 
> Ari

Can't immediately provide an example of a multi-part raw SQL query (will need to see what various DBs allow to put in a single Statement). But see below a PL/SQL function that can be called as a stored procedure. It does an update and returns a ResultSet. So assuming we spec a ProcedureExec query similar to SQLExec, a call might look like this (assuming we are ok with hardcoding procedure result structure in the Java code):

List<QueryResult> rs = ProcedureExec.query("cayenne_tst_select_proc").paramsArray("A", 5000).execute(context);
int updatedRows = rs.get(0).getUpdateResult();
List<DataRow> data = rs.get(1).getSelectResult();

Andrus

-------
CREATE OR REPLACE FUNCTION cayenne_tst_select_proc (a_name IN VARCHAR2, painting_price IN NUMBER)
    RETURN cayenne_types.ref_cursor
AS
   artists cayenne_types.ref_cursor;
BEGIN
      SET TRANSACTION READ WRITE;
      UPDATE PAINTING SET ESTIMATED_PRICE = ESTIMATED_PRICE * 2
      WHERE ESTIMATED_PRICE < painting_price;
      COMMIT;
 
     OPEN artists FOR
     SELECT DISTINCT A.ARTIST_ID, A.ARTIST_NAME, A.DATE_OF_BIRTH
     FROM ARTIST A, PAINTING P
     WHERE A.ARTIST_ID = P.ARTIST_ID AND
     RTRIM(A.ARTIST_NAME) = a_name
     ORDER BY A.ARTIST_ID;

     RETURN artists;
END;