GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Sqldeveloper, Oracle Erro?

programação
oracle
banco
Tags: #<Tag:0x00007f39a38e9200> #<Tag:0x00007f39a38e9098> #<Tag:0x00007f39a38e8f58>

#1

Estou querendo criar uma table e seus relacionamentos mas aparece um erro:

“%s: invalid identifier”

Meu código

CREATE TABLE Classe (
Cd_Classe Number(8) NOT NULL,
Nr_AnoLetivo Number(4)  NOT NULL,
constraint Classe_Nr_AnoLetivo_ck check(Nr_AnoLetivo > 2000),
  Nr_Serie Number(2) NOT NULL,
  Sg_Turma VARCHAR2(2) not NULL,
  Cd_Escola Number(6) not NULL,
  Cd_Grau Number(2) not NULL,
  Cd_Periodo Number(2) not NULL,
  CodSexo CHAR(1) not NULL CHECK (codsexo in ('m', 'f')),
  constraint PK_Classe PRIMARY KEY(Cd_Classe),
  constraint FK_Classe FOREIGN KEY(Cd_Escola) REFERENCES Escola(Cd_Escola),/* 3 O relacionamento se faz na FK, chave estrangeira aponta  */
  /*para primary key de outra tabela*/
  constraint FK_Classe FOREIGN KEY(Cd_Grau) REFERENCES Grau(Cd_Grau),
  constraint FK_Classe FOREIGN KEY(Cd_Periodo) REFERENCES Grau(Cd_Periodo)

);

Erro:

Relatório de erros -
`ORA-00904: “CD_PERIODO”: identificador inválido

  1. 00000 - “%s: invalid identifier”
    *Cause:
    *Action:`

#2

Creio que o problema esteja aqui.
Tem mesmo certeza que a tabela a ser referenciada na FK é Grau e não Periodo?


#3

Coloquei a tabela período mas aparece um erro:

Relatório de erros -
ORA-00942: a tabela ou view não existe
00942. 00000 - “table or view does not exist”
*Cause:
*Action:


#4

Sendo que criei as tabelas:

CREATE TABLE Escola (
  Cd_Escola Number(6) NOT NULL,
  Nm_Escola varchar(50) NOT NULL,
  Ds_Endereco VARCHAR2(50) NOT NULL,
  Ds_Bairro VARCHAR(40) NOT NULL,
  constraint PK_Escola PRIMARY KEY(Cd_Escola)

);

CREATE TABLE Grau (
  Cd_Grau Number(2)  NOT NULL,
  Nm_Grau varchar(50) NOT NULL,
  constraint PK_Grau PRIMARY KEY(Cd_Grau)
  
);

CREATE TABLE Periodo (
  Cd_Periodo Number(2)  NOT NULL,
  Nm_Periodo varchar2(50) NOT NULL,
  constraint PK_Periodo PRIMARY KEY(Cd_Periodo)
 
);

#5

Agora eu te pergunto: existe uma tabela com o nome periodo? Ela já está criada?
Quando você vai trabalhar com banco de dados relacional, como o caso do oracle, precisa ter em mente que ele funciona de maneira estruturada, mais ou menos comos nós lemos (embora a gente consiga burlar algumas coisas, sempre tendemos a ler da esquerda para a direita e de cima para baixo). Logo, se você tem, em teu script, algo assim:

create table tabelaA(
    xis integer,
    constraint fk_xis(xis) references tabelaB(xis)
);

create table tabelaB(
    xis integer
);

há grandes chances de ter um erro parecido com o que recebeu.


#6

Sim,

CREATE TABLE Periodo (
  Cd_Periodo Number(2)  NOT NULL,
  Nm_Periodo varchar2(50) NOT NULL,
  constraint PK_Periodo PRIMARY KEY(Cd_Periodo)
 
);

#7

Coloca o código.
Este erro, table or view does not exists, é bem específico e só ocorre em 2 situações:

  • O que foi escrito está errado, não confere com o nome da tabela, daí não vai achar a tabela mesmo
  • O que foi escrito está certo, confere com o nome que a tabela deveria ter, mas a tabela não existe.
    Em qualquer um dos dois casos, será preciso verificar como proceder.

#8

Tabela classe:

CREATE TABLE Classe (
  Cd_Classe Number(8) NOT NULL,
Nr_AnoLetivo Number(4)  NOT NULL,
constraint Classe_Nr_AnoLetivo_ck check(Nr_AnoLetivo > 2000),
  Nr_Serie Number(2) NOT NULL,
  Sg_Turma VARCHAR2(2) not NULL,
  Cd_Escola Number(6) not NULL,
  Cd_Grau Number(2) not NULL,
  Cd_Periodo Number(2) not NULL,
  CodSexo CHAR(1) not NULL CHECK (codsexo in ('m', 'f')),
  constraint PK_Classe PRIMARY KEY(Cd_Classe),
  constraint FK_Classe FOREIGN KEY(Cd_Escola) REFERENCES Escola(Cd_Escola),/* 3 O relacionamento se faz na FK, chave estrangeira aponta  */
  /*para primary key de outra tabela*/
  constraint FK_Classe FOREIGN KEY(Cd_Grau) REFERENCES Grau(Cd_Grau),
  constraint FK_Classe FOREIGN KEY(Cd_Periodo) REFERENCES Peridodo(Cd_Periodo)

);

CREATE TABLE Escola (
  Cd_Escola Number(6) NOT NULL,
  Nm_Escola varchar(50) NOT NULL,
  Ds_Endereco VARCHAR2(50) NOT NULL,
  Ds_Bairro VARCHAR(40) NOT NULL,
  constraint PK_Escola PRIMARY KEY(Cd_Escola)

);

CREATE TABLE Grau (
  Cd_Grau Number(2)  NOT NULL,
  Nm_Grau varchar(50) NOT NULL,
  constraint PK_Grau PRIMARY KEY(Cd_Grau)
  
);

CREATE TABLE Periodo (
  Cd_Periodo Number(2)  NOT NULL,
  Nm_Periodo varchar2(50) NOT NULL,
  constraint PK_Periodo PRIMARY KEY(Cd_Periodo)
 
);

#9

Viu o que eu disse acima?
Você está declarando as tabelas que contém as colunas que vai utilizar na tabela Classe depois da tabela classe. Acabará tendo esse erro realmente.
Sugiro colocar a tabela classe por último, no script.


#10

então cara mas eu já criei as tabelas abaixo da classe


#11

e depois de criadas eu estou fazendo o relacionamento


#12

Tanto é que se eu executar o create de novo nas tabelas abaixo da tabela classe elas vão apresentar o seguinte erro:

identar texto Relatório de erros -
ORA-00955: nome já está sendo usado por um objeto existente
00955. 00000 - “name is already used by an existing object”
*Cause:
*Action:

Pois já está criada


#13

Já achei o erro. Você escreveu o nome da tabela errado


#14

Então mudei o nome da tabela mas apareceu outro erro:

Relatório de erros -
ORA-02264: nome já usado por uma restrição existente
02264. 00000 -  "name already used by an existing constraint"
*Cause:    The specified constraint name has to be unique.
*Action:   Specify a unique constraint name for the constraint.

#15

Maldito CTRL+C / CTRL+V!
Você copiou e colou a linha referente as FKs e não alterou quase nada nelas.
Resultado, teve problemas com a coluna referindo a uma tabela errada, teve problemas com o nome da tabela e está tendo problemas com o nome da constraint.


#16

como assim não alterei quase nada


#17
constraint FK_Classe FOREIGN KEY(Cd_Escola) REFERENCES Escola(Cd_Escola),
constraint FK_Classe FOREIGN KEY(Cd_Grau) REFERENCES Grau(Cd_Grau),
constraint FK_Classe FOREIGN KEY(Cd_Periodo) REFERENCES Grau(Cd_Periodo)
  • O mesmo nome para a constraint
  • A mesma tabela para duas constraints distintas

São dois pontos em três linhas de código quase iguais e que impediram que você conseguisse criar tuas tabelas sem erros.
Isso pode acontecer com qualquer pessoa. É preciso ter mais atenção, só isso.

E, por falar nisso, eu gosto da abordagem abaixo

constraint FK_Escola_Classe FOREIGN KEY(FK_Cd_Escola) REFERENCES Escola(Cd_Escola),
constraint FK_Grau_Classe FOREIGN KEY(FK_Cd_Grau) REFERENCES Grau(Cd_Grau),
constraint FK_Periodo_Classe FOREIGN KEY(FK_Cd_Periodo) REFERENCES Periodo(Cd_Periodo)

Assim tenho certeza de estar relacionando as tabelas corretas.