2015-10-05 62 views
0

這是錯誤堆棧當我嘗試插入用戶的詳細信息到表造成的:org.postgresql.util.PSQLException:錯誤:語法錯誤或接近「迴歸」

Caused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near "RETURNING" 
    Position: 52 
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2182) 
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1911) 
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:173) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:618) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:468) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:414) 
    at org.apache.commons.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:98) 
    at org.apache.commons.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:98) 
    at org.springframework.jdbc.core.JdbcTemplate$3.doInPreparedStatement(JdbcTemplate.java:903) 
    at org.springframework.jdbc.core.JdbcTemplate$3.doInPreparedStatement(JdbcTemplate.java:900) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:629) 

我使用存儲過程,讓我所有的數據庫互爲作用

CREATE OR REPLACE FUNCTION ezhire."insert_user" 
(
    in_name character varying, 
    in_email character varying, 
    in_image_url character varying, 
    in_provider character varying 
) 
RETURNS integer AS $$ 
DECLARE 
    out_inserted_id integer; 
BEGIN 

    WITH rows as (
    INSERT INTO ezhire.user(name, email, image_url, provider) 
    VALUES(in_name, in_email, in_image_url, in_provider) 
    RETURNING id 
) 
    SELECT id INTO out_inserted_id FROM rows; 

    RETURN out_inserted_id; 

END; 
$$ LANGUAGE plpgsql 

我無法弄清楚什麼錯誤..

回答

0

的問題是在我的春天代碼:

需要更改此代碼

public Role createRole(final Role role){ 
    KeyHolder holder = new GeneratedKeyHolder(); 
    PreparedStatementCreator psc = new PreparedStatementCreator() { 

    @Override 
    public PreparedStatement createPreparedStatement(
     java.sql.Connection conn) throws SQLException { 
     PreparedStatement pstmt = conn.prepareStatement(
      QUERIES.ROLE.INSERT_ROLE, new String[] { "id" }); 

     int i = 1; 
     pstmt.setString(i++, role.getName()); 
     pstmt.setString(i++, role.getAbbreviation()); 
     pstmt.setString(i++, role.getInfo()); 
     return pstmt; 
    } 
    }; 
    logger.info(psc.toString()); 
    jdbcTemplate.update(psc, holder); 
    Integer userId = holder.getKey().intValue(); 
    role.setId(userId); 
    return role; 
} 

到其中的是:

public Role createRole(final Role role) { 
     PreparedStatementCreator psc = new PreparedStatementCreator() { 

      @Override 
      public PreparedStatement createPreparedStatement(Connection conn) 
        throws SQLException { 
       PreparedStatement pstmt = conn 
         .prepareStatement(QUERIES.ROLE.INSERT_ROLE); 
       int i = 1; 
       pstmt.setString(i++, role.getName()); 
       pstmt.setString(i++, role.getAbbreviation()); 
       pstmt.setString(i++, role.getInfo()); 
       logger.debug(pstmt.toString()); 
       return pstmt; 
      } 
     }; 
     Integer roleId = jdbcTemplate.query(psc, 
       new ResultSetExtractor<Integer>() { 
        @Override 
        public Integer extractData(ResultSet rs) 
          throws SQLException, DataAccessException { 
         if (rs.next()) { 
          return rs.getInt("insert_role"); 
         } 
         return null; 
        } 
       }); 
     role.setId(roleId); 
     return role; 
    } 
0

更改WITH部分像下面

WITH test as (
    INSERT INTO ezhire.user(name, email, image_url, provider) 
    VALUES(in_name, in_email, in_image_url, in_provider) 
    RETURNING id as recentid 
) 
    SELECT recentid INTO out_inserted_id FROM test; 

(OR)度過,即使沒有WITH條款像

CREATE OR REPLACE FUNCTION ezhire."insert_user" 
(
    in_name character varying, 
    in_email character varying, 
    in_image_url character varying, 
    in_provider character varying 
) 
RETURNS integer AS $$ 
DECLARE 
    out_inserted_id integer; 
BEGIN 

    INSERT INTO ezhire.user(name, email, image_url, provider) 
    VALUES(in_name, in_email, in_image_url, in_provider) 
    RETURNING id INTO out_inserted_id; 


    RETURN out_inserted_id; 

END; 
$$ LANGUAGE plpgsql 
+0

沒有運氣還是同樣的錯誤 –

+0

@AvinashVundyala,在回答再次看到編輯是否有幫助。 – Rahul

+0

Yup都沒有工作 –

0

你基本上這裏有兩種選擇:

PL/pgSQL的

您需要提供目標的id value:

CREATE OR REPLACE FUNCTION ezhire."insert_user" 
(
    in_name character varying, 
    in_email character varying, 
    in_image_url character varying, 
    in_provider character varying 
) 
RETURNS integer AS $$ 
DECLARE 
    out_inserted_id integer; 
BEGIN 
    INSERT INTO ezhire.user(name, email, image_url, provider) 
    VALUES (in_name, in_email, in_image_url, in_provider) 
    RETURNING id INTO out_inserted_id; 

    RETURN out_inserted_id; 
END; 
$$ LANGUAGE plpgsql; 

SQL函數

看到你只能做純SQL的功能,使用SQL語言功能,更快,更簡單的寫:

CREATE OR REPLACE FUNCTION ezhire."insert_user" 
(
    in_name character varying, 
    in_email character varying, 
    in_image_url character varying, 
    in_provider character varying 
) 
RETURNS integer AS $$ 
    INSERT INTO ezhire.user(name, email, image_url, provider) 
    VALUES (in_name, in_email, in_image_url, in_provider) 
    RETURNING id; 
$$ LANGUAGE sql; 
相關問題