none
Insertar tuplas con sequence RRS feed

  • Pregunta

  • Buenas tengo una duda sobre un ejercicio que debo hacer con insertar tuplas en una tabla con una secuencia que ya he creado antes.

    Enunciado: Usando esta secuencia,inserte una nueva tupla en la tabla "asistentes" con los siguientes valores: id_socio=2,id_partido=1,consumo=20.5 y estado=1. 

    La secuencia es: CREATE SEQUENCE ASISTENTES_SEQ INCREMENT BY 1 START WITH 100 MAXVALUE 102 NOCACHE NOCYCLE;

    Lo de NOCACHE y NOCYCLE no se si es correcto en este caso, pero como no dice nada...

    La tabla posee estos campos:

     ID_ASISTENTE                                                                  NOT NULL VARCHAR2(24)
     ID_SOCIO                                                                               VARCHAR2(24)
     ID_PARTIDO                                                                             VARCHAR2(24)
     CONSUMO                                                                                FLOAT(63)
     ESTADO                                                                        NOT NULL CHAR(1)

    Gracias. Yo supongo que en ID_ASISTENTE que es el unico atributo que no te da pongamos lo de NEXT_VAL.



    • Editado Valenciano96 viernes, 2 de septiembre de 2016 13:32
    viernes, 2 de septiembre de 2016 13:28

Respuestas

  • Cual es tu duda?

    Puedes capturar en una variable el sgte valor de la secuencia y usar la variable en el INSERT o usar NEXT VALUE FOR directamente.

    insert into dbo.tuTabla (id_asistente, id_socio, id_partido, consumo, estado)
    values (next value for dbo.asistentes_seq, 2, 1, 20.5, 1);

    https://msdn.microsoft.com/en-us/library/ff878370.aspx

    En cuanto a a la opcion NO CYCLE, cuando llegues al ultimo valor de la secuencia y trates de insertar entonces reciviras error.

    CREATE SEQUENCE dbo.ASISTENTES_SEQ START WITH 100 INCREMENT BY 1 MAXVALUE 102 NO CYCLE NO CACHE;
    GO
    CREATE TABLE dbo.T (
    ID_ASISTENTE varchar(24) NOT NULL,
    ID_SOCIO varchar(24),
    ID_PARTIDO varchar(24),
    CONSUMO float,
    ESTADO char(1) NOT NULL,
    );
    GO
    INSERT INTO dbo.T (id_asistente, id_socio, id_partido, consumo, estado)
    VALUES (NEXT VALUE FOR dbo.ASISTENTES_SEQ, 2, 1, 20.5, 1);
    GO
    INSERT INTO dbo.T (id_asistente, id_socio, id_partido, consumo, estado)
    VALUES (NEXT VALUE FOR dbo.ASISTENTES_SEQ, 2, 1, 30.5, 1);
    GO
    INSERT INTO dbo.T (id_asistente, id_socio, id_partido, consumo, estado)
    VALUES (NEXT VALUE FOR dbo.ASISTENTES_SEQ, 2, 1, 40.5, 1);
    GO
    INSERT INTO dbo.T (id_asistente, id_socio, id_partido, consumo, estado)
    VALUES (NEXT VALUE FOR dbo.ASISTENTES_SEQ, 2, 1, 50.5, 1);
    GO
    SELECT * FROM dbo.T;
    GO
    DROP TABLE dbo.T;
    GO
    DROP SEQUENCE dbo.ASISTENTES_SEQ;
    GO

    Si usas CYCLE entonces comenzara desde el menor big int nuevamente hasta que llegue a 102 y volvera a dar la vuelta si se llega a el nuevamente.

    CREATE SEQUENCE dbo.ASISTENTES_SEQ START WITH 100 INCREMENT BY 1 MAXVALUE 102 CYCLE NO CACHE;
    GO
    CREATE TABLE dbo.T (
    ID_ASISTENTE varchar(24) NOT NULL,
    ID_SOCIO varchar(24),
    ID_PARTIDO varchar(24),
    CONSUMO float,
    ESTADO char(1) NOT NULL,
    );
    GO
    INSERT INTO dbo.T (id_asistente, id_socio, id_partido, consumo, estado)
    VALUES (NEXT VALUE FOR dbo.ASISTENTES_SEQ, 2, 1, 20.5, 1);
    GO
    INSERT INTO dbo.T (id_asistente, id_socio, id_partido, consumo, estado)
    VALUES (NEXT VALUE FOR dbo.ASISTENTES_SEQ, 2, 1, 30.5, 1);
    GO
    INSERT INTO dbo.T (id_asistente, id_socio, id_partido, consumo, estado)
    VALUES (NEXT VALUE FOR dbo.ASISTENTES_SEQ, 2, 1, 40.5, 1);
    GO
    INSERT INTO dbo.T (id_asistente, id_socio, id_partido, consumo, estado)
    VALUES (NEXT VALUE FOR dbo.ASISTENTES_SEQ, 2, 1, 50.5, 1);
    GO
    INSERT INTO dbo.T (id_asistente, id_socio, id_partido, consumo, estado)
    VALUES (NEXT VALUE FOR dbo.ASISTENTES_SEQ, 2, 1, 60.5, 1);
    GO
    INSERT INTO dbo.T (id_asistente, id_socio, id_partido, consumo, estado)
    VALUES (NEXT VALUE FOR dbo.ASISTENTES_SEQ, 2, 1, 70.5, 1);
    GO
    SELECT * FROM dbo.T;
    GO
    DROP TABLE dbo.T;
    GO
    DROP SEQUENCE dbo.ASISTENTES_SEQ;
    GO
    Por ultimo, tambien puedes usar NEXT VALUE FOR en una restriccion por defecto (DEFAULT CONSTRAINT) en cuyo caso no tienes porque referenciar esa columna en el INSERT.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas



    • Editado HunchbackMVP viernes, 2 de septiembre de 2016 15:04
    • Marcado como respuesta Valenciano96 viernes, 2 de septiembre de 2016 18:46
    viernes, 2 de septiembre de 2016 14:49

Todas las respuestas

  • Hola Valenciano96

    Este este foro no se resuelven problemas (trabajos o tareas) académicos. 

    Saludos,


    Miguel Torres


    viernes, 2 de septiembre de 2016 14:36
  • Cual es tu duda?

    Puedes capturar en una variable el sgte valor de la secuencia y usar la variable en el INSERT o usar NEXT VALUE FOR directamente.

    insert into dbo.tuTabla (id_asistente, id_socio, id_partido, consumo, estado)
    values (next value for dbo.asistentes_seq, 2, 1, 20.5, 1);

    https://msdn.microsoft.com/en-us/library/ff878370.aspx

    En cuanto a a la opcion NO CYCLE, cuando llegues al ultimo valor de la secuencia y trates de insertar entonces reciviras error.

    CREATE SEQUENCE dbo.ASISTENTES_SEQ START WITH 100 INCREMENT BY 1 MAXVALUE 102 NO CYCLE NO CACHE;
    GO
    CREATE TABLE dbo.T (
    ID_ASISTENTE varchar(24) NOT NULL,
    ID_SOCIO varchar(24),
    ID_PARTIDO varchar(24),
    CONSUMO float,
    ESTADO char(1) NOT NULL,
    );
    GO
    INSERT INTO dbo.T (id_asistente, id_socio, id_partido, consumo, estado)
    VALUES (NEXT VALUE FOR dbo.ASISTENTES_SEQ, 2, 1, 20.5, 1);
    GO
    INSERT INTO dbo.T (id_asistente, id_socio, id_partido, consumo, estado)
    VALUES (NEXT VALUE FOR dbo.ASISTENTES_SEQ, 2, 1, 30.5, 1);
    GO
    INSERT INTO dbo.T (id_asistente, id_socio, id_partido, consumo, estado)
    VALUES (NEXT VALUE FOR dbo.ASISTENTES_SEQ, 2, 1, 40.5, 1);
    GO
    INSERT INTO dbo.T (id_asistente, id_socio, id_partido, consumo, estado)
    VALUES (NEXT VALUE FOR dbo.ASISTENTES_SEQ, 2, 1, 50.5, 1);
    GO
    SELECT * FROM dbo.T;
    GO
    DROP TABLE dbo.T;
    GO
    DROP SEQUENCE dbo.ASISTENTES_SEQ;
    GO

    Si usas CYCLE entonces comenzara desde el menor big int nuevamente hasta que llegue a 102 y volvera a dar la vuelta si se llega a el nuevamente.

    CREATE SEQUENCE dbo.ASISTENTES_SEQ START WITH 100 INCREMENT BY 1 MAXVALUE 102 CYCLE NO CACHE;
    GO
    CREATE TABLE dbo.T (
    ID_ASISTENTE varchar(24) NOT NULL,
    ID_SOCIO varchar(24),
    ID_PARTIDO varchar(24),
    CONSUMO float,
    ESTADO char(1) NOT NULL,
    );
    GO
    INSERT INTO dbo.T (id_asistente, id_socio, id_partido, consumo, estado)
    VALUES (NEXT VALUE FOR dbo.ASISTENTES_SEQ, 2, 1, 20.5, 1);
    GO
    INSERT INTO dbo.T (id_asistente, id_socio, id_partido, consumo, estado)
    VALUES (NEXT VALUE FOR dbo.ASISTENTES_SEQ, 2, 1, 30.5, 1);
    GO
    INSERT INTO dbo.T (id_asistente, id_socio, id_partido, consumo, estado)
    VALUES (NEXT VALUE FOR dbo.ASISTENTES_SEQ, 2, 1, 40.5, 1);
    GO
    INSERT INTO dbo.T (id_asistente, id_socio, id_partido, consumo, estado)
    VALUES (NEXT VALUE FOR dbo.ASISTENTES_SEQ, 2, 1, 50.5, 1);
    GO
    INSERT INTO dbo.T (id_asistente, id_socio, id_partido, consumo, estado)
    VALUES (NEXT VALUE FOR dbo.ASISTENTES_SEQ, 2, 1, 60.5, 1);
    GO
    INSERT INTO dbo.T (id_asistente, id_socio, id_partido, consumo, estado)
    VALUES (NEXT VALUE FOR dbo.ASISTENTES_SEQ, 2, 1, 70.5, 1);
    GO
    SELECT * FROM dbo.T;
    GO
    DROP TABLE dbo.T;
    GO
    DROP SEQUENCE dbo.ASISTENTES_SEQ;
    GO
    Por ultimo, tambien puedes usar NEXT VALUE FOR en una restriccion por defecto (DEFAULT CONSTRAINT) en cuyo caso no tienes porque referenciar esa columna en el INSERT.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas



    • Editado HunchbackMVP viernes, 2 de septiembre de 2016 15:04
    • Marcado como respuesta Valenciano96 viernes, 2 de septiembre de 2016 18:46
    viernes, 2 de septiembre de 2016 14:49
  • Gracias, así es. 
    viernes, 2 de septiembre de 2016 18:46