Concatenar uma string

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
bride
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qua, 24 Set 2008 11:00 pm
Localização: Belo Horizonte - MG
Bride
OCA Oracle PL/SQL Developer Certified Associate

Pessoal boa tarde, eu sei que tem o concat, so que para o que eu preciso ele não funciona... preciso contatenar strings que vem de um resultado de um loop do cursos, so que não funciona ex:
SCODUMA = SCODUMA +' - '+ SCODUMA1;
bride
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qua, 24 Set 2008 11:00 pm
Localização: Belo Horizonte - MG
Bride
OCA Oracle PL/SQL Developer Certified Associate

funcionoi SCODUMA := SCODUMA +' - '+ SCODUMA1;
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Concatenação de texto em PLSQL é
||
ao contrário do java que é o +.

Selecionar tudo

SCODUMA = SCODUMA || ' - ' || SCODUMA1;
bride
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qua, 24 Set 2008 11:00 pm
Localização: Belo Horizonte - MG
Bride
OCA Oracle PL/SQL Developer Certified Associate

é eu vi aqui, Notifero so que estou com um outro erro aqui, montei uma função com cursor e tal, so que não esta concatenando so esta pegando o ultimo valor

Selecionar tudo

CREATE OR REPLACE FUNCTION GETUMAORIAPA(PIDCORDSVC IN VARCHAR2,PVLRNROSEQATV IN VARCHAR2,PVLRNUMSEQSVC IN VARCHAR2,PNROITMORDSVC IN VARCHAR2)
   RETURN VARCHAR2
AS
   CURSOR C_CODUMA IS 
         SELECT  LPAD (UMA.CODUMA,20,0)  CODUMA 
          FROM WMS_MOVRSVESQEND RSV
               INNER JOIN WMS_MOVMTGVOL MTG ON MTG.IDCMOVRSVESQEND = RSV.IDCMOVRSVESQEND
               INNER JOIN WMS_RELMTGVOLORDSVC REL ON MTG.IDCMOVMTGVOL = REL.IDCMOVMTGVOL
               INNER JOIN WMS_RELMTGORDMOVESQ RELTMP ON RELTMP.IDCMTGVOLORDSVC = REL.IDCMTGVOLORDSVC
               INNER JOIN WMS_MOVESQUMA MOV ON MOV.IDCMOVESQUMA = RELTMP.IDCMOVESQUMA
               INNER JOIN WMS_CADUMA UMA ON UMA.IDCUMA = MOV.IDCUMA
        WHERE  REL.IDCORDSVC    = PIDCORDSVC
           AND REL.VLRNROSEQATV = PVLRNROSEQATV
           AND REL.VLRNUMSEQSVC = PVLRNUMSEQSVC
           AND REL.NROITMORDSVC = PNROITMORDSVC
           ORDER BY CODUMA;
   
           
D_CODUMA C_CODUMA%ROWTYPE;
S_CODUMA VARCHAR2(20000); 
Begin 

    OPEN C_CODUMA;

    FETCH C_CODUMA
     INTO S_CODUMA;
   

    WHILE (C_CODUMA%FOUND)
    LOOP       

       S_CODUMA := S_CODUMA || D_CODUMA.CODUMA  || ' - ';
       
       FETCH C_CODUMA
       INTO S_CODUMA;

        
    END LOOP; 

    CLOSE C_CODUMA;
   
   S_CODUMA := SUBSTR (S_CODUMA, 0, LENGTH (S_CODUMA) - 2);
   RETURN S_CODUMA;
 EXCEPTION
    WHEN OTHERS
    THEN
       IF C_CODUMA%ISOPEN
       THEN
          CLOSE C_CODUMA;
       END IF;

       raise_application_error (-20100, 'FALHA NA FUNCAO GETUMAORIAPA.');   
   
End;
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Cara, você ta fazendo uma confusão danada.
Primeiro você criou duas variáveis para receber o cursor, onde precisa de apenas 1:

Selecionar tudo

D_CODUMA C_CODUMA%ROWTYPE;
S_CODUMA VARCHAR2(20000); 
Ao associar, você associou apenas a "S_CODUMA":

Selecionar tudo

FETCH C_CODUMA
     INTO S_CODUMA;
Depois tentar ficar concatenando com:

Selecionar tudo

S_CODUMA := S_CODUMA || D_CODUMA.CODUMA  || ' - ';
Porém "D_CODUMA" nunca foi atribuído um valor. Apenas "S_CODUMA" fica recebendo sempre o ultimo valor do select, e como você concatena ele com "D_CODUMA" (e este não recebe nada), então você sempre só terá o último valor.
Você ainda depois dessa concatenação fez, inexplicavelmente:

Selecionar tudo

FETCH C_CODUMA
       INTO S_CODUMA;
Enxuta isso aí, deixa uma variável só para o cursor e um para concatenação que vai funcionar.
Responder
  • Informação