SQL em Oracle > DML > INSERT
INSERT tl_logo2.jpg

O comando INSERT é utilizado para inserir linhas numa tabela e como todos os outros comandos do conjunto DML faz sempre parte de uma transacção. Neste módulo vamos ver:


INSERT

O comando INSERT permmite inserir uma única linha na tabela.

Os comandos da lista abaixo criam um conjunto de tabelas que vamos usar como exemplo. A descrição destes comandos encontra-se aqui.

drop table CONTRATADO cascade constraints;

drop table JOGO cascade constraints;

drop table JOGADOR cascade constraints;

drop table EQUIPA cascade constraints;

create table EQUIPA  (
   ID_EQUIPA   NUMBER(10,0)                             not null,
   NOME        VARCHAR2(100) constraint nn_equipa_nome  not null,
   constraint PK_EQUIPA primary key (ID_EQUIPA)
);

create table JOGADOR  (
   ID_JOGADOR           NUMBER(10,0)                    not null,
   NOME                 varchar2(100)                   not null,
   POSICAO              varchar2(100)                   not null,
   BI                   VARCHAR(100),
   constraint PK_JOGADOR primary key (ID_JOGADOR),
   constraint UK_JOGADOR unique (BI)
);

create table JOGO  (
   EQUIPA_CASA          NUMBER(10,0)                    not null,
   EQUIPA_VISITANTE     NUMBER(10,0)                    not null,
   DATA                 DATE                            not null,
   LOCAL                VARCHAR2(100)                  default 'Estádio Alvalade XXI' not null,
   RISCO_SEGURANCA      VARCHAR(100)                    not null,
   constraint PK_JOGO primary key (EQUIPA_CASA, EQUIPA_VISITANTE, DATA),
   constraint FK_JOGO_REF_EQUIPA_CASA foreign key (EQUIPA_CASA)
         references EQUIPA (ID_EQUIPA),
   constraint FK_JOGO_REF_EQUIPA_VISITANTE foreign key (EQUIPA_VISITANTE)
         references EQUIPA (ID_EQUIPA),
   constraint CK_JOGO_01 check (risco_seguranca in ('Alto','Medio','Baixo') and equipa_casa != equipa_visitante)
);

create table CONTRATADO  (
   ID_JOGADOR           NUMBER(10,0)                    not null,
   ID_EQUIPA            NUMBER(10,0)                    not null,
   DATA_INICIO          DATE                            not null,
   DATA_FIM             DATE                            not null,
   constraint PK_CONTRATADO primary key (ID_JOGADOR, ID_EQUIPA, DATA_INICIO),
   constraint FK_CONTRATA_REFERENCE_JOGADOR foreign key (ID_JOGADOR)
         references JOGADOR (ID_JOGADOR),
   constraint FK_CONTRATA_REFERENCE_EQUIPA foreign key (ID_EQUIPA)
         references EQUIPA (ID_EQUIPA),
   constraint CKT_CONTRATADO check (data_inicio < data_fim)
);
Error starting at line 1 in command:
drop table CONTRATADO cascade constraints
Error report:
SQL Error: ORA-00942: table or view does not exist

Error starting at line 3 in command:
drop table JOGO cascade constraints
Error report:
SQL Error: ORA-00942: table or view does not exist

Error starting at line 5 in command:
drop table JOGADOR cascade constraints
Error report:
SQL Error: ORA-00942: table or view does not exist

Error starting at line 7 in command:
drop table EQUIPA cascade constraints
Error report:
SQL Error: ORA-00942: table or view does not exist

create table succeeded.

create table succeeded.

create table succeeded.

create table succeeded.

note04.gif

As tabelas e respectivo relacionamento pode ser descrito pelo diagrama abaixo:

EquipaJogadorJogos.jpg

Os comandos da lista abaixo inserem linhas nas tabelas:

insert into equipa (id_equipa, nome) values (1,'Sport Lisboa e Benfica');
insert into equipa (id_equipa, nome) values (2,'Futebol Clube do Porto');
insert into equipa (id_equipa, nome) values (3,'Sporting Clube de Portugal');


insert into jogador (id_jogador,nome,posicao,bi) values (1,'Simão Sabrosa','Médio atacante','123456789');
insert into jogador (id_jogador,nome,posicao,bi) values (2,'Moreira','Guarda redes', null);
insert into jogador (id_jogador,nome,posicao) values (3,'Costinha','Médio');
insert into jogador (id_jogador,nome,posicao) values (4,'Victor Baia','Guarda redes');
insert into jogador (id_jogador,nome,posicao) values (5,'Ricardo','Guarda redes');
insert into jogador (id_jogador,nome,posicao) values (6,'Levezinho','Guarda redes');


insert into contratado (id_jogador,id_equipa,data_inicio,data_fim) values (1,1,to_date('20030101','yyyymmdd'),to_date('20090101','yyyymmdd'));
insert into contratado (id_jogador,id_equipa,data_inicio,data_fim) values (2,1,to_date('20030101','yyyymmdd'),to_date('20090101','yyyymmdd'));
insert into contratado (id_jogador,id_equipa,data_inicio,data_fim) values (3,2,to_date('20030101','yyyymmdd'),to_date('20090101','yyyymmdd'));
insert into contratado (id_jogador,id_equipa,data_inicio,data_fim) values (4,2,to_date('20030101','yyyymmdd'),to_date('20090101','yyyymmdd'));
insert into contratado (id_jogador,id_equipa,data_inicio,data_fim) values (5,3,to_date('20030101','yyyymmdd'),to_date('20090101','yyyymmdd'));
insert into contratado (id_jogador,id_equipa,data_inicio,data_fim) values (6,3,to_date('20030101','yyyymmdd'),to_date('20090101','yyyymmdd'));
--Simão Sabrosa foi contratado pelo Sporting antes de ser contratado pelo Benfica
insert into contratado (id_jogador,id_equipa,data_inicio,data_fim) values (1,3,to_date('20000101','yyyymmdd'),to_date('20021201','yyyymmdd'));


insert into jogo (equipa_casa,equipa_visitante,data,local,risco_seguranca) values (3,1,to_date('20051123','yyyymmdd'),'Estadio Alvalade XXI','Alto');
insert into jogo (equipa_casa,equipa_visitante,data,local,risco_seguranca) values (1,3,to_date('20060420','yyyymmdd'),'Estadio da Luz','Alto');
1 rows inserted

1 rows inserted

1 rows inserted

1 rows inserted

1 rows inserted

1 rows inserted

1 rows inserted

1 rows inserted

1 rows inserted

1 rows inserted

1 rows inserted

1 rows inserted

1 rows inserted

1 rows inserted

1 rows inserted

1 rows inserted

1 rows inserted

1 rows inserted

note04.gif

A sintaxe do comando INSERT permite a omissão da lista de colunas. Neste caso a base de dados assume que a lista de valores inclui dados para todas as colunas que constituem a tabela na sequência em que elas foram criadas. Esta sequência pode ser obtida usando o comando DESCRIBE (DESC) do SQL*Plus ou fazendo SELECT * .

O exemplo abaixo insere duas linhas na tabela JOGO usando comandos INSERT onde não são indicadas as colunas.

insert into jogo values (2,3,to_date('20051020','yyyymmdd'),'Estadio do Dragão','Alto');
insert into jogo values (3,2,to_date('20060320','yyyymmdd'),'Estadio Alvalade XXI','Alto');
1 rows inserted

1 rows inserted

note04.gif

A utilização desta última sintaxe é desaconselhada, principalmente quando o código SQL está dentro de uma aplicação (Java, C, COBOL, etc) pelas seguintes razões:

bthome.gifTopo


INSERT SELECT

O comando INSERT pode receber a cláusula SELECT o que permite inserir numa única operação todas as linhas resultantes da execução de um comando SELECT. Este comando pode ser simples ou complexo, o que significa que as linhas inseridas podem ser uma cópia directa de outra tabela ou podem ser o resultado de um query complexo com subconsultas e junções. Este comando tem níveis de desempenho muito bons.

O exemplo abaixo será analisado no módulo de criação de tabelas. Ele permite criar uma tabela a partir do resultado de um comando SELECT. As restrições existentes nas tabelas originais não são recriadas na nova tabela:

drop table EMP_SALS;

create table EMP_SALS (emp_name, salary, grade) as (
  select e.ename, e.sal, s.grade
  from emp e, salgrade s
  where e.sal between s.losal and s.hisal
);
Error starting at line 1 in command:
drop table EMP_SALS
Error report:
SQL Error: ORA-00942: table or view does not exist


create table succeeded.

note04.gif

O exemplo abaixo usa um comando INSERT SELECT para duplicar as linhas da tabela criada no ponto anterior:

insert into EMP_SALS select * from EMP_SALS;
14 rows inserted

bthome.gifTopo


Realizado por Turtle Learning ®. Última alteração em 2011-02-26