Pular para o conteúdo
  • Este tópico contém 6 respostas, 3 vozes e foi atualizado pela última vez 17 anos atrás por Yoke.
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #85056
    geovaenbg
    Participante

      Pessoal tenho o seguinte problema:

      tenho uma trigger em uma tabela do oracle 9i que insere dados em uma tabela do oracle 10g via dblink.

      e a situação é a seguinte. o campor ITEM_ORDEM_VENDA (que esta na tabela do oracle 9i) é do tipo NUMBER(6,0) e vem do SAP sempre com apenas 4 algarismos.

      o campo NUM_ITEM (que esta na tabela do oracle 10g) é do tipo VARACHAR2(6 BYTE).

      por motivos que não vem ao caso o campo ITEM_ORDEM_VENDA tem que ser gravado no camp NUM_ITEM com os zeros à esquerda por padrão aqui do cliente.

      na trigger eu pego o :NEW.ITEM_ORDEM_VENDA e faço um LPAD completando com zeros à esquerda.

      tenho absoluta certeza (visualmente falando) pois imprimi via DBMS_OUTPUT a variável na qual guardo o valor do campo já ajustado, que a variável possui apenas 6 caracteres. inclusive a mesma é do tipo VARCHAR2(6).

      mas quando vou gravar no banco do 10g acontece um erro dizendo que não é possível gravar pois o tamanho da variável é 7 e o campo aceita 6.

      pesquisei um pouco e vi que possuem surgir algumas incompatibilidades no transporte de dados do 9i para o 10g via dblink.

      por isso verifiquei os parâmetros dos bancos de dados.

      alguém pode me ajudar?

      código da trigger:


      create or replace TRIGGER "WINCC"."TAIU_M_ARK_ORDVENDA_HD"
      AFTER
      INSERT
      OR UPDATE ON "M_ARK_ORDVENDA_HD" FOR EACH ROW DECLARE
      VAR_COD_ORDEM_VENDA VARCHAR2(10);
      VAR_COD_PEDIDO VARCHAR2(10);
      NEW_COD_ORDEM_VENDA VARCHAR2(10);
      NEW_ITEM_ORDEM_VENDA VARCHAR2(6);
      BEGIN
      IF INSERTING THEN
      BEGIN
      NEW_COD_ORDEM_VENDA := LPAD(:NEW.COD_ORDEM_VENDA ,10, '0');
      NEW_ITEM_ORDEM_VENDA := TO_CHAR ( :NEW.ITEM_ORDEM_VENDA, '000000' );
      SELECT COD_ORDEM_VENDA INTO VAR_COD_ORDEM_VENDA FROM MESCT WHERE COD_ORDEM_VENDA = NEW_COD_ORDEM_VENDA AND ITEM_ORDEM_VENDA = :NEW.ITEM_ORDEM_VENDA AND COD_MENSAGEM = 80 ;
      BEGIN
      SELECT ppih.COD_PEDIDO INTO VAR_COD_PEDIDO from PLAN_PEDIDO_ITEM_HD@DBLINK_RKFLOW1 ppih WHERE ppih.COD_PEDIDO = NEW_COD_ORDEM_VENDA AND ppih.NUM_ITEM = NEW_ITEM_ORDEM_VENDA AND ppih.COD_ORDEM_PROCESSO = :NEW.COD_ORDEM_PROCESSO;
      EXCEPTION
      WHEN NO_DATA_FOUND THEN
      BEGIN
      INSERT INTO PLAN_PEDIDO_ITEM_HD@DBLINK_RKFLOW1
      (
      COD_ORDEM_PROCESSO
      ,COD_PEDIDO
      ,NUM_ITEM
      ,DTH_PRAZO
      ,COD_MATERIAL
      ,DES_MATERIAL
      ,MERC_VENDA
      ,QTD_ORDEM
      ,COD_UNIDADE
      ,QTD_CONV
      ,QTD_DESP
      ,TOL_MAIS_PERC
      ,TOL_MENOS_PERC
      ,COD_CLIENTE
      ,NOM_CLIENTE
      ,COD_RECUSA
      ,DES_RECUSA
      ,QTD_TOTAL_KG
      ,QTD_TOTAL_PC
      ,QTD_TOTAL_MT
      ,QTD_TOTAL_FT
      ,QTD_TOTAL_UN)
      VALUES
      (
      :NEW.COD_ORDEM_PROCESSO
      ,NEW_COD_ORDEM_VENDA
      ,SUBSTR(NEW_ITEM_ORDEM_VENDA,0,6)
      ,:NEW.DTH_PRAZO
      ,:NEW.COD_MATERIAL
      ,:NEW.DES_MATERIAL
      ,:NEW.MERC_VENDA
      ,:NEW.QTD_ORDEM
      ,:NEW.COD_UNIDADE
      ,:NEW.QTD_CONV
      ,:NEW.QTD_DESP
      ,:NEW.TOL_MAIS_PERC
      ,:NEW.TOL_MENOS_PERC
      ,:NEW.COD_CLIENTE
      ,:NEW.NOM_CLIENTE
      ,:NEW.COD_RECUSA
      ,:NEW.DES_RECUSA
      ,:NEW.QTD_TOTAL_KG
      ,:NEW.QTD_TOTAL_PC
      ,:NEW.QTD_TOTAL_MT
      ,:NEW.QTD_TOTAL_FT
      ,:NEW.QTD_TOTAL_UN);
      DBMS_OUTPUT.PUT_LINE('DADOS INSERIDOS NA TABELA PLAN_PEIDO_ITEM_HD@DBLINK_RKFLOW1.');
      END;
      END;

      EXCEPTION
      WHEN NO_DATA_FOUND THEN
      NULL;
      END;

      END IF;

      END;

      parâmetros do 10g:

      PARAMETER VALUE
      ------------------------------ ----------------------------------------
      NLS_LANGUAGE AMERICAN
      NLS_TERRITORY AMERICA
      NLS_CURRENCY $
      NLS_ISO_CURRENCY AMERICA
      NLS_NUMERIC_CHARACTERS .,
      NLS_CHARACTERSET WE8MSWIN1252
      NLS_CALENDAR GREGORIAN
      NLS_DATE_FORMAT DD-MON-RR
      NLS_DATE_LANGUAGE AMERICAN
      NLS_SORT BINARY
      NLS_TIME_FORMAT HH.MI.SSXFF AM
      NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
      NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
      NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
      NLS_DUAL_CURRENCY $
      NLS_COMP BINARY
      NLS_LENGTH_SEMANTICS BYTE
      NLS_NCHAR_CONV_EXCP FALSE
      NLS_NCHAR_CHARACTERSET AL16UTF16
      NLS_RDBMS_VERSION 10.2.0.1.0

      parâmetros do 9i:

      PARAMETER VALUE
      ------------------------------ ----------------------------------------
      NLS_LANGUAGE AMERICAN
      NLS_TERRITORY AMERICA
      NLS_CURRENCY $
      NLS_ISO_CURRENCY AMERICA
      NLS_NUMERIC_CHARACTERS .,
      NLS_CHARACTERSET WE8MSWIN1252
      NLS_CALENDAR GREGORIAN
      NLS_DATE_FORMAT DD-MON-RR
      NLS_DATE_LANGUAGE AMERICAN
      NLS_SORT BINARY
      NLS_TIME_FORMAT HH.MI.SSXFF AM
      NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
      NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
      NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
      NLS_DUAL_CURRENCY $
      NLS_COMP BINARY
      NLS_LENGTH_SEMANTICS BYTE
      NLS_NCHAR_CONV_EXCP FALSE
      NLS_NCHAR_CHARACTERSET AL16UTF16
      NLS_RDBMS_VERSION 9.2.0.1.0
      [/list]

      #85057
      Avatar photoRegis Araujo
      Participante

        Ola amigo, boa tarde!

        Será que não esta faltando o : (2 pontos) em
        –> SUBSTR(NEW_ITEM_ORDEM_VENDA,0,6)

        Assim -> SUBSTR(:NEW_ITEM_ORDEM_VENDA,0,6)

        e em

        -> NEW_COD_ORDEM_VENDA

        -> :NEW_COD_ORDEM_VENDA

        Abraços…[/b]

        #85058
        Avatar photoRegis Araujo
        Participante

          Ei amigo, aqui está seu erro…

          Com o TO_CHAR ( :NEW.ITEM_ORDEM_VENDA, ‘000000’ )

          ele retorna 7 caracteres, retorna 1 espaço a esquerda + 6 caracteres.. totalizando 7……

          faça o Lpad(:NEW.ITEM_ORDEM_VENDA,6,’0′)

          Abraços…

          #85059
          Avatar photoRegis Araujo
          Participante

            [quote=”Thunder_Catz”:3be9n00h]Ola amigo, boa tarde!

            Será que não esta faltando o : (2 pontos) em
            –> SUBSTR(NEW_ITEM_ORDEM_VENDA,0,6)

            Assim -> SUBSTR(:NEW_ITEM_ORDEM_VENDA,0,6)

            e em

            -> NEW_COD_ORDEM_VENDA

            -> :NEW_COD_ORDEM_VENDA

            Abraços…[/b][/quote]

            Ignora isto acima.. vi que vc alimenta uma variável com o mesmo nome nome…

            #85073
            geovaenbg
            Participante

              Valeu Thunder_Catz agora funcionou.

              Isso que acontece no to_char é um bug do Oracle?

              Pq pelo que eu verifiquei só ocorre quando vc coloca máscara no to_char.

              #85078
              Avatar photoRegis Araujo
              Participante

                Ola amigo, bom dia!

                Bom, não sei explicar se é bug do oracle, pois também acho estranho já que vc colocou mascara no To_Char de apenas 6 caracteres, creio que nossos amigos que tem mais tempo de trabalho com ORACLE poderiam explicar melhor…

                Abraços…

                #85436
                Yoke
                Participante

                  Pessoal, sempre eu noto o mesmo problema do pessoal com essas conversões de numérico para character.
                  É bem simples, o retorno do to_char mesmo com uma máscara, vem um caracter a mais referente ao sinal – ou + (neste caso do + ele vem em branco, sendo o 7 caractere da dúvida).
                  Ou vc deve suprimir na máscara (que deve ter um format mask acho para isso) ou deve utilizar um ltrim ou rtrim, dependendo da situação.
                  Espero ter ajudado!

                Visualizando 7 posts - 1 até 7 (de 7 do total)
                • Você deve fazer login para responder a este tópico.