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?

È stato utile?

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:

  1. 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.
  2. Java memorizzato può acquisire la "connessione predefinita" (viene eseguito nella stessa sessione della connessione SQL al db - nessun problema di autenticazione).
  3. Java memorizzato chiama il proc PL / SQL sul DB remoto e il livello java JDBC esegue il marshalling dal DB remoto.
  4. 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

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top