Problema esquisito no Oracle

Olá…

Pessoal…Estou usando um banco Oracle 10g xe. Hoje ocorreu uma coisa muito esquisita.

Por razões que ignoro, alguém que participa do meu projeto renomeou uma das tabelas do banco de dados para ’ (uma aspa simples). Esta operação foi feita através do Navicat. O Oracle aceitou o novo nome para a tabela. Quando me dei conta do ocorrido, tentei voltar ao nome anterior, mas o Oracle acusa o seguinte erro:

[b]
A operação em não foi bem-sucedida pelo seguinte motivo:

ORA-01741: identificador de tamanho zero inválido
[/b]

Bom…Então copiei a tabela e refiz os relacionamentos das tabelas que tinham chaves estrangeiras para ela (apontando esta cópia). Eu queria remover a tal tabela. Quando tentei remover, acusou o seguinte erro:

[b]
A operação de eliminação não foi bem-sucedida pelo seguinte motivo:

ORA-01756: string entre aspas não finalizada adequadamente
[/b]

Quer dizer, deve estar dando algum problema interno quando o Oracle roda o SQL de remoção da tabela, devido ao nome bizarro que ela tem. Alguém tem alguma ideia de como posso, pelo menos, remover a tal tabela? Alguém sabe se tem como desfazer alterações no esquema?

PS: Além de ficar espantado com o fato de alguém ter renomeado a tal tabela com esse nome (espero que tenha sido um acidente), espanta-me também o fato do Oracle aceitar um identificador de tabela que ele é incapaz de manipular internamente em seus SQL’s.

Agradeço desde já…

Qual o comando usado para dropar a tabela?

Eu estou fazendo isso através da interface web que o oracle me oferece para administrar o banco.

Puxa, provavelmente alguém vai ter de dropar essa tabela via SQL*Plus mesmo.

Será que dá? Se o Oracle diz que não consegue rodar o próprio SQL que ele gera para dropar…

Bom, vou tentar…

Talvez a aplicação Web esteja montando uma string SQL “no braço”. Se for isso que está acontecendo, ele deveria duplicar as aspas, quando elas aparecem em uma string (ou seja, quando aparece uma aspa simples, é necessário digitar duas vezes a aspa simples para que seja entendida apenas uma em SQL) Se não estiver fazendo isso, vai dar um erro de “string não terminada” mesmo.

Oi,

Teoricamente a exceção “ORA-01741: identificador de tamanho zero inválido” significa que a coluna não foi passada (se for chutar que a palavra identificador = coluna).

E a outra exceção está muito clara…

Tchauzin!

Lina, basicamente é o seguinte. Esse é um caso particular que acho que o pessoal que fez a aplicação Web que serve para gerenciar o Oracle nunca testou (ou seja, pôr aspas ou outras porcarias em um nome de tabela).
Acho que eles usam concatenação de strings para montar o comando SQL (já que nomes de tabelas, conforme você deve saber, não podem ser passadas no equivalente aos PreparedStatements do Oracle. )
Só que quando há uma aspa em um nome de tabela, acho que é necessário duplicar essa aspa, e nesse caso a aplicação Web não deve ter sido testada para levar em conta esse caso especial.

O mais engraçado é que, há milhões de anos (quando eu ainda mexia muito casualmente com Oracle) não dava para ter tabelas com nomes esdrúxulos. Acho que só dava para usar letras, números e hífens ou “underscores” - não sei direito porque nesse tempo em que os dinossauros ainda nem existiam nunca vi uma tabela em que se usasse algo diferente de letras e números.

Acho que havia (e talvez ainda haja) uma limitação no tamanho de identificadores, acho que são 32 letras, dígitos e não sei que outros caracteres.
Não sei como está hoje.

[quote=entanglement]O mais engraçado é que, há milhões de anos (quando eu ainda mexia muito casualmente com Oracle) não dava para ter tabelas com nomes esdrúxulos. Acho que só dava para usar letras, números e hífens ou “underscores” - não sei direito porque nesse tempo em que os dinossauros ainda nem existiam nunca vi uma tabela em que se usasse algo diferente de letras e números.

Acho que havia (e talvez ainda haja) uma limitação no tamanho de identificadores, acho que são 32 letras, dígitos e não sei que outros caracteres.
Não sei como está hoje.

[/quote]

Oi,

hahahaha bem nessa!
O oracle aceita coisas estranhas na criação de suas tabela… Como por exemplo: $

Em relação ao tamanho dos identificadores, acredito que nos tempos modernos são 30.

Tchauzin!

Pois é entanglement…Acho que tem sentido a tua hipótese…Vou tentar testar a remoção braçal.

O Oracle tem regras para identificadores, mas muitas delas podem ser ignoradas se colocar o nome do identificador entre aspas duplas (")
(O limite de 32 caracteres deve ser o tamanho da coluna na tabela interna, não dá pra mudar)

O problema é que toda hora que quiser referenciar esse objeto com nome estranho, terá de usar aspas duplas:

SELECT * FROM "'";

No seu caso para apagar a tabela, basta usar:

DROP TABLE "'"

Acho que na interface WEB tem uma espécie de console que você executa comandos diretamente.

Mas realmente, sempre fica a dúvida, para que permitir este tipo de coisa…

Pessoal…Más notícias:

Tentei executar o SQL de drop da tabela através da interface web de administração do banco e deu esse erro:

ORA-01756: string entre aspas não finalizada adequadamente

Se faço através do SQL Plus, via comando, dá os sequintes erros:

ERRO na linha 1:
ORA-00604: Ocorreu um erro no nível 1 SQL recursivo
ORA-01756: String entre aspas não finalizada adequadamente

Será que vou ter que refazer o banco por causa de uma bobagem dessas?

Você usou o comando que passei?

Sim…Usando exatamente este comando. Até por que não sei se existe qualquer alternativa para dar drop em tabelas. Existe?

Você deve ter digitado algo diferente.

Fiz este teste em mais de um cliente de Oracle (inclusive o sql plus) e funcionou.

Cara…Eu copiei e colei o seu comando na interface web de execução de SQL. Resultado:

ORA-01756: string entre aspas não finalizada adequadamente

O mais engraçado é que se faço um select, ele não reclama de nada:

select * from “’”

Funciona.