- Este tópico contém 6 respostas, 3 vozes e foi atualizado pela última vez 17 anos atrás por
Yoke.
-
AutorPosts
-
3 de fevereiro de 2009 às 11:27 pm #85056
geovaenbg
ParticipantePessoal 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.0parâmetros do 9i:
[/list]
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.03 de fevereiro de 2009 às 11:46 pm #85057Regis Araujo
ParticipanteOla 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]
3 de fevereiro de 2009 às 11:52 pm #85058Regis Araujo
ParticipanteEi 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…
3 de fevereiro de 2009 às 11:57 pm #85059Regis 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…
4 de fevereiro de 2009 às 3:07 pm #85073geovaenbg
ParticipanteValeu 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.
4 de fevereiro de 2009 às 4:55 pm #85078Regis Araujo
ParticipanteOla 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…
23 de fevereiro de 2009 às 3:27 pm #85436Yoke
ParticipantePessoal, 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! -
AutorPosts
- Você deve fazer login para responder a este tópico.