Métodos constructores en SQL ¿Alguien me ayuda?
#1
Cita
Buenas, recuerdo haber visto un hilo de ayuda informática pero el caso es que ahora no lo encuentro.

Estoy aprendiendo a crear tipos de objetos en SQL y eso más o menos lo tengo controlao, pero también tengo que crear métodos constructores en SQL y ahí me pierdo. He leído cosas en internet sobre los métodos en Java, pero claro, no es idéntico a como se hace en SQL Oracle y me pierdo. El caso es que tampoco doy con ejercicios similares en internet, todo lo que encuentro es en Java. ¿Alguien sabe crearlos en SQL? Me haría un gran favor!┬á adorar
#2
Cita
veamos, te me estas explicando fatal... y me es dificil seguirte.

estas preguntando por el create table?

En SQL tenemos el:

- CREATE para crear estructuras
- ALTER modificar estructuras
- DROP cargarse estructuras

- SELECT seleccionar datos
- INSERT insertar datos
- UPDATE Actualizar datos
- REPLACE Reemplazar datos (es un delete + un insert, la logica difiere de un update)
- DELETE borrar datos

Para crear una tabla, mas o menos:

create table pepe
a int,
b string key
c...
y luego lo de los indices que puede cambiar radicalmente de una bd a otra... pero es lo más importante de todo, con diferencia. Todo el rendimiento está ahí. (bueno, y en ciertas bd en la estructura de los datos, de hecho seguro que con otra estructura de datos estos foros rendirian mejor)
[align=center]Y mientras, en SobreLoQueOpinar...

[b]Análisis: Metroid Prime 3: Corruption
#3
Cita
Nos quedará la duda de si yo me explico mal o si tu entiendes mal, o incluso puede ser que ambos tengamos parte de responsabilidad┬á birra

Pero el caso es que lo que tu comentas es SQL a secas, con su creación de tablas, sus datos, sus relaciones entre tablas, etc... y eso no es de lo que hablo. Yo hablo de crear tipos de objetos en SQL, con sus correspondientes atributos y métodos. Puede que no lo conozcas en SQL ya que lo normal es asociarlo a Java, y de ahí que no lo hayas entendido, de hecho en internet hay muy poca info sobre el tema. De SQL a secas, internet está lleno de tutoriales por ejemplo.
(Ultima edición: 02-05-2013 13:03 por ZID.)
#4
Cita
Pero es que me estas hablando como de objetos.

Sql no es un lenguaje orientado a onjetos.

Si me dices triggers, funciones, metodos, jobs... Aun. Toda logica orientada a objetos dentro de sql(por ejemplo la de sql server) no es estandard y depende de la bd dada.

Al menos que yo sepa
[align=center]Y mientras, en SobreLoQueOpinar...

[b]Análisis: Metroid Prime 3: Corruption
#5
Cita
(02-05-2013 13:46)thewazaa link escribió:Pero es que me estas hablando como de objetos.

Sql no es un lenguaje orientado a onjetos.

Si me dices triggers, funciones, metodos, jobs... Aun. Toda logica orientada a objetos dentro de sql(por ejemplo la de sql server) no es estandard y depende de la bd dada.

Al menos que yo sepa

Equiliquá! SQL permite ser usado como lenguaje orientado a objetos gracias a PL/SQL
#6
Cita
PL/SQL es de Oracle... bien, el tema es que dependes al 100% de la base datos. Pero todas tienen su lenguaje, con más o menos algunos puntos en común.

En fin, vamos a lo básico:

1. El lenguaje de BD es en teoria el mejor sitio para poner código. Es lo que rinde más.
2. Pero a su vez es donde hay más posibilidades de hacer el código ilegible, y de más dificil mantener

A modo de ejemplo en el trabajo hay un código que importa y valida datos y demas mandangas a partir de unos XMLs... parece muy chulo, pero el código es una maldita función de unas diez mil lineas. Mas de una vez he deseado matar al que hizo eso... porque es el tipico codigo que cuando lo dejas una semana, ya no sabes manejarlo.

3. No comiences creando la función o el procedure. Ese es el último paso. Comienza declarando las variables de entrada, con unos valores estandard.
4. Pon una parte del código que quieras hacer.

Por ejemplo

declare int i;
declare int total;

set @i = 100;

select @total=count(*) from a;
select top(@i) * from a;

5. Una vez probado y encontrados los puntos de error (que no encontrarias si probaras directamente la función, ya puedes usar el create para crear la función.

Una vez creada una primera función vamos a definir aspectos.

procedure es una funcion normal que tu ejecutas. El uso es a modod e auxiliar a otra funcion o para realizar un conjunto de tareas complejas o conjuntas desde un programa. A modo de ejemplo: listar elementos de una tabla a la vez de informar de cuantos elementos hay.
Function: son funciones que te da la base datos de serie. Ejemplo rand() del mysql
trigger. Un trigger es un procedure que ejecuta un trabajo en un evento de base datos, normalmente ligado a una tabla. Los eventos pueden ser insert, update, delete, select... y puede suceder ANTES de realizar el trabajo, o DESPUES de realizar el trabajo.
Es práctico en sistemas transaccionales donde se usan para a partir de la transacción se ejecute el trabajo directamente.
job. Este no recuerdo haberlo visto en mysql... un job es un trabajo. Algo que se ejecuta cada dia en una hora determinada y te hace un reporte. Sus usos pueden ser de lo mas básico a lo mas complejo: eliminar datos viejos de transacciones no usados, mantenimiento de tablas con alta movilidad, etc.

Y... recuerdo que hablo en formato "de andar por casa".

Pero insisto, buena parte de todo esto se escapa del standard sql. Así que si pones un par de ejemplos de que quieres hacer será más facil ayudarte.
[align=center]Y mientras, en SobreLoQueOpinar...

[b]Análisis: Metroid Prime 3: Corruption
#7
Cita
Gracias por tus ganas de ayudar thewazaa, voy a colocar el ejercicio que me tiene bloqueado a ver si me lo muestras en java y a partir de ahí yo soy capaz de pasarlo a SQL. Sobre lo que comentas, el problema es que todo eso que dices ya lo domino, esto no va de funciones, ni de triggers, ni aparece ningún procedure por ningún lado. Eso no es orientado a objetos.

De cualquier manera, el texto que me tiene bloqueado es el siguiente:

"Crea un método constructor para el tipo de objetos "Profesor", en el que se indiquen como parámetros el código, nombre, primer apellido, segundo apellido y especialidad. Este método debe asignar al atributo "apellidos" los datos de primer apellido y segundo apellido que se han pasado como parámetros, uniéndolos con un espacio entre ellos"

Seguro que en Java es fácil. Pero yo no domino Java, ese es el problema. De hecho que no consigo hacer lo que quiero ni en pseudocódigo así que imagina.

Saludos!
#8
Cita
Vaaaaale.

Esto no va de nada de base datos.

Es facil.

Te hagi pseudocodigo

Class profesor {
Public string codigo
... Nombre
... Apellido1
... Apellido2
... Especialidad
String apellidos {
Get{
Return apellido1+" ,+apellido2
}}
Public profesor(lista parametros){
This.nombre=nombre
...
}
}

Ya esta. Prdom la calidad del codigo pero estoy en el ipad.

Sencillamente se crea una clase con los parametros, y el constructor con el que se llenan. Todos, a excepcion de apellidos... Que es un atributo, no una variable. Los atributos son como variables pero orientadas al trabajo. El get devuelve un valor en base un codigo. El set hace algun trabajo.

En este caso la idea es, en vez de guardar informacion duplicada, cuando pida os los apellidos, cojamos la informacion de las variables. El resultado es que es como si trabajaras con una variable.
[align=center]Y mientras, en SobreLoQueOpinar...

[b]Análisis: Metroid Prime 3: Corruption
#9
Cita
Gracias!

Lo voy a mirar a ver si a partir de ahí logro sacarlo en SQL!
#10
Cita
Mira thewazaa, ya que me estás intentando ayudar te pongo lo que he "logrado" al intentar pasarlo a SQL. Por ahora la parte final es la que está mal según me dice Oracle, pero lo pongo por si ves algo que no te cuadre, lo mismo eso ayuda a darle forma al código final.


CREATE OR REPLACE TYPE MiembroEscolar AS OBJECT
(
codigo INTEGER,
dni VARCHAR2(10),
nombre VARCHAR2(30),
apellidos VARCHAR2(30),
sexo VARCHAR2(1),
fecha_nac DATE
) NOT FINAL;

CREATE OR REPLACE TYPE Profesor UNDER MiembroEscolar
(
especialidad VARCHAR2(20), antiguedad INTEGER,

CONSTRUCTOR FUNCTION Profesor(codigo INTEGER, nombre VARCHAR2, primerapellido VARCHAR2, segundoapellido VARCHAR2, especialidad VARCHAR2)
RETURN SELF AS RESULT,

MEMBER PROCEDURE setNombre (Nombre varchar2, Apellidos varchar2),
MEMBER FUNCTION getNombre RETURN varchar2
);


/*Aqui empiezo a perderme*/

CREATE OR REPLACE TYPE BODY Profesor AS

CONSTRUCTOR FUNCTION Profesor (apellidos varchar2, primerapellido varchar2, segundoapellido varchar2) RETURN SELF AS RESULT IS
BEGIN

SELF.apellidos := CONCAT (primerapellido, segundoapellido);

RETURN;
END;

MEMBER PROCEDURE setNombre (Nombre varchar2, Apellidos varchar2) IS
BEGIN
SELF.Nombre := CONCAT (Nombre, Apellidos);
END setNombre;

MEMBER FUNCTION getNombre RETURN varchar2 IS
BEGIN
RETURN SELF.nombre;
END getNombre;

END;
(Ultima edición: 03-05-2013 09:33 por ZID.)
#11
Cita
Oracle no es lo mio, solo lo toque muy por encima cuando hice de becario...

Pero aun asi, si esto lo has copiado al pie de la letra, el error puede ser ese "FUNCTIOIN" en el que sobra una i.

Aparte de eso, si realmente quisiera hacer algo asi en un codigo, yo haria:

CREATE TABLE profesor
with
nombre  varchar,
apellido1  varchar,
apellido 2 as varchar

create view profesor_help from profesor
nombre, apellido1, apellido2, concat(apellido1,apellido2) as apellidos

(a lo mal hecho). Todos esos objetos(aunque entiendo que son un ejercicio) me parecen una sobrecarga brutal. Muy bonico todo pero al final lo importante es el rendimiento...
[align=center]Y mientras, en SobreLoQueOpinar...

[b]Análisis: Metroid Prime 3: Corruption
#12
Cita
Ya, pero es como dices, es un ejercicio y tengo que hacerlo como me piden. No me queda otra  cabezazo


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)