【问题标题】:Caused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near "RETURNING"引起:org.postgresql.util.PSQLException:错误:“返回”处或附近的语法错误
【发布时间】:2015-10-05 20:03:45
【问题描述】:

这是我尝试将用户详细信息插入表格时的错误堆栈

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

我无法弄清楚出了什么问题..

【问题讨论】:

    标签: spring postgresql stored-procedures jdbctemplate


    【解决方案1】:

    如下更改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
    

    【讨论】:

    • @AvinashVundyala,如果有帮助,请再次查看答案中的编辑。
    【解决方案2】:

    这里基本上有两种选择:

    PL/pgSQL

    您需要为id 值提供一个目标:

    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;
    

    【讨论】:

      【解决方案3】:

      问题出在我的 spring 代码中:

      需要更改此代码

          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;
              }
      

      【讨论】:

        猜你喜欢
        • 2021-11-30
        • 1970-01-01
        • 2016-01-08
        • 1970-01-01
        • 2015-07-24
        • 2017-07-02
        • 2019-11-23
        • 2016-06-04
        • 1970-01-01
        相关资源
        最近更新 更多