Академический Документы
Профессиональный Документы
Культура Документы
objetos
SGBDOO.ObjetosenOracle
PresentacindelaUniversidadReyJuanCarlos
TeoriadeBRObjetoRelacionales
Definicindeunobjeto
Paradefinirunobjetosecreaunnuevotipo.
Secreaunconstructorpordefectoquedeberecibirlosatributosenelordenenelquesehayandefinidoalcrearelnuevotipo
A)CreamosunobjetodeltipoTABLONcon2atributos(largoyancho)y3mtodos(area,perimetroyprecioalqueselepasarun
preciopormetrocuadrado):
createorreplaceTYPETABLONASOBJECT(
largointeger,
anchointeger,
memberfunctionareareturninteger,
memberfunctionperimetroreturninteger,
memberfunctionprecio(pfloat)returnfloat
)
B)Definimoselcuerpodelobjeto(ladefinicindelosmtodos)
createorreplaceTYPEBODYTABLONAS
memberfunctionareareturnintegerAS
resultadointeger
BEGIN
resultado:=largo*ancho
RETURNresultado
ENDarea
memberfunctionperimetroreturnintegerAS
resultadointeger
BEGIN
resultado:=2*largo+2*ancho
RETURNresultado
ENDperimetro
memberfunctionprecio(pfloat)returnfloatAS
resultadofloat
BEGIN
resultado:=area*p
RETURNresultado
ENDprecio
END
UsodesentenciasSQLconobjetos:
Creacindetablasenlasqueunodeloscamposesunobjeto.
CrearemosunatablallamadamueblequecontieneobjetosdeltipoTABLON(verdibujo):
CREATETABLEMUEBLE(NUMEROINT,CANTIDADINT,ELEMENTOCHEMA.TABLON)
InsercinderegistrosenlatablaMUEBLE
Creamoslosregistrosdelmueble:
insertintomueblevalues(1,2,newtablon(180,30))
insertintomueblevalues(2,3,newtablon(100,30))
insertintomueblevalues(3,1,newtablon(120,30))
Operacionessobreelmueble:
http://www.vespino.com/~chema/daw1/tutoriales/oracle/objetos.htm
1/5
28/2/2016
objetos
Verloscomponentes:select*frommueblem
Dimensionesdelastablas:selectm.cantidad,m.elemento.largo,m.elemento.ancho
frommueblem
Areas,permetrosycostedecadatabla(a23/m2):select
m.cantidad,m.elemento.area(),m.elemento.perimetro(),m.elemento.precio(0.0023)
frommueblem
Preciototaldelmueble(a23/m2):selectsum(m.cantidad*m.elemento.precio(0.0023))frommueblem>53,82
Sepuedenhacercondicionescomom.elemento.area()<100
operacionesdeactualizacincomoupdatemueblemsetm.elemento.largo=200wherenumero=1parahacerelmueblede200
cmdealtoenvezde180
Usodeobjetosenfunciones
createorreplaceFUNCTIONfuncion_con_objeto(aint,bint)RETURNVARCHAR2AS
r1tablon
BEGIN
r1:=NEWtablon(a,b)
return'Elareaes'||r1.area()
END
selectfuncion_con_objeto(10,20)fromdualdevuelveeltextoElareaes200
Atributosmultivaluados
La1FNindicaquenodebenasistiratributosmultivaluados.Sinembargo,enBDOOsepuedecrearatributosquepuedantenermsde
unvalorysermanejadosdeunaformasencilla
Colecciones
Esungrupodeelementosdelmismotipo.Porejemplo,supongamosquesedeseaalmacenardatosatmicosdelosempleadosdeuna
empresa(porejemplo,elnombre)juntoconelnombredesushijos(multivaluado).EnBDrelacionalessegeneran2tablas:empleadose
hijos.LaFKdehijoseslaPKdeempleados.EnBDOOsecrearaunacoleccin:
TiposNuevoTipoNombre=colec_hijosTipo=tipodematrizDefinirCompilar
CREATEORREPLACETYPECOLEC_HIJOSASVARRAY(10)OFvarchar2(30)
Deestaforma,sedefineeltipocolec_hijosquepuedealmacenarunmximode10hijos,cadaunoconhasta30caracteresensunombre
Unavezdefinidalacoleccin,sepuedecrearlatablaempleadoquecontieneuncampodeltipocolecc_hijos
CREATETABLE"CHEMA"."EMPLEADO"(
"ID"NUMBER,
"NOMBRE"VARCHAR2(20BYTE),
"APELLIDOS"VARCHAR2(20BYTE),
"HIJOS""CHEMA"."COLEC_HIJOS",
CONSTRAINT"PRK1"PRIMARYKEY("ID")
)
http://www.vespino.com/~chema/daw1/tutoriales/oracle/objetos.htm
2/5
28/2/2016
objetos
Acontinuacinsepuedeninsertarregistrosenlatablaempleadoyseleccionarlos:
NoesposibleaccederaloselementosindividualesdeunacoleccindesdeuncomandoSQL.EsprecisorealizarunprogramaPLSQL
Tablasanidadas
Existelaposibilidaddenolimitarlacantidaddevaloresdentrodelatributomultivaluado,haciendoqueelcamposeadeltipotabla
Enelejemploanterior,elnmeromximodehijoserade10.Podemoshacerloilimitadodefiniendountipotabla:
CREATEORREPLACETYPETABLA_HIJOSASTABLEOFvarchar2(30)
Despussecrealatablaempleadoconuncampodeltipotabla_hijos.Esprecisodesdeeleditordelatabladarunnombrealatabla
anidadanestedtable(ennuestrocasot_hijos)
Deestaformasepasadetablasde2dimensiones(fila,columna)a3dimensiones(fila,columna,filadetipos).Evidentementesepuede
tenervariosnivelesdetablasanidadas
Verelgrficoconlasdistintasrdenesparainsertar,seleccionar,borrar,sustituir,...
Lomstiles
1.Crearuntipoobjetoconsusatributos
2.Crearuntipotablaconelobjetoanterior
3.Crearunatablaconuncampoqueseaunatablaanidadadelobjetocreadoenelpunto2
Ejemplo:queremosalmacenarlossiguientesdatosdenuestrosclientes:
Identificativodelcliente
Nombre
Telfonodelcliente
Peronosdamoscuentaqueunclientetienetelfonopersonaldecasaymvil,telfonodelaempresaymvildelaempresa,esdecir,de
1a4telefnos
1)Creamosunobjetodeltipotelefonocon2campos:tipo(casa,trabajo,fijo,mvil,...)yelnumero
CREATEORREPLACETYPETELEFONOASOBJECT(tipovarchar2(30),numeronumber)
2)Creamosuntipotablallamadolistinquepuedecontenermltiplesobjetosdeltipotelfono
http://www.vespino.com/~chema/daw1/tutoriales/oracle/objetos.htm
3/5
28/2/2016
objetos
CREATEORREPLACETYPELISTINASTABLEOFtelefono
3)Creamosunatablaconlosdatosdeunclienteentrelosqueseencuentrauncampodeltipolistin
Deestaforma,secreaunatablaenlaqueelcampoTELFSesotratablacon2campos:tipoynumero
ID NOMBRE APELLIDOS
TELS
TIPO NUMERO
Francisco
Perez
Esperanza Jimenez
Casa
111
Movil
666
Trabajo
777
TIPO NUMERO
Casa
222
UsamoslasdistintasrdenesSQLconlatablaortriginal(cliente)ylatablaanidada(tel_tab):
Insertounclientecon2telefonos
INSERTINTOcliente(ID,nombre,apellidos,telfs)values(1,'Francisco','Perez',listin(telefono('Casa',111),telefono('Movil',666)))
Insertounclientecon1telefono
INSERTINTOcliente(ID,nombre,apellidos,telfs)values(2,'Esperanza','Jimenez',listin(telefono('Casa',222)))
Aadountelefonoalcliente1.VerelusodelapalabraclaveTABLEquerecibelatablaanidada
INSERTINTOTABLE(SELECTtelfsFROMclienteWHEREid=1)VALUES('Trabajo',777)
Listadodeclientesysustelefonos(desanidamiento)
SELECTt1.nombre,t1.apellidos,t2.tipo,t2.numeroFROMclientet1,TABLE(t1.telfs)t2
Busquedadeuntelefonoconcreto
SELECTt1.nombre,t1.apellidos,t2.tipo,t2.numeroFROMclientet1,TABLE(t1.telfs)t2WHEREt2.numero=777
TelefonosdePerez
SELECTt2.tipo,t2.numeroFROMclientet1,TABLE(t1.telfs)t2WHEREt1.apellidos='Perez'
CambioeltelefonodecasadePerez
UPDATETABLE(SELECTtelfsFROMclienteWHEREapellidos='Perez')SETnumero=112WHEREtipo='Casa'
BorroeltelefonoMovildePerez
DELETEFROMTABLE(SELECTtelfsFROMclienteWHEREapellidos='Perez')WHEREtipo='Movil'
AccesoaObjetosOracledesdeJava
http://www.vespino.com/~chema/daw1/tutoriales/oracle/objetos.htm
4/5
28/2/2016
objetos
//Copiarlalibreraojdbc6.jar(uojdbc5.jar)enC:/BlueJ/lib/userlib.
//LalibreraestenelservidordeOracle
importjava.sql.*
classOracle{
publicstaticvoidmain(Stringargs[])throwsException{
DriverManager.registerDriver(neworacle.jdbc.driver.OracleDriver())
Class.forName("oracle.jdbc.driver.OracleDriver")
Connectionconn=DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.253:1521:asir2","chema","chema")
Statementstmt=conn.createStatement()
//Accedoalatablaquetieneelcamponombre(varchar2)yrecta(deltiporectangulo)
ResultSetrset=stmt.executeQuery("selectnombre,rectafromrectangulos")
while(rset.next()){
//Obtengoelcamponombre
Stringnombre=rset.getString(1)
//Obtengoelobjetorectangulo
oracle.sql.STRUCTobjeto=(oracle.sql.STRUCT)rset.getObject(2)
//Sacosusatributos
Object[]atributos=objeto.getAttributes()
java.math.BigDecimalalto=(java.math.BigDecimal)atributos[0]
java.math.BigDecimalancho=(java.math.BigDecimal)atributos[1]
//Yparaaccederalafunctionmtododime_area()?
//Estonosehacerlo
//Imprimolafilacompleta
System.out.println("Nombre:"+nombre+".Dimensiones:"+alto+"x"+ancho)
}
//ParaINSERT,DELETEoUPDATE,seusaexecuteUpdate
//stmt.executeUpdate("INSERTINTOrectangulosVALUES('quinto',newrectangulo(5,555))")
//PuedohacerusodelosmtodosenlasentenciaSELECTqueatacaaOracle
rset=stmt.executeQuery("SELECTnombre,r.recta.dime_area()FROMrectangulosrWHEREr.recta.dime_area()>100")
System.out.println("Rectangulosconareamayorde100:")
while(rset.next()){
System.out.println(rset.getString(1)+">"+rset.getInt(2))
}
stmt.close()
}
}
http://www.vespino.com/~chema/daw1/tutoriales/oracle/objetos.htm
5/5