- Este tópico contém 7 respostas, 3 vozes e foi atualizado pela última vez 6 anos, 8 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
31 de janeiro de 2018 às 11:09 pm #109171Leopoldo de SousaParticipante
Caros(as),
Boa tarde.Estou quebrando a cabeça há 3 dias, estou precisando de uma query que me retorne determinada “Palavra” em qualquer tabela de um usuário específico.
Sei que a tabela all_source possui o campo TEXT, porém nessa tabela só consigo consultar tal palavra em objetos tais como: PROCEDURE, PACKAGE, PACKAGE BODY, LIBRARY,TYPE BODY
TRIGGER, FUNCTION, JAVA SOURCE e TYPE.Já nas tabelas all_tab_columns ou user_tab_columns, não existe o campo “TEXT”.
Existe alguma forma de encontrar tal informação?
Grato.
1 de fevereiro de 2018 às 1:16 am #109172José Laurindo ChiappaModeradorBlz ? Então, explica um pouco melhor : quando vc diz ‘encontrar determinada “Palavra” em qualquer tabela”, essa palavra/essa string vai estar contida no nome da tabela ? No nome de alguma coluna de alguma tabela ? Ou não, vc quer Efetivamente buscar nos dados contidos / gravados dentro de uma tabela, só que vc não sabe nem qual é a tabela E NEM qual é a coluna ??
Se for esse último caso, vc tem um pequeno problema aí : POR DEFINIÇÃO NO PADRÃO SQL (pode consultar os manuais e os livros de referência), para poder retornar/pesquisar um dado via comandos SQL padrão vc ** TEM ** que saber em qual tabela o dado está E dentro de qual coluna, simples assim…. SE teu ambiente é tão ‘bagunçado’ que vc não faz nem idéia do modelo de dados, de onde cada dado é gravado, vc ACABOU DE QUEBRAR a exigência da linguagem SQL : nesse caso vc vai ter que escrever uma rotina SUA, própria, que dinamicamente monte e execute uma query em CADA UMA DAS TABELAS e CADA UMA DAS COLUNAS, simplesmente NÃO TEM COMO fazer uma busca na linguagem SQL se vc não tem os pré-requisitos… E NEM PRECISO DIZER, essa rotina VAI ser Trabalhosa de escrever : https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:37336026927381#42426083757635 é um exemplo genérico mas que vc pode aproveitar…
A lógica aqui é ler o nome de CADA tabela de um usuário e para cada tabela que monta queries dinâmicas.. Digamos que eu tenha uma tabela T1 com dez colunas, uma T2 com 5 colunas e assim por diante teria que montar e enviar queries tipo :SELECT * FROM T1 WHERE coluna1=’stringaprocurar’ OR coluna2=’stringaprocurar’ OR coluna3=’stringaprocurar’…..OR coluna10=’stringaprocurar’;
SELECT * FROM T2 WHERE coluna1=’stringaprocurar’ OR coluna2=’stringaprocurar’ OR coluna3=’stringaprocurar’…..OR coluna5=’stringaprocurar’;Com certeza, VAI pagar um tributo em Performance (óbvio que o Otimizador de SQL pouco pode fazer para SQLs que artificialmente acessam todas as colunas e não só as colunas-chave) MAS também vai ter um Grande esforço aí, devido à maior complexidade natural do SQL dinâmico… Um trabalhinho de louco mando e meio inútil imho mas se é o que vc quer/precisa, é o que vc vai ter que escrever…
[]s
Chiappa
1 de fevereiro de 2018 às 3:13 pm #109173Leopoldo de SousaParticipanteBom dia Chiappa,
Terceira opção: “Ou não, vc quer Efetivamente buscar nos dados contidos / gravados dentro de uma tabela, só que vc não sabe nem qual é a tabela E NEM qual é a coluna ??”
Na verdade não é o meu ambiente, a base de dados é de um fornecedor, porém ou eles realmente não sabem em qual tabela a informação está ou simplesmente não querem compartilhar a informação, como possuo uma cópia da base atualizada, decidir localizar tal tabela.
Para clientes do tipo BM&F, temos o nome da tabela e corretora, porém para clientes do tipo BOVESPA não sabemos o nome da tabela e coluna. Então decidir procurar por “dados contidos” obrigatoriamente dentro dessa coluna. Ex.: “Nome de Corretoras”.
Com certeza não usaram um padrão para nome de tabelas e colunas, pois já tentei localizar dessa forma.
De quaquer forma agradeço pela atenção, vou estudar o exemplo que me passou e aplicar na base.
Abraços
1 de fevereiro de 2018 às 4:24 pm #109174José Laurindo ChiappaModeradorBom dia, blz ? Então, mais que um padrão para nomes de tabelas e colunas, o que esse teu Fornecedor tinha que te disponibilizar é um MODELO DE DADOS, ie, uma representação de qual dado é armazenado onde, qual dado se relaciona com qual….
Sem saber em qual das trocentas colunas das n+1! tabelas o dado que vc quer está gravado, é Simplesmente Impossível vc fazer essa busca num só SQL simples, como eu disse : toca aí então a vc escrever uma rotina (em PL/SQL provavelmente) que vai tentar consultar CADA coluna (cada coluna que possa conter STRINGS, óbvio : não tem como vc ter ‘palavras’ em colunas DATE ou NUMBER óbvio) de CADA tabela, não tem outra solução… E como eu disse, isso NÂO vai ser simples, vai dar um trabalhinho, mas se é o que vc precisa, vc VAi ter que investir o tempo/esforço necessário…
[]s
Chiappa
14 de março de 2018 às 1:02 am #109237MottaParticipante14 de março de 2018 às 6:25 pm #109238José Laurindo ChiappaModeradorYep, parece ser exatamente a lógica que recomendei : cursor na nnn_TAB_COLUMNS recuperando as colunas com datatype string (no exemplo simples linkado o Autor só se preocupou com CHAR e VARCHAR2, se necessário teria que incluir NCHAR, NVARCHAR, CLOB e LONGs) , montar um SQL dinâmico para cada coluna encontrada e o executar, sim… Como eu disse, é algo com alguma complexidade para se escrever, E que pode ter implicações sérias em performance, mas não há outra Solução…
[]s
Chiappa
14 de março de 2018 às 7:58 pm #109239MottaParticipanteEste meu bloco poderia ser otimizado mas a performance sempre vai ser ruim , tipo da coisa para só usar em último caso.
14 de março de 2018 às 8:19 pm #109240José Laurindo ChiappaModeradorExato : sempre vai ser performance RUIM e VAI ser algo um pouco Complexo de se escrever e entender, sim, inescapável…
[]s
Chiappa
-
AutorPosts
- Você deve fazer login para responder a este tópico.