Tipi di SQL sql su dblink
-
22-07-2019 - |
Domanda
Ho due schemi: A e B (Oracle 9). Alla A c'è un lampeggio a B. Alla B c'è un pacchetto, che chiamo da A. Le procedure nel pacchetto B possono restituire risultati di conteggio variabili e penso che restituire una raccolta sia un modo migliore per questo motivo.
create type B.tr_rad as object (
name varchar2(64)
,code number
,vendor number
,val varchar2(255)
,num number
);
create type B.tt_rad as varray(256) of B.tr_rad;
Ma da uno schema non posso usare il tipo tt_rad perché l'uso di tipi SQL da parte di dblink non è supportato. DBMS_SQL non è supportato dai cursori. Creare tipi con lo stesso OID è impossibile.
Penso di usare tabelle temporanee. Ma in primo luogo non è così buono (dopo che la funzione remota restituisce il valore, il lato chiamante deve selezionare la raccolta dalla tabella remota). E ci sono timori di un rallentamento del lavoro con le tabelle temporanee.
Forse chi conosce l'interazione alternativa?
Soluzione
Ho avuto problemi simili in passato. Poi sono giunto alla conclusione che fondamentalmente i collegamenti db di Oracle sono "interrotti". per tutt'altro che semplici tipi SQL (specialmente UDT, CLOBS potrebbe avere problemi, anche XMLType). Se riesci a far funzionare la soluzione OID, allora buona fortuna a te.
La soluzione a cui ho fatto ricorso è stata utilizzare una procedura memorizzata Java, anziché DB Link.
Caratteristiche della procedura memorizzata Java:
- Può restituire un "ricco set di tipi", quasi tutti i tipi complessi (UDT, tabelle / array / varray) vedere documentazione online Oracle per i dettagli. Oracle fa un lavoro molto migliore nel marshalling di tipi complessi (o ricchi) da Java, piuttosto che da un DBLink.
- Java memorizzato può acquisire la "connessione predefinita" (viene eseguito nella stessa sessione della connessione SQL al db - nessun problema di autenticazione).
- Java memorizzato chiama il proc PL / SQL sul DB remoto e il livello java JDBC esegue il marshalling dal DB remoto.
- I pacchetti Java memorizzati aumentano il risultato e restituiscono i risultati al livello SQL o PL / SQL.
È un po 'di lavoro, ma se hai un po' di java, dovresti essere in grado di " tagliare e incollare " una soluzione insieme dalla documentazione e dall'esempio di Oracle.
Spero che questo aiuti.
Altri suggerimenti
Vedi questa discussione esistente
Un'interazione alternativa è avere un database con schemi A e B invece di due database con un collegamento al database.
La mia soluzione. Sul lato B creo una tabella temporanea come il record di raccolta. Sul lato A ho un wrapper DBMS_SQL che chiama la procedura su dblink. Questa procedura scrive la raccolta dei risultati nella tabella temporanea. Dopo aver completato correttamente la procedura remota, seleziono i risultati dalla tabella temporanea remota e li trasformo nel tipo di raccolta locale.
Limitazioni 1. la necessità di una sincronizzazione permanente degli oggetti. 2. impossibilità di utilizzare la procedura A-side (che chiama procedura remota) nella query SQL. 3. la complessità dell'utilizzo.