Este é o meu procedimento original que funciona lindamente:
create or replace PROCEDURE EXTRACT_0_CPP AS
CURSOR c_data IS
SELECT cpp,
rfu1,
rfu2,
mean_rfu,
charge_ph7_4,
hydropathy
FROM cpp
ORDER BY LENGTH(cpp);
F1 UTL_FILE.FILE_TYPE;
BEGIN
F1 := UTL_FILE.FOPEN( location => 'EXTRACT_DIR',
filename => '0_cpp.TXT',
open_mode => 'w',
max_linesize => 32767);
FOR cur_rec IN c_data LOOP
UTL_FILE.PUT_LINE (F1,
cur_rec.cpp || ':' ||
cur_rec.rfu1 || ':' ||
cur_rec.rfu2 || ':' ||
cur_rec.mean_rfu || ':' ||
cur_rec.charge_ph7_4 || ':' ||
cur_rec.hydropathy);
END LOOP;
UTL_FILE.FCLOSE(F1);
END;
Mas o SQL Developer me dá uma linha vermelha SELECT
e sugere que eu mude para isso:
create or replace PROCEDURE EXTRACT_0_CPP AS
CURSOR c_data IS
SELECT
"A1"."CPP" "CPP",
"A1"."RFU1" "RFU1",
"A1"."RFU2" "RFU2",
"A1"."MEAN_RFU" "MEAN_RFU",
"A1"."CHARGE_PH7_4" "CHARGE_PH7_4",
"A1"."HYDROPATHY" "HYDROPATHY"
FROM
"C##ELLIE"."CPP" "A1"
ORDER BY
length("A1"."CPP");
F1 UTL_FILE.FILE_TYPE;
BEGIN
F1 := UTL_FILE.FOPEN( location => 'EXTRACT_DIR',
filename => '0_cpp.TXT',
open_mode => 'w',
max_linesize => 32767);
FOR cur_rec IN c_data LOOP
UTL_FILE.PUT_LINE (F1,
cur_rec.pk_cpp || ':' ||
cur_rec.rfu1 || ':' ||
cur_rec.rfu2 || ':' ||
cur_rec.mean_rfu || ':' ||
cur_rec.charge_ph7_4 || ':' ||
cur_rec.hydropathy);
END LOOP;
UTL_FILE.FCLOSE(F1);
END;
Minha pergunta é (por que) isso é melhor? O que é "A1"?
Sobre o motivo de sugerir um formato diferente quando o código já funciona, é claro que é possível ter um código mal formatado que funcione, então, em princípio, não há razão para você não considerar melhorias de layout ou refatoração que possam tornar o código mais robusto, eficiente ou mais fácil de manter.
No entanto, nomes com aspas duplas são uma prática ruim porque ocultam erros de nomenclatura e forçam você a especificar maiúsculas/minúsculas, e o resultado é menos legível que o original. Eles são realmente um recurso de portabilidade para uso com aplicativos de terceiros que possuem nomes de tabelas estranhos . Os geradores de código tendem a colocar aspas duplas em tudo porque é mais fácil fazer isso do que detectar se eles são realmente necessários em cada caso. Não há nenhuma maneira que
é algum tipo de melhoria
exceto talvez pelo uso de um alias de tabela. É uma boa ideia dar um alias à tabela (sem aspas!) e usá-lo ao se referir a colunas. Mas
"A1"
(ou mesmoa1
) é o tipo de alias de tabela que apenas um computador imaginaria. Seria muito melhor usar um alias que fosse algum tipo de abreviação do nome da tabela, talvez neste casoc
. Imagine se você estivesse juntando seis mesas - agora qual éa3
? Ah certo, issoORDER_DETAILS
. (Embora, neste caso, o nome da tabela seja tão curto que não faça sentido usá-lo como alias.) Então,seria muito melhor como apenas
(Eu também colocaria em letras minúsculas porque não é 1974 e meu editor destaca palavras-chave de idioma usando cores e negrito, mas vamos deixar isso para lá.)
Codificar nomes de esquema é uma prática ruim porque é na melhor das hipóteses redundante (o objeto está no esquema em que você já está trabalhando, então não adiciona nada, exceto complicações desnecessárias) ou pior, limita a portabilidade (se você renomear o esquema ou mover o código que você ' vou ter que passar por isso limpando as referências codificadas).
Tenho certeza de que este é um recurso inteligente que significa bem, mas neste caso não é um bom conselho.
A1
é o alias para a tabela"C##ELLIE"."CPP"
o procedimento é o mesmo, mas assim você e a oracle sabem a qual esquema a tabela cpp pertence também.
Adicional você também deve adicionar um comentário o que o procedimento faz, se você voltar em 3 anos é mais simples saber, qual esquema você usou e para que serve
Aqui está uma demonstração do que há de errado em usar aspas duplas em nomes de objetos. Leia cada comando com atenção e preste atenção à distinção entre maiúsculas e minúsculas dos nomes das tabelas, entre aspas e sem aspas.
Eu provavelmente faria uma recomendação disso para o seu código:
Estamos usando apenas uma tabela/exibição,
cpp
portanto, o alias não é estritamente necessário, mas seria útil se, no futuro, outra tabela fosse adicionada a essa consulta.Particularmente com mais de 2 consultas de tabela, se os nomes no SELECT não forem totalmente qualificados (mencionar um nome de tabela ou alias antes do nome da coluna), as consultas poderão ser interrompidas se forem adicionadas colunas a tabelas que tenham o mesmo nome de outra coluna em outra tabela:
Se adicionarmos uma coluna Status ao Address, a consulta acima falhará porque agora é ambígua. Adicionar uma coluna que causa esse tipo de problema não fará com que o banco de dados anuncie "Eu adicionei, mas, a propósito, todas essas outras consultas em todo o seu esquema e sistemas dependentes agora vão falhar" - você só terá que encontrar essas consultas com falha por meio de testes. Ou clientes reclamando ;)
Se tivéssemos qualificado totalmente:
Continuaria funcionando..
Repetir o nome da tabela com as colunas é um pouco tedioso e prolixo. Usar um nome mais curto não apenas melhora a legibilidade.
..mas lembra-nos psicologicamente que podemos juntar as tabelas várias vezes por diferentes razões:
Em suma, o SQLDeveloper está tentando fazer uma coisa boa aqui, pois está se movendo em direção ao bom senso de:
Onde está caindo é:
A1
, que não ajuda você a lembrar de nada; não é por acaso que escolhip
por pessoa ea
por endereço, como tenho certeza que você pode apreciar. Se houvesse um partido e um projeto para participar, eu poderia usarper
,pro
epar
. Eu evitaria porque Pessoa, Partido epr
Projeto têm consoantes iniciais relevantes na palavra, então não grita "é um alias para PRoject" tão obviamente quanto o uso de três letras (mas eu certamente aceitaria você argumentando , e se você quiser salvar algumas teclas :))p
r
pr
pe
pa
pr
builder.addcolumn( '"' || alias_name || '"."' || col_name || '",')
do que inspecionar um nome de coluna e ver se pode precisar citando e apenas adicione-os se necessário. Infelizmente, isso significa que o código acaba em uma bagunça ilegível de"
todos os lugares.SELECT pErSon.NaME ...
bem; mesmo que a tabela.coluna seja apenas PESSOA. NAME não faz distinção entre maiúsculas e minúsculas. Mas quando adicionamos aspas cegamente, temos que colocar os nomes em letras maiúsculas, porque adicionar as aspas faz com que sejam tratadas com distinção entre maiúsculas e minúsculasSELECT "pErSon"."NaME"
! então seus identificadores de letras minúsculas cuidadosamente escritos e legíveis* desapareceram.SQLDeveloper realmente poderia ir para toda essa introspecção e lógica de descobrir o que precisava ser citado, seja por causa de caracteres funky, espaços, case sens etc. citá-lo", "apenas maiúsculo" e "apenas crie um alias que seja uma coisa única aleatória / incremental" e isso infelizmente é uma recomendação ruim, embora o espírito de parte do que está tentando seja uma boa ideia
*quando crianças aprendemos letras minúsculas antes de maiúsculas; somos sempre mais rápidos a ler frases em minúsculas do que em maiúsculas