Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Проблема с обращением к процедуре Postgres


Автор: skif18 9.12.2009, 12:11
Есть такая процедура на постгресе. При железном запуске с самого Постгреса она пашет...
Код

CREATE OR REPLACE FUNCTION "public"."updatezayavki" (c_dat text, c_kpot text, p_kol double precision, p_name text, p_user text, p_sum double precision, c_data timestamp) RETURNS integer AS
$body$
DECLARE
c_dat_ ALIAS FOR $1;
c_kpot_ ALIAS FOR $2;
p_kol_ ALIAS FOR $3;
p_name_ ALIAS FOR $4;
p_user_ ALIAS FOR $5;
p_sum_ ALIAS FOR $6;
c_data_ ALIAS FOR $7;
p_count int4;
BEGIN
     SELECT count(*) INTO p_count FROM zaiavki WHERE dat=$1 AND kpot=$2 AND kolvo=$3 AND nzprn=TRIM($4);
/*     SELECT count(*) INTO p_count FROM zaiavki WHERE dat=$1 AND kpot=$2 AND nzprn=TRIM($4);*/
     IF NOT FOUND THEN
        INSERT INTO zaiavki (dat, kpot, kolvo,kolzai,date_in,date_out, nzprn, kodopera,sumkolvo) VALUES ($1, $2, $3,$3,$7,CURRENT_TIMESTAMP,$4, $5, $6);
     ELSE
         UPDATE zaiavki SET kolvo = $3, kodopera = $5,date_in=$7,date_out=CURRENT_TIMESTAMP, sumkolvo=$6  WHERE dat=$1 AND kpot=$2 and nzprn=$4;
     END IF;
return 1;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;


Но через java обращение - нет. Вот код обращения.
Код

    
    public static Connection getInsertConnection() throws Exception {
        String driver = "org.postgresql.Driver";
        String DBNAME = "sbit";
        String USERNAME = "postgres1";
        String PASSWORD = "syrus";
        Connection conn = null;
        if(conn==null){
        Class.forName(driver);
        conn = DriverManager.getConnection("jdbc:postgresql://192.168.4.3:5432/"+DBNAME,USERNAME,PASSWORD);
        }
        return conn;
      }

//--------------------------------------------------------------------------------------------
    public void setValueAt(Object value, int row, int column)
    {
      try
        { 
  if(value.equals("")==false){
    Connection connzay = getInsertConnection();
    connzay.setAutoCommit(false);
    String date =ZaiavkaProductii.dat;
    String kpot =ZaiavkaProductii.kpot;
    String kodopera =Zaiavki.codeUser;
    Double cen=Double.parseDouble(ZaiavkaProductii.cena);
    Double suma=cen*Double.parseDouble(dbRepresentationUp(column, value).toString().trim());
    connzay.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
    PreparedStatement proc1 =connzay.prepareCall("{ call updatezayavki(?::text, ?::text, ?::real, ?::text, ?::text,?::real,?::timestamp) }");
//    PreparedStatement proc1 =connzay.prepareCall("{ call updatezayavki1(?::text, ?::text, ?::real, ?::text, ?::text) }");
              proc1.setString(1, date);
              proc1.setString(2, kpot);
              proc1.setDouble(3, Double.parseDouble(dbRepresentationUp(column, value).toString().trim()));
              Vector row1 = (Vector)rows.elementAt(row);
              proc1.setString(4,dbRepresentationUp(column-2, row1.elementAt(column-2)).toString().trim());
              proc1.setString(5, kodopera);
              proc1.setDouble(6, suma);
              java.sql.Timestamp  expiration = new java.sql.Timestamp(new java.util.Date().getTime());             
              proc1.setTimestamp(7,expiration);
              proc1.executeUpdate();
              
//              System.out.println(" proc1.execute()="+ proc1.execute());

               System.out.println(" date="+ date);
               System.out.println(" kpot="+ kpot);
               System.out.println(" kolvo="+ Double.parseDouble(dbRepresentationUp(column, value).toString().trim()));
               System.out.println(" nzprn="+ dbRepresentationUp(column-2, row1.elementAt(column-2)).toString().trim());
               System.out.println("  kodopera="+  kodopera);
               System.out.println("time="+ expiration);
               System.out.println(" suma="+suma);
                          
//              System.out.println(" proc1.executeUpdate()="+ proc1.executeUpdate());
              
              Object val;
              val = tbRepresentation(column,value);
              Vector dataRow = (Vector)rows.elementAt(row);
              dataRow.setElementAt(val, column);
              fireTableDataChanged();
              proc1.close();
              connzay.commit();
              connzay.close();
              
//              conn.close();
          }
        }
        catch (Exception ex)
        {
/*            try {
                con.commit();
                con.close();
//                statement.close();
            } catch (SQLException e1) {
                // TODO Автоматически созданный блок catch
                e1.printStackTrace();
            } 
    */        ex.printStackTrace();
           System.err.println(ex);
        }
    }


Добавлено через 3 минуты и 8 секунд
Код

 System.out.println(proc1.executeUpdate());

Даете 0.

Автор: LSD 9.12.2009, 12:26
Цитата(skif18 @  9.12.2009,  12:11 Найти цитируемый пост)
Даете 0. 

И что тебя смущает
Цитата(JavaDoc)
Returns:
  either (1) the row count for SQL Data Manipulation Language (DML) statements or (2) 0 for SQL statements that return nothing

Автор: skif18 9.12.2009, 12:30
Но при запуске допустим в EMS SQL Manager при тех же данных она возвращает 1. т.е. выполняется.

Автор: ivanovpv 9.12.2009, 14:42
Не надо путать то что возвращает хранимка от того, что возвращает вызов executeUpdate()

То что возвращает хранимка нужно регистрировать и нужно это делать не в PreparedStatement а в CallableStatement, типа так:
Код

CallableStatement call = conn.prepareCall("{?=call myFunc(?,?)}");
call.registerOutParameter(1, Types.INTEGER);
call.setInt(2, 1);
call.setString(3, "blah-blah");
call.execute();
int retValue = call.getInt(1);

Автор: skif18 9.12.2009, 15:16
ivanovpv, у меня он ничего и не возвращает. она изменения делает. и все. зачем мне выходной параметр? 1 просто, чтоб видеть, что выполнилось.

Добавлено через 14 минут и 57 секунд
что самое интересное что какието строки она опдейтит , а какие-то нет. и почему не понятно.

Автор: LSD 9.12.2009, 16:09
Цитата(skif18 @  9.12.2009,  15:16 Найти цитируемый пост)
что самое интересное что какието строки она опдейтит , а какие-то нет. и почему не понятно. 

Это никак не связано с тем, что возвращает executeUpdate(). executeUpdate() возвращает код, который означает:
Цитата
either (1) the row count for SQL Data Manipulation Language (DML) statements or (2) 0 for SQL statements that return nothing

и все. Никто не полезет внутрь хранимой процедуры, чтобы выяснить сколько строк она изменила.




Цитата(skif18 @  9.12.2009,  15:16 Найти цитируемый пост)
ivanovpv, у меня он ничего и не возвращает. она изменения делает. и все. зачем мне выходной параметр? 1 просто, чтоб видеть, что выполнилось.

Да, а
Код

     END IF;
return 1;
END;

это что тогда?

Автор: skif18 12.12.2009, 10:37
проблема была в процедуре... не хотела она принимать String после trim().
Убрали, запахала. Странно. Вышла проблема после смены Postgres 8.2 на Postgres 8.4

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)