Você está na página 1de 3

30/6/2016

ServerNEWS[176]ProgramarconSQLincrustado

ServerNEWS[176]ProgramarconSQLincrustado
ParamuchosdesarrolladoresquetrabajanconSystemi,incluirsentenciasSQLenunprogramaRPG(uotroHLL)permiteobtenerlomejordeambos
ConSQLincrustado(oembebido)esposibleincluirsentenciasdeSQLenunprogramaescritoenotrolenguaje(comoelRPG).Laadicinenpuntos
estratgicosdecdigoescritoenSQLaprogramasescritosenRPG(oCoboloCL)permitemejorarelrendimiento,simplificarelcdigoy,aveces,hastalograr
algunaproezaqueniSQLniRPGsoncapacesderealizardeformaindependiente.
Desdeelpuntodevistadelosconocimientosnecesarios,todoloquehacefaltaparaempezarautilizarSQLincrustadoessaberprogramarenRPGyconocer
porencimalasintaxisdeSQL.TambinnecesitarDB2QueryManageryelprogramaproductobajolicenciaSQLDevelopmentKitparaiSeries(5722ST1),al
quenormalmenteseconocecomoelkitdedesarrollodeSQL.MuchosdepartamentosdeinformticaquedesarrollanprogramasparaelSystemiyatienen
esteLPPinstaladoyseincluyeenalgunasedicionesdei5/OSsincosteadicional.Sicumpleestascondicionesbsicas,yaestlistoparainvestigarcmose
integraelSQLincrustadoconRPG.
Familiarizarseconlosconceptos
EnunprogramaescritoenRPG,cadasentenciadeSQLdebeirprecedidaporunasentenciaExecSQL.DesdelaV5R4,elSQLincrustadopuedeescribirse
totalmenteenformatolibrecuandoseutilizalasintaxisdeformatolibre,hayquefinalizarcadasentenciadeSQLconunpuntoycoma.Sinembargo,siejecuta
unaversinanteriordei5/OS,deberencerrarcadasentenciadeSQLentresentenciasExecSQLyEndExec(estassentenciasdebenincluirunabarra
inclinada(/)enlacolumna7ycadalneaentrelassentenciasExecSQLyEndExecdebeincluirunsignoms(+)enlacolumna7):
Formatolibre(V5R4yposteriores)
ExecSQL
UpdateCustomerSetCusZip5=90212WhereCusNumb=4;
Formatofijo(anterioresV5R4)
C/ExecSQL
C+UpdateCustomerSetCusZip5=90212WhereCusNumb=4
C/EndExec
ElSQLincrustadoutilizavariablesdellenguajeprincipalparapasarlainformacinentrelassentenciasdeSQLyelcdigoescritoenRPG.Sepuedeaccedera
cualquiercampocomounavariabledellenguajeprincipalconsloaadirdospuntos(:)comoprefijoalnombredelcampo.Porejemplo,sepuedenutilizan
variablesdellenguajeprincipalparaestablecervaloresdecomparacinparapredicadosdeSQLbasadosenlaentradadelusuarioyparaaccederadatos
recuperadosporunasentenciadeSQL:
ExecSQL
UpdateCustomerSetCusZip5=90212
WhereCusNumb=:CustSelect;
DebidoaquelasvariablesdellenguajeprincipalpermitenalassentenciasdeSQLincrustadoaccederacualquiercampoaccesibleporRPG,puedesacarse
partidodetcnicasdeprogramacincomolasestructurasdedatosdefinidasexternamenteparareutilizardefinicionesdevariablesenvezdetenerquecrear
variablesdellenguajeprincipalexclusivasparacadaprograma.Aunaestructuradedatosquecontienesubcamposyseutilizacomovariabledellenguaje
principalselaconocecomoestructuradellenguajeprincipal.PuedehallarmsinformacinsobrelasestructurasdellenguajeprincipalenelmanualdelSQL
incrustado,cuyottulooficialesDB2"UniversalDatabaseforiSeriesEmbeddedSQLprogramming".
AdemsdelassentenciasdeSQL,queprobablementeyaconocer,elSQLincrustadopuedeincluirsentenciasdecontroldeSQL,alasquetambinse
conocecomoLenguajeproceduraldeSQL(SPL).Puedenutilizarsesentenciasdecontrolparamanejartareasdeprogramacin(enoposicinalastareasde
definicinoderecuperacindedatos)comoladefinicindevariablesylacomparacindedosvalores(unasentenciaif).EnelSystemi,lassentenciasde
controlsonvlidasenlosprocedimientosalmacenadosdeSQL,losdesencadenantesdeSQLylasfuncionesdefinidasporelusuariodeSQL,ascomoenel
SQLincrustado.
AhoraquehemosdefinidolaterminologaylosconceptosdeSQLincrustadoquepuedeencontrarse,veamoscmoponerloatrabajar.
Concentrarseenloscursores
UnodelosmejoresusosqueselepuedendaralSQLincrustadoesenlassituacionesenquehayqueseleccionardatosenfuncindedistintoscriteriosque
noformanpartedelaclavedelarchivo.Porejemplo,imagnesequetienequecrearuninformequeenumeretodoslospedidosdelosclientesdeExtremadura
quehanadquiridoundeterminadoartculoenlosltimosseismeses.Naturalmente,esposiblegeneraresteinformeutilizandoexclusivamenteRPG,peroSQL
destacaenestetipodetareasderecuperacindedatos.Porelcontrario,RPGesmuchomejorqueSQLdandoformatoalosdatosytieneunsoporte
excelenteparagenerarimpresos,algoqueSQLnopuedehacerdirectamente.Combinandoamboslenguajesesposiblesimplificarelcdigoyseguramente
mejorarelrendimientodelaaplicacin.
ElobjetivodebeserdejarqueSQLseencarguedelapartedelproblemareferentealaconsultayqueRPGproceselosdatosseleccionados,denominados
conjuntoderesultados(unconjuntoderesultadoseslasalidadeunasentenciaSelectdeSQL.Puedeimaginarseunconjuntoderesultadoscomounahojade
clculoquecontienelosdatosquesatisfacenlaconsulta).
HayuntrucomuysencilloparatrabajarconconjuntosderesultadosenSQLincrustadoyconsisteendeclararuncursorparaunasentenciaSelectyutilizarlo
http://www.help400.es/asp/scripts/nwart.asp?Num=176&Pag=18&Tip=T

1/4

30/6/2016

ServerNEWS[176]ProgramarconSQLincrustado

(identificadopornombre)comopunteroparadesplazarseporelconjuntoderesultados.Serequierencuatropasosbsicos:
1.Declararelcursor(enelpuntoA).
2.Abrirelcursor(nolatablaenelpuntoB).
3.Obtenerfilasdelcursor(enelpuntoC).
4.Cerrarelcursor(enelpuntoD).
DTestValS5S0
DSqlStateNoRowCConst(02000)
DMoreRowsS10AInz(True)
DCustRecEDSEXTNAME(Customer)
/FREE
TestVal=90210;
A>ExecSQL
DeclareCustCursorCursorfor
Select*FromCustomer
WhereCusZip5=:TestVal
ForReadOnly;
B>ExecSQL
OpenCustCursor;
Dow(MoreRows=True);
C>ExecSQL
FetchNextfromCUSTCURSOR
Into:CustRec;
If(SQLSTT=SqlStateNoRow);
MOREROWS=False;
Else;
//Dosomethingwiththeretrievedrow
EndIf;
EndDo;
D>ExecSQL
CloseCustCursor;
*INLR=*ON;
LasentenciaFetch(enelpuntoC)enrealidadrecuperafilasdelconjuntoderesultadosynormalmenteestencerradaenunaestructuradebucledeRPG
(DOWoDOU,porejemplo)demodoqueserepiteparacadafiladelconjuntoderesultados.CuandoFetchllegaalfinaldelconjuntoderesultados,semuestra
unerrordeSQL,aunque,naturalmente,setratadeunacondicinyaprevista.
Unavezobtenidoelconjuntoderesultados,normalmentehayquehaceralgoconlosdatos.Porejemplo,puedequedeseemostrarlosdatosrecuperadosen
unapginaweboenunsubarchivo,imprimirlosenuninformeoactualizarlasfilasseleccionadas.Elcdigoanteriorrecuperalosdatosdeunafila,deunaen
una,ylosponeadisposicindelprogramaescritoenRPG.Noobstante,alutilizarunbloqueFetch,sepuedenrecuperarvariasfilasenunaestructuradel
lenguajeprincipal,loqueresultatilparamontarunapantallainteractiva,porejemplo.
TambinpuedeutilizarseuncursordeSQLparaaccederalabasededatossubyacenteconelfinderealizaroperacionesdeactualizacinydesupresin,
comomuestralaFigura4(figurasenlaversinimpresa).HayunascuantasdiferenciasimportantesentreelcdigoanterioryeldelaFigura4.Laprimeraes
queelcursorsehadeclaradoforreadonly(loquemejoraelrendimiento),mientrasqueeldelafigurasedeclaraforupdate.Lasegundadiferenciaentre
ambosejemploseslaadicindelasentenciaUpdate.LaadicindeWhereCurrentofCustCursorhacelaconexinentrelaactualizacinylaposicindel
cursor.
UnaltimaposibilidaddeloscursoresdeSQLquepuedequeleinteresetenerpresenteesquepuedenleerelconjuntoderesultadosrepetidamenteoenun
ordendistintoaldelprimeroalltimo.Loscursoresquetienenesasposibilidadesseconocencomocursoresdesplazables.Paradeclararuncursor
desplazable,slohayqueaadirlapalabraclavescrollaladefinicindelcursor.EllopermitedisponerdeposibilidadesadicionalesenlasentenciaFetch,como
leerelconjuntoderesultadosalrevs,saltaradelanteoatrsenelconjuntoderesultadosovolveraleerlodespusdellegaralfinal.(Puedehallarms
informacinsobreloscursoresdeSQLenlaseccin"Usingacursor"delInformationCenter.ParallegaraestaseccindeladocumentacindelaV5R4,debe
seguirestecamino:Basededatos/Programacin/SQLprogramming/UsingSQLindifferentenvironments).
ElSQLincrustadonoestlimitadoarecuperarconjuntosderesultadosyatrabajarconlasfilasseleccionadasdeformaindividual.Tambinpuede
aprovecharselacapacidaddeSQLdeinsertar,actualizaroeliminarvariasfilasconunasolasentencia.
Actualizarsiete(osetenta)filasalavez
Pienseentodaslasvecesquealguienlehapedidoalgodeltipo:"BscametodoslosclientesdeAndaluca,Extremadura,CastillaLaManchaoMurciay
cambiatodosloscdigosdereadeventapor27".Tantosiesunapeticinespordicacomosiserepiteperidicamente,desarrollarunasolucinenRPG
puedeserdifcilyelcdigoresultantepuedeserpocoeficiente.Sinembargo,SQLpermiteactualizar(oeliminaroinsertar)fcilmentevariasfilasconunasola
sentencia.Siesaspeticionesseproducenfrecuentemente,envezdeescribiryejecutarunasentenciadeSQLadhoc,puedeincrustarunasentenciaenun
http://www.help400.es/asp/scripts/nwart.asp?Num=176&Pag=18&Tip=T

2/4

30/6/2016

ServerNEWS[176]ProgramarconSQLincrustado

programaescritoenRPGydejarqueseaelusuarioelqueespecifiquelaComunidadAutnomayelnuevocdigoderea.Puedeutilizarlamismatcnica
paraeliminartodaslasfilasquecumplandeterminadocriteriocambiandolasentenciaUpdateporunasentenciaDelete.PienseenlaposibilidaddeutilizarSQL
incrustadocuandotengaqueactualizaroeliminarvariasfilasdeunatabla.
ComparelatcnicaquesemuestraenlaFigura5conunaactualizacinbasadaenuncursor,comoladelaFigura4.ElcdigodelaFigura4actualizar
solamenteunafilacadavezqueseejecutelasentenciaUpdate,mientrasquelasentenciaUpdatedelaFigura5actualizarvariasfilascadavezquese
ejecute.Sideseaactualizardelamismaformatodaslasfilasquesatisfacenundeterminadocriterio(porejemplo,cambiarelcdigodereaa27),utiliceuna
sentenciaUpdatesinrecuperarprimerounconjuntoderesultados(Figura5).Sinembargo,sideseaseleccionarvariasfilasyluegoactualizarsolamente
algunasdeesasfilas(permitiendoalusuarioseleccionarlasdeunalista,porejemplo),leinteresarrecuperarelconjuntoderesultadosyluegoutilizarelcursor
paraactualizarlasfilasseleccionadasenlabasededatossubyacente(Figura4).
UtilizarSQLincrustadoparainsertardatosesalgodistintoqueutilizarSQLparallevaracabooperacionesdeactualizacinysupresin.Esoesasporque,por
omisin,unasentenciaInsertdeSQLaadeunasolafilaalabasededatos,einsertarunasolafilaesunatareaqueRPGmanejaalmenostanbiencomo
SQL.Noobstante,esposibleescribirsentenciasInsertqueaadanvariasfilasaunatabla(otablas)copiandolosdatosseleccionadosdeotratabla.En
situacionesenqueseanecesarioinsertarvariasfilas,tengaencuentalaposibilidaddeutilizarSQLincrustadoenvezdeaadircadafiladentrodeunbucleen
elcdigoescritoenRPG.
Evitarlasdificultades
LosprogramasescritosenILERPGqueincluyanSQLdebentenerSQLRPGLEcomotipodemiembro.ExistentiposdemiembrosparecidosparaILECobol
(SQLCBLLE),ascomoparaCLylasversionesdeloslenguajesdelSystemiquenosonILE,peronosotroscontinuaremosconILERPG.Elmiembrofuente
SQLRPGLEsecompilautilizandoelmandatoCrearobjetoSQLILERPG(CRTSQLRPGI),queejecutaelprecompiladordeSQLantesdeejecutarelcompilador
deRPG.LosvaloresseleccionadosparalasdistintasopcionesdelmandatoCRTSQLRPGIcontrolanelprecompiladordeSQLypuedenafectaralaejecucin
delcdigodeSQLincrustado.PuedehallarinformacindetalladasobretodaslasopcionesdelprecompiladorenlainformacindeconsultadeCLreferenteal
mandatoCRTSQLRPGI.
Lagestindelistasdebibliotecases,condiferencia,elobstculomsimportantequetendrquesalvarcuandotrabajeconSQLenunentornoSystemi.Para
losprogramasqueincluyenSQLincrustado,lasolucinmssencillaenlamayoradeloscasosesestablecerelconveniodedenominacindeSQLa*SYS.
Losresultadosqueofreceestemtodosonidnticosomuyparecidosalaslistasdebibliotecasqueestamosacostumbradosautilizarconlasaplicaciones
tradicionalesescritasenRPG.Porreglageneral,utiliceelconveniodedenominacindelsistema(*SYS)cuandodesarrolleunaaplicacinqueutilicelenguajes
tradicionalesdelSystemiyseejecuteensutotalidadenelSystemi.UseelconveniodedenominacindeSQL(*SQL)sielprogramadeSQLincrustadopuede
llamarsedesdeuncomponentedecdigoquenoesespecficodelSystemicomopudieraser,porejemplo,unmtododeJava.
OtracuestindevitalimportanciaquehayquetenerencuentaalahoradedisearaplicacionesqueincluyenSQLincrustadoeselrendimiento.Loideales
quelaadicindeSQLincrustadoalasherramientasdedesarrollodisponiblesmejoreelrendimientopero,claro,lacosanoestansencilla.SQLpuede
degradarelrendimientosiseutilizaencasosenqueelaccesonativoalabasededatosfuncionamejorosielcdigoSQLestescritodetalformaqueimpida
aloptimizadordeconsultas(elmotordeconsultasdei5/OS)queejecuteelcdigodeformaeficiente.Demaneraquedebeestarpreparadopararealizar
algunosanlisisderendimiento,enespecialparalasaplicacionesqueincluyenconsultascomplejasqueprocesangrandescantidadesdedatos.Porsuerte,
i5/OSincluyeunmontndeherramientasquepermitencuantificarelrendimientodeSQLydeterminardndehaycuellosdebotella.Consulteellibrorojo
"OnDemandSQLPerformanceAnalisysSimplifiedonDB2fori5/OSinV5R4"(SG247326)paraobtenermsinformacin.
Porltimo,comoharaconcualquierotraaplicacin,eviteescribirprogramascodificadosdeformapredeterminada(hardcoded)yminimiceelcdigo
redundanteenlosprogramasescritosenSQLincrustado.Paracumplirestosobjetivosdeberutilizarprogramasdeservicio,procedimientosalmacenadosy
otrastcnicasquesegmentanelcdigoencomponentesmanejablesyreutilizables.Enelartculo"CoexistenciaentrelosmtodostradicionalesySQL"
publicadoenelnmero160seofrecenotrasindicacionesgenerales.
PongasusconocimientosdeSQLatrabajar
IncorporarcdigoSQLasusaplicacionesdelSysteminonecesariamentedebeconsistirensustituirelaccesonativoalabasededatossetratadeutilizar
SQLenlassituacionesqueRPGnopuedemanejaroqueleseradifcilmanejar.HaymltiplestcnicasquelepermitirnutilizarSQLdeestaforma,pero
probablementeustedyatengalosconocimientosnecesariosparaempezaraescribirprogramasqueusenSQLincrustado.Solamentehemosdescritomuypor
encimaloquepuedehacerseconelSQLincrustado,perohallarmuchamsinformacinenelmanualdeprogramacindeSQLincrustadoyenlosartculos
deestenmerodeServerNEWSyotrosanteriores.
SharonL.HoffmanesunaveteranaredactoratcnicadeServerNEWS.EmpezatrabajarconsistemasmidrangedeIBMen1981ydesucurrculocabe
destacarsudilatadaexperienciaeneldesarrollodeaplicaciones,ascomosudedicacinalaformacintcnica.
TotalLecturas:10186|Recomendarsulectura:

PublicacionesHELP400,S.L.(Todoslosderechosreservados)

help400.esInformacintcnica
ydegestinpara
IBMiAS/400

http://www.help400.es/asp/scripts/nwart.asp?Num=176&Pag=18&Tip=T

3/4

Você também pode gostar