2012-02-11 2 views
1

J'ai la fonction surchargée suivante dans un package oracle (10g).La fonction packagée Oracle ne fonctionne pas via le serveur lié SQL Server 2008 R2

function fnDaysFromNowToDate(dd_mon_yyyy date) return number is days number; 
    --d2 varchar2(11):=to_char(sysdate,ddf); 
Begin 
    dbms_output.put_line('d='|| to_date(dd_mon_yyyy,'dd-mon-yyyy')); 
    dbms_output.put_line('s='|| to_date(sysdate,'dd-mon-yyyy')); 
    return trunc(dd_mon_yyyy-trunc(sysdate)); 

    --return 1; 
    end; 
    --- overload for varchar 
    function fnDaysFromNowToDate(dd_mon_yyyy varchar2) return number is days number; 
    Begin 
    dbms_output.put_line('d='|| to_date(dd_mon_yyyy,'dd-mon-yyyy')); 
    dbms_output.put_line('s='|| to_date(sysdate,'dd-mon-yyyy')); 
    return trunc(to_date(dd_mon_yyyy,'dd-mon-yyyy')-trunc(sysdate)); 
    end; 

Et tous les deux fonctionnent bien lorsqu'ils sont exécutés dans les Developer Oracle Sql, comme si

select t$stdt,to_char(t$tdat,'dd-Mon-YYYY') t$tdat, t$cuno,T$CPGS,T$QANP,T$DISC 
    from baan.ttdsls031020 
     where 
     trim(t$cuno)  = '000811' 
     and pkgUtils.fnDaysFromNowToDate(to_char(t$tdat,'dd-Mon-YYYY')) > 1 
     and t$qanp   = pkgPriceWorx.fndefaultQanp 
     and trim(t$cpgs) = '1AM00'; 

mais quand j'exécute même requête par serveur lié SQL à l'aide fournisseur OraOLEDB.Oracle

select * from openquery(hades," 
select t$stdt,to_char(t$tdat,'dd-Mon-YYYY') t$tdat, t$cuno,T$CPGS,T$QANP,T$DISC 
    from baan.ttdsls031020 
     where 
     trim(t$cuno)  = '000811' 
     and pkgUtils.fnDaysFromNowToDate(to_char(t$tdat,'dd-Mon-YYYY')) > 1 
     and t$qanp   = pkgPriceWorx.fndefaultQanp 
     and trim(t$cpgs) = '1AM00' 
     "); 

les erreurs suivantes sont levées

Le fournisseur OLE DB "OraOLEDB.Oracle" pour le serveur lié "hades" a renvoyé le message
ORA-01861: le littéral ne correspond pas à la chaîne de format
ORA-06512: à "SAAP.PKGUTILS", ligne 29 ". OLE DB fournisseur "OraOLEDB.Oracle" pour serveur lié "hades" a retourné le message "ORA-01861: littéral ne pas chaîne de format de correspondance ORA-06512: à" SAAP.PKGUTILS ", ligne 29". .Net SqlClient Fournisseur de données: Msg 7320, niveau 16, état 2, ligne 3 ne peut pas exécuter la requête "select t $ stdt, to_char (t $ tdat, 'jj-lun-aaaa') t $ tdat, t $ cuno, T $ CPGS, T $ QANP, T $ DISC de baan.ttdsls031020 où trim (t $ cuno) = '000811' et pkgUtils.fnDaysFromNowToDate (to_char (t $ tdat, 'jj-lun-aaaa'))> 1 et t $ qanp = pkgPriceWorx.fndefaultQanp et trim ($ t LDPC) = '1AM00' "contre fournisseur OLE DB "OraOLEDB.Oracle" pour le serveur lié "Hadès". *

Tous idée pourquoi ce comportement?

+0

ce qui est là à "SAAP.PKGUTILS", ligne 29" ? –

+0

fonction fnDaysFromNowToDate – TonyP

+0

L'un qui reçoit une date? –

Répondre

1

Je ne pense pas qu'il est bon de surcharger une fonction plsql qui reçoit une date, avec une qui reçoit un varchar2, puisque oracle, plusieurs fois, automatiquement un varchar2 à Date selon NLS_DATE_FORMAT qui peut varier entre environnements. De toute façon, vous ne devriez pas lancer "to_char (t $ tdat, 'jj-lun-aaaa')" si t $ tdat est varchar2 car alors oracle jettera votre varchar2 à une date en premier (car to_char obtient une date en paramètre) selon NLS_DATE_FORMAT.
Vous ne devriez pas utiliser to_date sur les dates (de la même Reson)

Si vous souhaitez utiliser une surcharge pour un cas que vous ne savez pas si vous obtenez un varchar2 ou une date, vous pouvez le faire comme ceci:

function do_things(d date) return number is 

begin 

dbms_output.put_line('d=' || to_char(d, 'dd-mon-yyyy')); 
dbms_output.put_line('s=' || to_char(sysdate, 'dd-mon-yyyy')); 

return trunc(d - trunc(sysdate)); 

end do_things; 


function fnDaysFromNowToDate(dd_mon_yyyy date) return number is 
days number; 
begin 
--d2 varchar2(11):=to_char(sysdate,ddf);Begin dbms_output.put_line('d='|| to_date(dd_mon_yyyy,'dd-mon-yyyy')); 

dbms_output.put_line('function gets date'); 
days := do_things(dd_mon_yyyy); 
return days; 

end fnDaysFromNowToDate; 
--return 1; end; --- overload for varchar 


function fnDaysFromNowToDate(dd_mon_yyyy varchar2) return number is 
days number; 
Begin 
dbms_output.put_line('function gets varchar2'); 
days := do_things(to_date(dd_mon_yyyy, 'dd-mon-yyyy')); 
return days; 

end fnDaysFromNowToDate; 
+0

il fonctionne dans le développeur sql oracle, mais pas avec le serveur lié – TonyP

+0

J'ai mis à jour ma réponse, je soupçonne toujours le nls_date_format –

1

Dans mon cas, j'avais besoin d'utiliser trunc (sysdate).

Je devais appeler une fonction Oracle à partir du serveur SQL Server 2005 Linked. J'avais créé le serveur lié et je peux l'interroger mais au moment d'invoquer la fonction oracle j'ai eu différentes erreurs comme OLE DB fournisseur "OraOLEDB.Oracle" pour le serveur lié "BAN23" a renvoyé le message "ORA-01841: (complet) l'année doit être comprise entre -4713 et +9999, et ne pas être de 0 ".

Le fournisseur OLE DB "OraOLEDB.Oracle" pour le serveur lié "BAN23" a renvoyé le message "ORA-01861: littéral ne correspond pas à la chaîne de format".

J'ai essayé différents types de requêtes comme élus * de openquery (BAN23, 'SELECT contab.fu_icaro_tasas (' 'current_date' ' '' USD '', '' COP '') FROM dual')

select * de openquery (BAN23, 'SELECT contab.fu_icaro_tasas (' 'sysdate' ',' 'USD' ',' 'COP' ') FROM double')

select * de openquery (BAN23, 'SELECT contab .fu_icaro_tasas (to_date (current_date, '' DD-MM-YYYY ''), '' USD '', '' COP '') FROM dual ') select * from openquery (BAN23,' SELECT contab.fu_icaro_tasas (to_date (sysdate, '' DD-MM-AAAA ''), '' USD '', '' COP '') FROM dual ')

Ma solution a été d'ajouter trunc (sysdate) ou trunc (current_date)

select * from openquery (BAN23, 'SELECT contab.fu_icaro_tasas (TRUNC (CURRENT_DATE),' 'USD' », '' COP '') FROM dual ')

Cette dernière requête fonctionne très bien.

Questions connexes