Las sentencias SQL o jobs SQL pueden ser una gran utilidad a la hora de implementarlas, su uso correcto a veces nos permite realizar pequeños fixers. En tutoriales anteriores hemos visto algunos ejemplos explicando su uso , pero no su funcionamiento, esto los limita a ustedes a usar las sentencia que nosotros dejamos y no poder crear sus propias sentencias.
Claro está que nuestro objetivo es que cada uno de ustedes pueda desarrollar con pequeños conocimientos grandes trabajos, y para eso estamos. Veamos un ejemplo normal de una sentencia SQL:
UPDATE Character SET energy= ('30000') WHERE energy<0Ahora analizemos cada una de esas linas:
UPDATE: esa terminologÃa propia , que significa "Actualizar" Character: justamente actualiza esta TABLA que pertenece a MuOnline Con solo leer esa primera linea , ya sabemos y debemos saber que la sentencia va a estar orientada a modificar alguna columna de la tabla Character.
SET energy= ('30000'): el set es otra terminologÃa propia, nos indica para que entendemos (SET=seteo) que sucederá luego del update con la columna "energy" en este caso el STAT ENERGY va a estar en 30.000 , pero ¿Que hace que los stats vuelvan a 30.000?
WHERE energy<0 : y aca aparece lo que se conoce como un "Condicional" en este caso es directo y único, (más adelante veremos que podemos usar varios condicionales no sólo uno). En este caso el WHERE (donde) funciona asi. "Donde la energia sea menor a cero (0)
Voy a escribir como se lee toda la sentencia completa para que entendamos:
Se actualizará la tabla character, seteando el stat energy a treinta mil , cuando la energia sea menor a 0Sin duda esta sentencia se usa para cuando un pj se pasa de stat por ejemplo "32768" este regrese a un valor de "30.000", pero ¿Porque dice menor a 0?, y la respuesta es simple, porque en el SQL aparecen un número negativo o "0". Lo que habia quedado pendiente y es como mencioné anteriomente, no sólo se puede poner un condicional sino que podemos poner dos, tres, y muchos más para eso necesitas usar un AND ("y"). Entonces esto quedarÃa asi WHERE energy<0 AND (otra condición) por ejemplo
WHERE energy<0 AND vitality<0
En este caso la sentencia se ejecutará con éxito siempre y cuando se cumplan esas DOS condiciones , esto quiere decir que para que el stat regrese a 30.000 se deben cumplir dos condiciones. Pero tambien podemos hacer que se cumpla una u otra, para eso usamos un OR en este caso el OR (o) funciona de la siguiente manera
WHERE energy<0 OR vitality<0Si lo leemos dice asi
Donde la enegia o la vitalidad sea menor a 0¿Ven la diferencia? con el AND necesitamos que se cumplan dos condiciones con el OR sólo necesitamos que se cumpla una de ellas dos, con que se cumpla una la sentencia se ejecutá con exito. Ahora retomemos un poco el UPDATE Character , en este caso como trabajamos con los stats del personaje necesitamos de la tabla character pero si queremos cambiar algun dato por ejemplo de los conectados necesitamos cambiar la tabla por la MEMB_STAT , atencion si cambiamos la tabla tambien debemos cambiar la columna por alguna que exista en MEMB_STATS. Con las sentecia SQL en JOBs podemos hacer infinitas cosas, entre ellas reiniciar el server conservando las cuentas, o reiniciar los stats de los personajes, siempre hagan un backups un error de tipeo puede causar un desastre en el server.
Por ejemplo, para terminar el tema; piensen bien y usen toda la matemática que sepan antes de aplicar una sentencia SQL (o una querry), si usamos el sÃmbolo de mayor o menor (><) tengan cuidado, por ejemplo si ponemos:
Energy<1Si lo leemos dice "Menor" a 1 , si el stat está en 1 la sentencia no se ejecutará porque 1-0=1 y 1 sigue siendo mayor a 0, en este caso debemos usar lo que se conoce como menor e igual, serÃa asi:
Energy=<1En este caso si el stat es 1 ahi si funciona correctamente la sentencia , frenarÃa si tenemos un 2 Otro ejemplo, para los que usan el autoreset si ponemos que el pj resetea al level 400 y escribimos esto como sentencia:
Clevel>400Esta mal, porque
400 no es mayor a 400 es igualSi restamos 400-400=0 matemáticamente hablando si restamos dos números y tenemos 0 eso nos indica que los dos números son IGUALES u OPUESTOS, una pequeña fórmula seria
x-x=0 entonces x=x [Siempre y cuando hablemos de (+)x.]¿Y por qué digo que está mal? , porque nunca va a resetear ese PJ , porque su level máximo es 400 dentro del juego, y la sentencia se ejecuta si es MAYOR a 400, dos posibles soluciones o hacemos lo mismo que en el ejemplo anterior: usamos un mayor o igual (aunque seria ilógico usar un mayor porque nunca un usuario tendrá nivel mayor a 400, directamente aplicamos un igual) o podemos usar otra alternativa, si pensamos podriamos poner
Clevel>399No se asusten nadie va a resetia en nivel 399 porque sucede lo mismo , el personaje debe ser nivel mayor a 399 si es 399 no es mayor sino igual.