2009-03-22 1 views
27

In SQL Server, è possibile dichiarare una variabile di tabella (DECLARE @table TABLE), che viene prodotta mentre lo script viene eseguito e quindi rimosso dalla memoria.Oracle ha un equivalente delle variabili di tabella di SQL Server?

Oracle ha una funzione simile? O sono bloccato con le dichiarazioni CREATE/DROP che segmentano il mio disco rigido?

+0

Oracle non è il mio forte, ma le variabili di tabella sembra essere un sottoinsieme di Oracle [Collezione variabile] (http://download.oracle .com/docs/cd/B28359_01/appdev.111/b28370/collezioni.htm # LNPLS00511) – cmsjr

risposta

18

Sì.

Dichiarare le variabili TABLE TYPE in un blocco di dichiarazione PL/SQL . Le variabili di tabella sono anche note come tabella indicizzata o matrice . La variabile table contiene una colonna che deve essere un tipo di dati scalare o record più una chiave primaria di tipo BINARY_INTEGER. Sintassi:

DECLARE TIPO nome_tipo È TABELLA DI (tipo_colonna | % tipo di variabile | table.column% TIPO [NOT NULL] INDICE PER BINARIO intero;

- Poi, per dichiarare una TABELLA variabile di questo tipo: nome_variabile nome_tipo;

- Assegnare valori a una variabile TABLE: nome_variabile (n) .field_name: = 'del testo', - dove 'n' è ilvalore didi indice

Rif: http://www.iselfschooling.com/syntax/OraclePLSQLSyntax.htm

Si potrebbe desiderare di prendere anche uno sguardo a Global Temporary Tables

+3

Come posso dichiarare una tabella con più di una colonna? Nell'esempio: tabella con 2 colonne. Numero e Varchar2. – MTs

+0

Creando una tabella di record in cui il record contiene ciascuna riga – MikeT

+2

Le tabelle @MikeT - nei prodotti SQL - hanno righe, non record. Per favore, non confondere gli altri usando il termine "record". –

0

Sì, ha un tipo che può contenere il set di risultati di una query (se posso immaginare cosa fa TABLE). Da ask Tom: la vostra procedura può apparire come segue:

procedure p(p_state in varchar2, p_cursor in out ref_cursor_type) 
is 
begin 
    open p_cursor for select * from table where state = P_STATE; 
end; 

dove p_cursor è come un tipo di tabella. Come è già stato risposto ci sono molte opzioni per la memorizzazione dei set di risultati in Oracle. Generalmente Oracle PL/SQL è molto più potente degli script sqlserver.

+1

C'è una differenza tra varables/array di tabella e cursori ref. Penso che la domanda iniziale riguardi la prima. –

0

la tabella in variabile in oracle non corrisponde alle variabili di tabella in MS SQLServer. in oracolo è come un normale array in java o C#. ma in MS SQLserver è uguale a qualsiasi tabella, è possibile chiamarla tabella logica. ma se vuoi qualcosa in oracle che fa esattamente la stessa cosa della variabile di tabella di SQLserver puoi usare il cursore.

riguarda

0

La soluzione qui di seguito è il più vicino da SQL Server che posso fare oggi.

oggetti:

 

    CREATE OR REPLACE TYPE T_NUMBERS IS TABLE OF NUMBER; 

    CREATE OR REPLACE FUNCTION ACCUMULATE (vNumbers T_NUMBERS) 
    RETURN T_NUMBERS 
    AS 
     vRet T_NUMBERS; 
    BEGIN 
     SELECT SUM(COLUMN_VALUE) 
     BULK COLLECT INTO vRet 
     FROM TABLE(CAST(vNumbers AS T_NUMBERS)); 

     RETURN vRet; 
    END; 

Query:

 

    --Query 1: Fixed number list. 
    SELECT * 
    FROM TABLE(ACCUMULATE(T_NUMBERS(1, 2, 3, 4, 5))); 

    --Query 2: Number list from query. 
    WITH cteNumbers AS 
    (
     SELECT 1 AS COLUMN_VALUE FROM DUAL UNION 
     SELECT 2 AS COLUMN_VALUE FROM DUAL UNION 
     SELECT 3 AS COLUMN_VALUE FROM DUAL UNION 
     SELECT 4 AS COLUMN_VALUE FROM DUAL UNION 
     SELECT 5 AS COLUMN_VALUE FROM DUAL 
    ) 
    SELECT * 
    FROM TABLE(
      ACCUMULATE(
       (SELECT CAST(COLLECT(COLUMN_VALUE) AS T_NUMBERS) 
       FROM cteNumbers) 
      ) 
     ); 

+0

Qual è lo scopo della trasmissione di 'vNumbers' al tipo che già possiede? –