Procedimientos Almacenados de PostgreSQL y pgAdmin con JAVA
Los procedimientos almacenados de MySQL , en postgreSQL se llaman funciones, pueden crearse desde consola, pero es mucho mas fácil utilizar pgAdmin. Para este tutorial, se emplearan dos talas !ue consisten en una tala llamada PERSONA y otra tala, llamada TORNEO, el c"digo para su creaci"n esta más aa#o, la tala $orneo ademas hace uso de un SEQUENCE para generar un %& autoincrementale. Campo autoincrement en PostgreSQL con pgAdminIII
En Postgres a diferencia de MySQL, colocar un campo con un valor autonumerico incrementable es un poco más complicado pero no imposible, puede realizarse realizarse a través de comandos SQL, pero para facilitar el trabajo es preferible utilizar una interfaz gráca como pg!dmin"""#
' (on)ctate a Postgres y are el pgAdmin%%%, selecciona la ase de datos con la !ue traa#aras y usca el campo “Sequences”, dale clic* derecho y elegi la opci"n “New Sequence…”.
' +n la entana !ue aparece “New Sequence…”, dees rellenar el campo Name- nomre para la secuencia, Owner- el propietario !ue hara uso de la secuencia, en mi caso se llama postgres, Increment- el incremento, si lo de#as acio, incrementara de / en /, pero es me#or especificarlo, Starten !ue alor iniciara el incremento, tenemos otros alores para completar, pero por el momento lo !ue tenemos es suficiente. Para terminar dale 01
' Para agregar esta secuencia en un campo de cual!uier tala, deemos darle un nomre a la columna, en este caso sera tamien “id”, el tipo de dato Data T!e sera Inte"er y en campo De#au$t %a$ue, deemos agregar la secuencia !ue creamos en el paso anterior, de la siguiente manera- NE&T%A'()secuencia*id+, es decir-
2 dale 01 para crear la columna 2a tenemos nuestra campo creado con un alor autoincrementale de / en /, cada ez !ue se agregue un registro a nuestra tala, la secuencia a3ade / a nuestro campo id4.
$%E!&E &!'LE persona &!'LE persona ( )$") c*aracter(+ )$") c*aracter(+ -.& -/LL, -/LL, )-ombre) c*aracter(01 )-ombre) c*aracter(01 -.& -/LL, -/LL, edad integer -.& -/LL 2E3!/L& 45, 2E3!/L& 45, $.-S&%!"-& )$") P%"M!%6 7E6 ( 7E6 ()$") )$") $%E!&E SEQ/E-$E id8secuencia $%E!&E SEQ/E-$E "-$%EME-& 4 M"-9!L/E M"-9!L/E 4 M!:9!L/E ;1100+1<0=5>?++>5<+ S&!%& 45 S&!%& 45 $!$@E 4A $!$@E 4A !L&E% &!'LE id8secuencia &!'LE id8secuencia .B-E% .B-E% &. &. postgresA postgresA $%E!&E &!'LE torneo &!'LE torneo ( )"2) integer )"2) integer -.& -/LL 2E3!/L& neCtval(Did8secuenciaDr neCtval(Did8secuenciaDregclass, egclass, ci8participante c*aracter(+ -.& -/LL, -/LL, categoria c*aracter(4= -.& -/LL, -/LL, $.-S&%!"-& )"2) P%"M!%6 7E6 ( 7E6 ()"2) )"2)
+l e#emplo !ue crearemos es muy simple, teniendo algunos algunos registros en la tala P+5S06A, crearemos una funci"n !ue nos permita registrar participantes en la tala $056+0, con la restricci"n restricci"n de !ue si la edad es mayor o igual de /7 a3os, se registren en la categor8a Mayores4, caso contrario si la edad es menor de /7 a3os, corresponden a la categor8a Menores4. Menores4. 9n e#emplo muy simple, pero !ue nos sire para er en su mayor8a las instrucci"n más utilizadas en las funciones, parámetros, ariales, consultas, instrucciones condicionales, etc. la funci"n completa la tienes en el siguiente c"digo-
declare FF se declaran las variables a utilizar ci c*aracter c*aracter(+A (+A FF "2 de tabla persona G $E2/L! 2E "2E-&"2!2 edad integer integerAA FF la edad del participante FFla funcion va entre 'EH"- y E-2 begin ci G I4 A FF ci toma valor del parametro de entrada FF el valor de edad, sera calculado mediante una consulta a la tabla persona edad G ( select select p#)edad) p#)edad) from from )persona) )persona) as as p p J*ere J*ere p#)$") p#)$") G ci A FF de acuerdo al valor de E2!2 registramos registramos al participante en la categoria FF KG45 Mayores 45 Menores sino, -. SE %EH"S&%! -!2! if ( edad KG 45 t*en insert into torneo( into torneo( ci8participante, categoria values values ( ( ci, DMayoresD DMayoresD A A return DParticipante registrado en la categoria M!6.%ESDA M!6.%ESD A elsif ( edad 45 t*en insert into torneo( into torneo( ci8participante, categoria values values ( ( ci, DMenoresD DMenoresD A A return DPartic DParticipante ipante registrado en la categoria ME-.%ESDA ME-.%ESD A else return DError -o se pudo completar el registroD A end if A endAA end
Vimos imos como como e#ec e#ecut utar ar la func funci" i"n n desd desdee el prop propio io postgreSQL/pgAdminIII ahora erem eremos os como como postgreSQL/pgAdminIII , ahora e#ecutarlo e#ecutarlo desde #aa, el !ue conozca sore procedimientos procedimientos almacenados almacenados en MySQL sará !ue para e#ecutar un PROCEDURE, se hace uso de Ca$$a-$eStatement, eso es totalmente álido, sin emargo, como nuestra funci"n solo retorna un resultado, nosotros utilizaremos otra forma -:, utilizaremos la instrucci"n e.ecuteQuer;:< +ngloaremos todo en una sola clase la cual se llama, !"/uncti0ns, el c"digo esimport java#sl#$onnection import java#sl# $onnectionAA import java#sl# import java#sl#2riverManager 2riverManagerAA import java#sl# import java#sl#%esultSet %esultSetAA import java#sl# import java#sl#SQLECception SQLECceptionAA import java#sl# import java#sl#Statement StatementAA NOO O Jeb *ttpNNJJJ#jcFmouse#net O aut*or Mouse ON public class pg3unctions class pg3unctions NO 2!&.S P!%! L! $.-E:".- ON NOO -ombre de la base de datos ON private String String db db G )db&emp) )db&emp)AA NOO /suario postgreSQL ON private String String user user G )postgres) )postgres)AA NOO $ontraseRa postgreSQL ON private String String passJord passJord G )) ))AA NOO $adena de coneCin ON private String String url url G )jdbcpostgreslNNlocal*ost>?01N) )jdbcpostgreslNNlocal*ost>?01N)TdbA TdbA NOO $oneCion a base de datos ON private $onnection $onnection conn conn G nullA NOO Para obtener los resultados de las consultas SQL de la base de datos ON private %esultSet %esultSet resultSet resultSet G nullA
NOO Para enviar comandos SQL a la base de datos ON private Statement Statement statement statement G nullA NOO $onstructor de la clase O %ealiza una coneCin a la base de datos de PostgreSQL O eCception SQLECception Los datos son incorrectos O eCception $lass-ot3oundECception -o eCiste libreria U2'$Postgresl ON public pg3unctions( public pg3unctions( t*is#url t*is #url G )jdbcpostgreslNNlocal*ost>?01N) )jdbcpostgreslNNlocal*ost>?01N)TdbA TdbA try try NNobtenemos el driver de para mysl $lass#for-ame( $lass #for-ame()org#postgresl#2river) )org#postgresl#2river) A NNobtenemos la coneCin conn G 2riverManager 2riverManager#get$onnection( #get$onnection(t*is t*is#url, #url, t*is t*is#user #user , t*is t*is#passJord #passJord A Vcatc* catc*((SQLECception SQLECception e e System#err#println( System #err#println( e#getMessage( A Vcatc* catc*(($lass-ot3oundECception e System#err#println( System #err#println( e#getMessage( A V V NOO O Ejecuta la instruccion SQL para llamar a la funcin en postgreSQL O param $edula8"dentidad String ue es el identicador de la persona O return String el resultado de la funcin ON public String String $all3unction( $all3unction( String String $edula8"dentidad $edula8"dentidad String resG String resG)) ))AA try try statement G conn#createStatement(A conn#createStatement(A resultSet G statement#eCecuteQuery( )SELE$& registrar(D)T$edula8"dentidadT registrar(D) T$edula8"dentidadT)DA )DA )A )A J*ile (resultSet#neCt( J*ile (resultSet#neCt( resGresultSet#getString(4A V V catc* ( catc* (SQLECception SQLECception eC eC System#err#println( System #err#println( eC#getMessage( A V return resA return resA V V
E.!$icaci1n2 +n el constructor de clase, se realiza la cone=i"n a PostreSQL y se almacena en la ariale c0nn, el m)todo Ca$$/uncti0n4 nos sire para e#ecutar la funci"n y deoler el resultado en un String.
Por demás esta decir !ue para e#ecutarlo en tu pc, dees camiar los datos de cone=i"n, ase de datos, usuario y contrase3a, por los tuyos. +#ecutamos esta clase de la siguiente manerapg3unctions pgf G neJ neJ pg3unctions(A pg3unctions(A
System#out#println( System #out#println( pgf#$all3unction()410?>=+) pgf#$all3unction( )410?>=+) A
0teniendo como resultado-
Pr0cedimient0s Pr0cedimient0s a$macenad0s en P0st"reSq$ +dgar 5am8rez > 5am8rez > octure ?, @/B > Cases de datos, datos , PostgreSQL > 6o hay comentarios +n PostgreS!l a diferencia de otros motores de ases de datos, no e=iste una distinci"n e=plicita entre una funci"n y un procedimiento almacenado. +n PostgreS!l solo e=isten funciones, claro !ue estas pueden ser usadas a modo de una funci"n o de un procedimiento almacenado. Además de esta diferencia con otros motores de ases de datos, es importante mencionar !ue PostgreS!l nos ofrece más de un lengua#e para crear nuestros procedimientos almacenados, pudiendo elegir entre los siguientes lengua#es•
PLDPgSQL
•
(.
•
(EE.. (EE
•
Jaa PLDJaa Fe. Fe.
•
PLDPerl.
•
plPGP.. plPGP
•
PLDPython.. PLDPython
•
PLD5uy.. PLD5uy
•
PLDsh.. PLDsh
•
PLD$cl.. PLD$cl
•
PLDScheme.. PLDScheme
+n lo personal siempre me he inclinado por PlDPgSQL pues es un lengua#e procedural asado en SQL y !ue sigue el estándar A6S% SQL. Si deseas conocer más de PlDPgSQL a!u8 puedes encontrar la documentaci"n oficial. +n este art8culo eremos c"mo se crean funciones en PostgreS!l !ue nos deuelen un recordset y para ello usaremos la misma l"gica del procedimiento almacenado creado en Mys!l para el art8culo Procedimientos almacenados de Mys!l desde +=cel (on VCA y A&0 . 2 de igual forma al procedimiento en mys!l, crearemos una funci"n en PostgreS!l !ue nos deuela un recordset conteniendo una lista de pa8ses, esto claro, dependiendo del alor pasado a tra)s de un parámetro de entrada.
Para crear la funci"n, e#ecutaremos pgAdmin %%%
2 una ez autenticados en nuestro seridor y seleccionada la ase de datos en !ue traa#aremos e#ecutaremos el editor de consultas SQL !ue se encuentra en la arra de herramientas-
2 se nos mostrará el editor de consultas, en el !ue podremos e#ecutar tanto c"digo PLSQL como SQL.
9na ez aierto nuestro editor el primer paso será crear la tala listaHpaises y para ello deeremos e#ecutar el siguiente lo!ue SQL, modificando antes el userpostgre por el usuario !ue usas en tu seridor. I / @ ? B K 7 /
CREATE TABLE lista_paises ( id integer DEFAULT 0, opcion character varying(00! DEFAULT ""##character varying ! $%T& ( '%D)FALE !* ALTER TABLE lista_paises '$+ER T' serpostgre*
2a !ue tenemos la tala comenzaremos a crear nuestra funci"n. Para ello primero definimos el encaezado, y a!u8 es importante mencionar !ue en este caso, donde amos a deoler un recordset, deeremos declarar tantos parámetros de salida como columnas tenga nuestra consultaI CREATE 'R RE/ ( %+ -._' @ 'UT col ? 'UT col ! RETUR+ B &ado !ue la funci"n deolerá un recordset conteniendo las columnas id y opci"n, hemos agregado amos parámetros de salida a la funci"n y hemos agregado el parámetro de entrada PH0pcion !ue usaremos a manera de menN de selecci"n para decirle a la funci"n !ue lo!ue deerá e#ecutar. Al final del encaezado estalecemos el tipo de dato !ue deolerá la funci"n !ue en este caso será un recordset o set0# rec0rd. &eclarado el encaezado amos a continuar con el cuerpo de la funci"n !ue contendrá las operaciones a realizarI / 2B'D32 4egin @ %F -._'-C%'+ ) "DA5ET'D'" T&E+ ? retrn 6ery select id, opcion /ro lista_paises* E+D %F* B %F -._'-C%'+ ) "DA5EC%+C'" T&E+ K retrn 6ery select id, opcion /ro lista_paises liit 7* E+D %F* 7 retrn* / end* // 2B'D32 /@ LA+8UA8E "plpgs6l"* (omo podemos er, el c"digo es muy parecido al usado en Mys!l, con las ariantes de !ue a!u8 deemos estalecer con return query el recordset a deoler, además de tener !ue indicar el lengua#e a usar y el inicio y fin del cuerpo de la funci"n. Para e#ecutar el procedimiento almacenado e#ecutaremos la sentencia !ue nos deolerá el listadoI /
elect 9 Fro -_Dae-aises("DA5ET'D'"!*
9na ez !ue lo hayamos e#ecutado otendremos el siguiente resultado-
2 para terminar a!u8 está el lo!ue completo de la funci"nI / @ ? B K 7 / // /@ /? / /B
CREATE 'R RE-LACE FU+CT%'+ -_Dae-aises ( %+ -._'-C%'+ .ARC&AR(0! de/alt "DA5ET'D'", 'UT colna int, 'UT colna1 varchar(00! ! RETUR+ seto/ record A 2B'D32 4egin %F -._'-C%'+ ) "DA5ET'D'" T&E+ retrn 6ery select id, opcion /ro lista_paises* E+D %F* %F -._'-C%'+ ) "DA5EC%+C'" T&E+ retrn 6ery select id, opcion /ro lista_paises liit 7* E+D %F* retrn* end*
/K /
2B'D32 LA+8UA8E "plpgs6l"*
6o amos a e=plicar el potencial !ue tienen los procedimientos almacenados , solamente mencionaremos !ue desde J&C( podemos crear y llamar a ellos , en el siguiente e#emplo amos a traa#ar con la siguiente ase de dato
!ue ocupa el lengua#e plpgs!l< &esarrollo/.' primero tenemos !ue cargamos el #ar de prostgres en nuestro proyecto de neteans . @.' cargar nuestro procedimiento almacenado en la ase de dato , para lo cual arimos nuestra ase de datos y lo e#ecutamos. '''''''''' Procedimiento almacenado '''''''''''''''''''''''' (5+A$+ or replace O96($%06 estafunc;: 5+$956S %6$++5 AS &+(LA5+
cantidad %6$++5 -R ?< i integer -R /< C+%6 Fhile ;i R ?: loop 5A%S+ 60$%(+ (antidad contiene a!uiT U,i< i -R i E /< end loop< cantidad -R B< 5+$956 cantidad< +6&< LA69A+ plpgs!l< plpgs!l< ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ?.' lo llamamos desde nuestro codigo try (lass.for6ame;Worg.postgres!l.&rierW:< (onnection con R &rierManager.get(onnection; W#dc-postgres!l-DDlocalhostDeliminarW, WpostgresW, W/@?W:< (allaleStatement cs R con.prepare(all;Wcall estafunc;:XW:< 5esultSet rs R cs.e=ecuteQuery;:< if;rs.ne=t;:: System.out.println;WalorWErs.get%nt;/::< X Xcatch;+=ception e: System.out.println;Wfallo cone=ion W:< e.printStac*$race;:< X DDDDDDDDDDDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDD DDDDDDDDDDDDD lo importante del codigo es Ca$$a-$eStatement2 !ue es para e#ecutar procedimientos almacenados en la C&.
+n postgreSQL no e=iste el t)rmino S$05+& P50(+&95+, en su lugar e=isten S$05+& O96($%06. Pues son tan potentes y prácticos como los stored procedure. Algui)n preguntaa &e uena f)Y ZMe pueden decir por!ue no e=iste procedimientos almacenados en PostgreSQLI4. Pues en algNn momento la desesperaci"n !uizá nos inada y es cierto- PostreSQL tiene un modo diferente de traa#ar. Al inicio !uizá sea duro, pero como en todoY con la práctica se hace simple. 9na Ounci"n ;O96($%06: en PostgreSQL se puede escriir en multiples lengua#es de programaci"n. +n una instalaci"n por defecto de PostgreSQL podremos tener disponiles los siguientes lengua#esPLDpgSQL, PLDPerl, PLD$cl y PLDPython. $amien e=isten muchos otros lengua#es disponiles como m"dulos adicionales, entre ellos, PLDJaa, PLDPGP, PLD5, PLD5uy, PLDSheme y PLDsh, pero estos tienen !ue descargarse e instalarse por separado. PLDpgSQL es un lengua#e estructurado en lo!ues. Siempre hará un lo!ue principal en nuestra funci"n y dentro de este podremos tener sulo!ues. 9n lo!ue se define de la siguiente manera ;lo !ue haye entre corchetes [\ es opcional:. /
CREATE : 'R RE-LACE ; FU+CT%'+
@ ? B K 7 / // /@ /? / /B /K / /7 /
no4re_/ncion(: : argodo ; : argno4re ; argtipo :, <<<; ;! RETUR+ tipo A 22 : DECLARE ; : declaraciones de varia4les ; BE8%+ a6= va el cerpo de la /nci>n# el codigo
E+D* 22 LA+8UA8E plpgs6l ? %55UTABLE ? TABLE ? .'LAT%LE ? CALLED '+ +ULL %+-UT ? RETUR+ +ULL '+ +ULL %+-UT ? TR%CT ? : E@TER+AL ; ECUR%T3 %+.'ER ? : E@TER+AL ; ECUR%T3 DEF%+ER ? C'T eection_cost ? R'$ reslt_ros ? ET con/igration_paraeter T' vale ? ) vale ? FR'5 CURRE+T * 6o se desanimen si parece mucho c"digo seguid leyendo !ue descriiremos las opciones y alores más importantes. argmodo- +l modo de un argumento puede ser %6, 09$, or %609$. Por defecto se usa %6 si no se define. argtipo- Los tipos !ue podemos utilizar son todos los disponiles en PostgreSQL y todos los definidos por el usuario declaraciones de ariales- Las declaraciones de ariales se pueden realizar de la siguiente manera ;]n R orden de declaraci"n del argumento.:no4re_varia4le AL%A F'R 2n* no4re_varia4le : C'+TA+T ; tipo : / +'T +ULL ; : DEFAULT ? #) @ epresion ;* c"digo- la parte del codigo lo eremos unas lineas más aa#o. Pero adelanto !ue es lo !ue realmente !ueremos hacer ;el procedimiento en s8:. %MM9$ACL+ > S$ACL+ > V0LA$%L+%MM9$ACL+- %ndica !ue la funci"n no puede alterar a la ase de datos y !ue siempre deolerá el mismo resultado, dados los mismos alores como argumentos. +ste tipo de funciones no pueden realizar consultas en la ase de datos. S$ACL+- %ndica !ue la funci"n no puede alterar a la ase de datos y !ue siempre deolerá el mismo resultado en una consulta indiidual de una tala, dados los mismos alores como argumentos. +l resultado podria camiar entre sentencias SQL. V0LA$%L+- %ndica !ue la funci"n puede deoler diferentes alores, incluso dentro de una consulta
indiidual de una tala ;alor por defecto: (ALL+& 06 69LL %6P9$ > 5+$956S 69LL 06 69LL %6P9$ > S$5%($(ALL+& 06 69LL %6P9$- %ndica !ue la funci"n se e#ecutará aun!ue algunos de los argumentos sean 69LL. +l usuario tiene la responsailidad de comproar si algNn argumento es 69LL cuando sea necesario tener esto en cuenta.;alor por defecto: 5+$956S 69LL 06 69LL %6P9$ D S$5%($- %ndican !ue la funci"n no se e#ecutará y deolerá el alor 69LL si alguno de los argumentos es 69LL. S+(95%$2 %6V01+5 > S+(95%$2 &+O%6+5S+(95%$2 %6V01+5- %ndica !ue la funci"n se e#ecutará con los priilegios del usuario !ue la e#ecuta ;alor por defecto: S+(95%$2 &+O%6+5- %ndica !ue la funci"n se e#ecutará con los priilegios del usuario !ue la creo. Ahora amos a crear una Case de datos y unas talas para poder crear nuestras funciones. Los interesados en er más teoria en la página oficial de PostgreSQL hay uena documentaci"n. (omo estamos traa#ando desde PgAdmin %%%, amos al panel 0#ect CroFserDSerersD46omre de tu (one=ion4D &ataasesD (lic* derecho y 6eF &ataase4, Puedes poner el nomre !ue desees, yo le pondre pruea4. Para hailitar el lengua#e PLDpgSQL en el panel 0#ects CroFser4 uscamos la opci"n SerersD46omre de tu cone=i"n4D&ataasesD46omre de tu Case de &atos;pruea en este post4:4DLanguages. (lic* derecho en Languages y seleccionamos 6eF Language4 y cuando nos salgue la entana para uscar los lengua#es disponiles elegimos PLDpgSQL y le damos clic* en 01. Ahora creamos las talas. / @ ? B K 7 / // /@ /? / /B /K / /7 / @ @/
creaos na secencia 6e epeGarH en 0< +os sirve para controlar en 6e nIero iniciarH el capo atonIerico< ta4iJn pdios sar el tipo de dato ER%AL(-ostgreKL! )) AUT'_+U5ER%C(5ys6l! )) %DE+T%T3(KL erver!< CREATE EKUE+CE sarioe6ence TART 0* Creaos las ta4las pais y sarios CREATE TABLE pais( codpais ER%AL +'T +ULL, pais .ARC&AR(70! +'T +ULL, -R%5AR3 E3 (codpais! !* CREATE TABLE sarios( codsario %+T -R%5AR3 E3 DEFAULT netval ("sarioe6ence"!, a6i
@@ @? @ @B @K @ @7 @ ? ?/ ?@ ?? ? ?B ?K ? ?7 ? / @ ? B K 7 B B/ B@ B?
llaaos a la secencia codpais %+T +'T +ULL, no4res .ARC&AR(10! +'T +ULL, apellidos .ARC&AR(70! +'T +ULL, eail .ARC&AR(70! +'T +ULL, clave .ARC&AR(10! +'T +ULL, estado C&AR(! +'T +ULL, F'RE%8+ E3(codpais! REFERE+CE pais (codpais! '+ DELETE CACADE '+ U-DATE CACADE !* insertaos registros %+ERT %+T' pais(pais! .ALUE ("-erI"!* %+ERT %+T' pais(pais! .ALUE ("Argentina"!* %+ERT %+T' pais(pais! .ALUE ("Brasil"!* %+ERT %+T' pais(pais! .ALUE ("%nglaterra"!* %+ERT %+T' sarios (codpais, no4res, apellidos, eail, clave, estado ! .ALUE (,"ittas", "ragio", "ittasMgailn sar no CREATE 'R RE-LACE FU+CT%'+ addno(%+T! RETUR+ %+T A 22 BE8%+ RETUR+ 2 *
E+D* 22 LA+8UA8E plpgs6l* ELECT addno(7!* Fnci>n ver sarios por +o4re CREATE 'R RE-LACE FU+CT%'+ sarios_4ynae(no4re TE@T! RETUR+ ET'F %+T A 22 BE8%+ RETUR+ KUER3 ELECT codsario FR'5 sarios $&ERE no4res L%E no4re ?? "S"* E+D* 22 LA+8UA8E plpgs6l TABLE* ELECT sarios_4ynae(""!* Ahora compli!uemos un po!uito. Vamos a crear las funciones clásicas de S+L+($, %6S+5$, 9P&A$+ y &+L+$+. Oi#ense ien la parte como y el tipo de dato !ue retornan las funciones. +stas funciones lo usaremos en otro post de (^ con PostgreSQL as8 !ue pongan mucha antenci"n.
/ @ ? B K 7 / // /@ /? / /B /K / /7 / @ @/ @@ @? @ @B @K @ @7
P9 9999999999999999999999999 BE8%+ FU+C%'+E E+ -LPpgKL 99999999999999999999999999999P Fnci>n ELECT# El parHetro es el no4re crsor 6e nos traerH los datos i saos varia4les con no4res co4inados de 5ayIsclas y 5inIsclas de4eos ponerlos entre coillas do4les ( !< EQeplo# CREATE FU+CT%'+ verAllUsarios <<< CREATE 'R RE-LACE FU+CT%'+ versarios(re/crsor! RETUR+ re/crsor A 2B'D32 BE8%+ '-E+ 2 F'R ELECT 9 FR'5 sarios* RETUR+ 2* E+D* 2B'D32 LA+8UA8E "plpgs6l" .'LAT%LE*
elecciona las O prieras /ilas BE8%+ ELECT versarios("hola"! A Anser* FETC& F'R$ARD O in hola* i no eiste O nos develve solo las 6e
@ ? ?/ ?@ ?? ? ?B ?K ? ?7 ? / @ ? B K 7 B B/ B@ B? B BB BK B B7 B K K/ K@ K? K KB KK K K7 K / @ ? B K
encentre C'55%T* elecciona las N prieras /ilas y la /ila anterior de la selecci>n (ose la /ila 1! select versarios("icrsor"!* FETC& F'R$ARD N in icrsor* FETC& BAC$ARD in iCrsor* ELECT# El prier parHetro es el no4re crsor 6e nos traerH los datos, y el segndo el capo por el 6e hareos la 4s6eda CREATE 'R RE-LACE FU+CT%'+ sarios4ynae(re/crsor,tet! RETUR+ re/crsor A 2B'D32 BE8%+ '-E+ 2 F'R ELECT 9 FR'5 sarios $&ERE no4res L%E 21 ?? "S"* RETUR+ 2* E+D* 2B'D32 LA+8UA8E "plpgs6l" .'LAT%LE* BE8%+ ELECT sarios4ynae("otrocrsor",""!* FETC& ALL %+ otrocrsor* C'55%T* Fnci>n %+ERT# %nsertaos n registro a la ta4la CREATE 'R RE-LACE FU+CT%'+ insertar_sarios(%+T, .ARC&AR(10!, .ARC&AR(70!, .ARC&AR(70!,.ARC&AR(10!, C&AR(!! RETUR+ .'%D A 2B'D32 BE8%+ %+ERT %+T' sarios (codpais, no4res, apellidos, eail, clave, estado ! .ALUE (2, 21, 2N, 2, 27,2O!* E+D* 2B'D32 LA+8UA8E "plpgs6l" .'LAT%LE* BE8%+ ELECT insertar_sarios(,"artin", "dino", "artinMgail
7 7 7/ 7@ 7? 7 7B 7K 7 77 7 / @ ? B K 7 / // /@
"ari6in", "A" ! C'55%T* ELECT 9 FR'5 sarios* Fnci>n U-DATE# ActaliGaos n registro por el capo C>digo, devolveos TRUE si se actaliGa CREATE 'R RE-LACE FU+CT%'+ pdate_sarios(%+T, %+T, .ARC&AR(10!, .ARC&AR(70!, .ARC&AR(70!,.ARC&AR(10!, C&AR(!! RETUR+ B''L A 2B'D32 DECLARE codigo AL%A F'R 2* registro sariosSR'$T3-E* BE8%+ ELECT 9 %+T' registro FR'5 sarios $&ERE codsario ) codigo* %F F'U+D T&E+ U-DATE sarios ET codpais ) 21, no4res ) 2N, apellidos ) 2, eail ) 27, clave ) 2O, estado ) 2 $&ERE codsario ) codigo* RETUR+ TRUE* E+D %F* RETUR+ FALE* E+D* 2B'D32 LA+8UA8E "plpgs6l" .'LAT%LE* ELECT pdate_sarios(,N,"arin", "Vino", "arinMgailn DELETE# i se eliina n registro devolveos TRUE CREATE 'R RE-LACE FU+CT%'+ del_sario4ycod(%+T! RETUR+ B''L A 22 DECLARE codigo AL%A F'R 2* BE8%+ DELETE FR'5 sarios $&ERE codsario ) codigo* %F F'U+D T&E+ RETUR+ TRUE* ELE RETUR+ FALE*
E+D %F* E+D* 22 LA+8UA8E plpgs6l* ELECT 9 FR'5 del_sario4ycod(!* ELECT 9 FR'5 sarios* Fnci>n ELECT sando REC'RD CREATE 'R RE-LACE FU+CT%'+ traer_sarios(! RETUR+ ET'F record A 22 DECLARE rec record* BE8%+ F'R rec %+ ELECT 9 FR'5 sarios L'' retrn net rec* E+D L''-* RETUR+* E+D* 22 LA+8UA8E plpgs6l* BE8%+ ELECT 9 FR'5 traer_sarios(! A (codsario %+T,codpais %+T, no4res .ARC&AR(70!, apellidos .ARC&AR(70!, eail .ARC&AR(70!, clave .ARC&AR(70!, estado C&AR(! !* C'55%T* P9 9999999999999999999999999 E+D FU+C%'+E E+ -LPpgKL 99999999999999999999999999999P Las funciones !ue hemos escrito se pueden haer escrito de otros modos. Los !ue ya tienen algNn tiempo en esto me darán la raz"n. Pero pienso !ue para empezar esta ien. 2 en los otros post_s usar) otras sintá=is por e#emplo como adelanto camiemos la funci"n delHusuarioycod. +n lugar de los simolos ]] pudimos haer usado la comilla simple [ ` \, tami)n asignar defrente el parámetro, fi#ense tami)n la secci"n del %O
/ @ ? B K 7 / // /@
Fnci>n DELETE# i se eliina n registro devolveos TRUE CREATE 'R RE-LACE FU+CT%'+ del_sario4ycod(%+T! RETUR+ B''L A " BE8%+ DELETE FR'5 sarios $&ERE codsario ) 2* le asignaos de/rente el parHetro %F F'U+D T&E+ RETUR+ TRUE*
/?
E+D %F* ya no saos ELE RETUR+ FALE* por de/ecto serH /alse E+D* " LA+8UA8E plpgs6l*
ELECT 9 FR'5 del_sario4ycod(!* ELECT 9 FR'5 sarios* Cien pues +spero haye sido de proecho lo !ue escri8 y pues no oliden mucha práctica o*o*, nos emos hasta la pr"=ima