- Este tópico contém 10 respostas, 5 vozes e foi atualizado pela última vez 13 anos, 4 meses atrás por rman.
-
AutorPosts
-
12 de setembro de 2011 às 5:14 pm #100732ItimuraParticipante
Pessoal,
tenho uma dúvida no meu UPDATE
Vou atualizar o nome do municipio de cada cliente,
tenho 2 tabelas,
Clientes(PCCLIENT), Cidade(PCCIDADE)
nas duas eu tenho o código IBGE o que facilita esta atualização como referência,
então o Update para ajustar o nome ficaria assim:
UPDATE PCCLIENT SET
PCCLIENT.MUNICCOB = PCCIDADE.NOMECIDADE,
PCCLIENT.MUNICENT = PCCIDADE.NOMECIDADE,
PCCLIENT.MUNICCOM = PCCIDADE.NOMECIDADE
WHERE PCCLIENT.CODCIDADE = PCCIDADE.CODCIDADE
Porém tenho uma dificuldade com programação em PL/SQL
E as observações a serem feitas são:Nem todos os clientes possuem Codigo IBGE
As colunas da tabela de clientes (PCCLIENT) MUNICOB, MUNICENT E MUNICOM é do tipo Varchar2(15),
e o nome da cidade na tabela de Cidades(PCCIDADE) é do tipo Varchar2(80), isso quer dizer que:
eu só posso atualizar o nome da cidade até 15 caracteresPreciso de ajuda para complementar meu UPDATE, alguem poderia me ajuda??
Grato a todos que leram
Douglas Itimura
12 de setembro de 2011 às 7:17 pm #100738ItimuraParticipantepor favor, me ajudem
12 de setembro de 2011 às 8:17 pm #100739leandrolbsParticipanteItimura, seguinte não entendi qual o seu problema… mas um substr(nome_cid_80,1,15) retornará os 15 primeiros caracteres…. sendo assim o c” x(15) = substr(y(80),1,15) funcionará.
acho que é isso…rsss caso não seja, explique melhor.
12 de setembro de 2011 às 8:19 pm #100740leandrolbsParticipanteUPDATE PCCLIENT SET
PCCLIENT.MUNICCOB = (select substr(nomecidade,1,15) from PCCIDADE WHERE PCCLIENT.CODCIDADE = PCCIDADE.CODCIDADE )
PCCLIENT.MUNICENT = (select substr(nomecidade,1,15) from PCCIDADE WHERE PCCLIENT.CODCIDADE = PCCIDADE.CODCIDADE )
PCCLIENT.MUNICCOM = (select substr(nomecidade,1,15) from PCCIDADE WHERE PCCLIENT.CODCIDADE = PCCIDADE.CODCIDADE )
WHERE PCCLIENT.CODCIDADE = PCCIDADE.CODCIDADE12 de setembro de 2011 às 8:31 pm #100742lordmacaParticipante[quote=”leandrolbs”:34mk4n06]
UPDATE PCCLIENT SET
PCCLIENT.MUNICCOB = (select substr(nomecidade,1,15) from PCCIDADE WHERE PCCLIENT.CODCIDADE = PCCIDADE.CODCIDADE )
PCCLIENT.MUNICENT = (select substr(nomecidade,1,15) from PCCIDADE WHERE PCCLIENT.CODCIDADE = PCCIDADE.CODCIDADE )
PCCLIENT.MUNICCOM = (select substr(nomecidade,1,15) from PCCIDADE WHERE PCCLIENT.CODCIDADE = PCCIDADE.CODCIDADE )
WHERE PCCLIENT.CODCIDADE = PCCIDADE.CODCIDADE[/quote]
Isso tem que ser feito com bloco pl/sql pois esses selects vao retornar mais de um valor.
Estou sem nenhuma anotacao de plsql aqui, assim que conseguir posto.
abraco.
12 de setembro de 2011 às 8:42 pm #100745leandrolbsParticipantelordmarca, nao estou muito bom hoje…rsss (segundona braba) mas é código IBGE, a tabela cidade só pode retornar uma linha….
o update tem quer melhorado, mas o substr acho ser o maior problema do colega…
12 de setembro de 2011 às 8:57 pm #100748rmanParticipante@Itimura
MERGE INTO PCCLIENT CLIENT
USING PCCIDADE CIDADE ON CIDADE.COD_CIDADE = CLIENT.CODCIDADE
WHEN MATCHED THEN
UPDATE SET CLIENT.MUNICICCOB = SUBSTR(CIDADE.NOMECIDADE,1,15)
MERGE INTO PCCLIENT CLIENT
USING PCCIDADE CIDADE ON CIDADE.COD_CIDADE = CLIENT.CODCIDADE
WHEN MATCHED THEN
UPDATE SET CLIENT.MUNICENT = SUBSTR(CIDADE.NOMECIDADE,1,15)
MERGE INTO PCCLIENT CLIENT
USING PCCIDADE CIDADE ON CIDADE.COD_CIDADE = CLIENT.CODCIDADE
WHEN MATCHED THEN
UPDATE SET CLIENT.MUNICCOM = SUBSTR(CIDADE.NOMECIDADE,1,15)
Merge é um comando DML, logo não existe ROLLBACK desta transação, não teste isso em uma base de produção.
Segue um artigo como referencia:
12 de setembro de 2011 às 9:33 pm #100751burgaParticipanteNa verdade existe rollback sim, por ser um comando DML. Mas o RMAN já deu a deixa do caminho legal pra resolver teu problema.
Outra opção, se não quiser atualizar cidades com mais do que 15 caracteres no nome é usar a a função LENGTH no nome com condição <= 15.
12 de setembro de 2011 às 10:02 pm #100752leandrolbsParticipanteNo updatinho basico tbm funciona….
create table PCCLIENT (
cnpj varchar2(15),
municob varchar2(15),
municent varchar2(15),
municcom varchar2(15),
codcidade varchar2(5));
--==================================
insert into PCCLIENT (cnpj, municob, municent, municcom, codcidade)
values ('1', 'ASDDDA', 'SDFSFASDFD', 'fgj', '12');
insert into PCCLIENT (cnpj, municob, municent, municcom, codcidade)
values ('2', 'SFSAF', 'ASFASDF', 'ghj', '13');
insert into PCCLIENT (cnpj, municob, municent, municcom, codcidade)
values ('3', 'ASFDASF', 'SDFASDF', 'j', '14');
insert into PCCLIENT (cnpj, municob, municent, municcom, codcidade)
values ('4', 'SDFSADF', 'ASDFSADF', 'rturth', '15');
insert into PCCLIENT (cnpj, municob, municent, municcom, codcidade)
values ('5', 'ASDFASDF', 'ASDFASF', 'wethweth', '16');
insert into PCCLIENT (cnpj, municob, municent, municcom, codcidade)
values ('6', 'ASDF', 'ASDF', 'ehewhe', '17');
insert into PCCLIENT (cnpj, municob, municent, municcom, codcidade)
values ('7', 'ASDF', 'ASDF', 'qerhehq', '18');
insert into PCCLIENT (cnpj, municob, municent, municcom, codcidade)
values ('8', 'ASDF', 'SDF', '8erherhq', '19');
--=====================================
create table PCCIDADE (
codcidade varchar2(5),
nomecidade varchar2(80));--=====================================
insert into PCCIDADE (codcidade, nomecidade)
values ('12', 'SANTO ANTONIO DE POSSE');
insert into PCCIDADE (codcidade, nomecidade)
values ('13', 'SANDOVALINA');
insert into PCCIDADE (codcidade, nomecidade)
values ('14', 'SANTA ALBERTINA');
insert into PCCIDADE (codcidade, nomecidade)
values ('15', 'SANTO ANTONIO DO PARANAPANEMA');
insert into PCCIDADE (codcidade, nomecidade)
values ('16', 'SANTA AYG DA CONCEICAO');
insert into PCCIDADE (codcidade, nomecidade)
values ('17', 'SANTA DRC DA ESPERANCA');
insert into PCCIDADE (codcidade, nomecidade)
values ('18', 'SANTA CVG DA ESTRELA');
insert into PCCIDADE (codcidade, nomecidade)
values ('19', 'SANTA BGHG DO RIO PARDO');
insert into PCCIDADE (codcidade, nomecidade)
values ('20', 'SANTA OUJYY DOS LOPES');
--=====================================
select * from pcclient pcli
where exists (
select * from pccidade pcid
where pcli.codcidade = pcid.codcidade
); -- Ok
--=====================================
update PCCLIENT pcli
set (pcli.MUNICOB, pcli.MUNICENT, MUNICCOM) =
(select substr(nomecidade, 1, 15),substr(nomecidade, 1, 15),substr(nomecidade, 1, 15)
from PCCIDADE pcid
WHERE pcli.CODCIDADE = pcid.CODCIDADE);
--=====================================
select * from pcclient pcli --Ok
1 1 SANTO ANTONIO D SANTO ANTONIO D SANTO ANTONIO D 12
2 2 SANDOVALINA SANDOVALINA SANDOVALINA 13
3 3 SANTA ALBERTINA SANTA ALBERTINA SANTA ALBERTINA 14
4 4 SANTO ANTONIO D SANTO ANTONIO D SANTO ANTONIO D 15
5 5 SANTA AYG DA CO SANTA AYG DA CO SANTA AYG DA CO 16
6 6 SANTA DRC DA ES SANTA DRC DA ES SANTA DRC DA ES 17
7 7 SANTA CVG DA ES SANTA CVG DA ES SANTA CVG DA ES 18
8 8 SANTA BGHG DO R SANTA BGHG DO R SANTA BGHG DO R 19
12 de setembro de 2011 às 10:04 pm #100753leandrolbsParticipanteNo sript acima, seria somente esta a parte principal..
o resto é teste…
update PCCLIENT pcli
set (pcli.MUNICOB, pcli.MUNICENT, MUNICCOM) =
(select substr(nomecidade, 1, 15),substr(nomecidade, 1, 15),substr(nomecidade, 1, 15)
from PCCIDADE pcid
WHERE pcli.CODCIDADE = pcid.CODCIDADE);
12 de setembro de 2011 às 10:10 pm #100754rmanParticipante[quote=”burga”:22ouk99a]Na verdade existe rollback sim, por ser um comando DML. Mas o RMAN já deu a deixa do caminho legal pra resolver teu problema.
Outra opção, se não quiser atualizar cidades com mais do que 15 caracteres no nome é usar a a função LENGTH no nome com condição <= 15.[/quote]
Verdade, existe ROLLBACK mesmo, eu que me confudi.
DDL que não tem ROLLBACK, DML sim.
-
AutorPosts
- Você deve fazer login para responder a este tópico.