Как я могу показывать буквенно-цифровой код с хранившимися процедурами последующими в jsf?

У меня есть следующий procedure в механизме базы данных MYSQL.

CREATE DEFINER=`root`@`localhost` PROCEDURE `generacodigo`(
IN prueba VARCHAR(20),
IN idprueba VARCHAR(20),
IN p_codigo VARCHAR(20), 
IN p_ancho INT(20), 
IN valida INT(2), 
OUT result VARCHAR(250))
BEGIN
    DECLARE cadalf VARCHAR(20) DEFAULT '';
    DECLARE valnum TINYINT(2) DEFAULT 0;
    DECLARE  pos TINYINT(2) DEFAULT 0;
    DECLARE bien BOOLEAN DEFAULT FALSE;
    DECLARE tope INTEGER(20) DEFAULT 0;
    DECLARE cadres VARCHAR(20) DEFAULT '';
    DECLARE poscadact VARCHAR(1) DEFAULT '';
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET @prueba = NULL;

    SET @query = CONCAT("select ",idprueba," into @prueba from ", prueba, " where ",idprueba," = '",p_codigo,"' limit 1");      
    PREPARE stmt1 FROM @query;
          EXECUTE stmt1;
          SET result = @prueba;
          DEALLOCATE PREPARE stmt1;
          SET result := IFNULL(result,'');
          IF valida = 1 THEN
           SET result := IF(result <> '',-1,result);
          ELSE
            IF LENGTH(p_codigo) = p_ancho THEN
        SET result := IF(result <> '',-1,result);
            ELSE
            SET @query2 = CONCAT("select MAX(",idprueba,") into @prueba from ", prueba, " where ",TRIM(idprueba)," like '",TRIM(p_codigo),"%' limit 1");

            PREPARE stmt2 FROM @query2;
            EXECUTE stmt2;
            SET result = @prueba;            
            DEALLOCATE PREPARE stmt2;
            SET result := IFNULL(result,'');
            IF result = '' THEN
            SET cadalf := '1';
            IF p_codigo <> '' THEN
               SET result := LPAD(cadalf, p_ancho - LENGTH(TRIM(p_codigo)), '0');
               SET result := CONCAT(p_codigo,result);
            ELSE
               SET result := LPAD(cadalf, p_ancho, '0');
            END IF;
            ELSE
               SET pos := 1;

               WHILE pos <= p_ancho DO
              SET poscadact := SUBSTRING(result,pos,1);
              IF poscadact IN('0','1','2','3','4','5','6','7','8','9') THEN
                 SET cadres := CONCAT(cadres, poscadact);
              END IF;

              SET pos := pos + 1;
               END WHILE;
               SET result := CONVERT(cadres,UNSIGNED INTEGER) + 1;
               SET result := LPAD(CONVERT(result,CHAR),p_ancho - LENGTH(TRIM(p_codigo)), '0');
               SET result := CONCAT(p_codigo,result);

            END IF;
            END IF;
          END IF;


END

где:

протестируй---> имя таблицы, которое должно обрабатывать idprueba-> поле, которое должно производить код.

Параметры, чтобы производить.

call generacodigo('prueba','idprueba','OC',6,2,@prueba);
SELECT @prueba AS prueba;

Сейчас мой вопрос такой, как я могу осуществлять это с java. Я оставляю часть моего кода, но меня производит ошибка не output parameters registered.

public void Числа () throws Exception { ResultSet rs; Попытайся p=new Попытайся (); try {

        this.Conectar();

        CallableStatement st=this.getCn().prepareCall("{generacodigo(?,?,?,?,?,?)}");

        st.setString(1,st.getString("prueba"));
        st.setString(2,  st.getString("idprueba"));
        st.setString(3,st.getString("OC"));
        st.setInt(4,st.getInt(6));
        st.setInt(5,st.getInt(2));
        st.setString(6,st.getString("@prueba"));
        st.executeUpdate();

        PreparedStatement st2=this.getCn().prepareCall("SELECT @prueba");
        rs=st2.executeQuery();

        while(rs.next()){
            Prueba prueba1=new Prueba();
           prueba1.setIdprueba(rs.getString("@prueba"));
        }   

    }catch(Exception e){
        throw e;
    }finally{
        this.Cerrar();
    }       
}

В BEAN.

public void numeros(Prueba prue)throws Exception{
           PruebaDao dao;
           try{
               dao=new PruebaDao();
               dao.Numeros();   
           }catch(Exception e){
               throw  e;
           }
       }

В XHTML.


  
  

я жду, если они могут поддерживать меня большое спасибо

introducir la descripción de la imagen aquí

1
задан 11.04.2017, 11:21
1 ответ

Твоя проблема состоит в том, чтобы выполнять процедуру, хранившуюся с твоего слоя Dao. Для этих случаев, JSF и PrimeFaces неуместные в течение анализа. Чтобы использовать хранившиеся процедуры ты должен использовать CallableStatement. Этот интерфейс позволяет лучшее взаимодействие с этими объектами базы данных. Ты можешь создавать это следующей формы:

String sql = "{ call generacodigo(?, ?, ?, ?, ?, ?) }";
CallableStatement cs = connection.prepareCall(sql);
cs.setString(1, st.getString("prueba"));
cs.setString(2, st.getString("idprueba"));
cs.setString(3, st.getString("OC"));
cs.setInt(4, st.getInt(6));
cs.setInt(5, st.getInt(3));
//el sexto parámetro es de salida, tienes que registrarlo como tal
//NO DEBES colocarlo como setXyz
cs.registerOutParameter(6, Types.VARCHAR);
cs.executeQuery();
//aquí obtienes el valor del sexto parámetro que es de salida
//y lo asignas a tu variable deseada
String prueba = cs.getString(6);
//continúas con el procesamiento de los datos...

Ты можешь находить больше информации в:

1
ответ дан 24.11.2019, 14:43
  • 1
    издайте и я поместил изображение последнему не, которому проистекать, и # 225; то, что помечает ide, и как решение этого – Libra2880 20.03.2016, 11:02
  • 2
    Уже edit и # 233; ответ. М и # 233; все называются registerOutParameter. Но это значит, что ты только надеялся, что они делают тебе c и # 243; я говорю, даже ты не соизволяешь в проверке из-за твоего счета qu и # 233; он смог быть плохой и c и # 243; mo решать это... –  20.03.2016, 17:57

Теги

Похожие вопросы