2009-03-22 4 views
27

Dans SQL Server, vous pouvez déclarer une variable de table (DECLARE @table TABLE) produite lors de l'exécution du script, puis retirée de la mémoire.Oracle a-t-il un équivalent des variables de table de SQL Server?

Oracle a-t-il une fonction similaire? Ou suis-je coincé avec les instructions CREATE/DROP qui segmentent mon disque dur?

+0

Oracle est pas mon point fort, mais les variables de table semble être un sous-ensemble de la [Variable Collection] Oracle (http://download.oracle .com/docs/cd/B28359_01/appdev.111/b28370/collections.htm # LNPLS00511) – cmsjr

Répondre

18

Oui. Déclarez les variables de TYPE TABLE dans un bloc de déclaration PL/SQL

Les variables de table sont également appelées tables index-by ou . La variable de table contient une colonne qui doit être un type de données d'enregistrement scalaire ou plus une clé primaire de type BINARY_INTEGER. Syntaxe:

DECLARE TYPE EST nom_type TABLE DES (type_colonne | % variable TYPE | table.colonne% TYPE [NOT NULL] INDEX PAR BINARY Integer;

- déclarer ensuite une TABLE variable de ce type: variable_name nom_type;

- Attribution de valeurs à une variable TABLE: variable_name (n) .field_name: = 'texte', - où 'n' est le valeur de l'indice

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

Vous pouvez également jeter un oeil à Global Temporary Tables

+3

Comment puis-je déclarer une table avec plus d'une colonne? Dans l'exemple: table avec 2 colonnes. Nombre et Varchar2. – MTs

+0

En créant une table d'enregistrements où l'enregistrement contient chaque ligne – MikeT

+2

Les tables @MikeT - dans les produits SQL - ont des lignes, pas des enregistrements. S'il vous plaît, ne confondez pas les autres en utilisant le terme "records". –

0

Oui, il a un type qui peut contenir le jeu de résultats d'une requête (si je peux deviner ce que TABLE fait). De ask Tom: votre procédure peut ressembler à ceci:

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; 

où p_cursor est comme un type de table. Comme cela a déjà été répondu, il existe de nombreuses options pour stocker les ensembles de résultats dans Oracle. Généralement, Oracle PL/SQL est beaucoup plus puissant que les scripts sqlserver.

+1

Il existe une différence entre les tables varables/tableaux et les curseurs ref. Je pense que la question initiale concerne le premier. –

0

La table dans variable dans Oracle n'est pas la même que les variables de table dans MS SQL Server. dans Oracle, c'est comme un tableau courant en java ou C#. mais dans MS SQLserver, c'est la même chose que n'importe quelle table, vous pouvez l'appeler table logique. mais si vous voulez quelque chose dans Oracle qui fait exactement la même chose que la variable table de SQL Server, vous pouvez utiliser le curseur.

concernant

0

La solution ci-dessous est le plus proche de SQL Server que je peux faire aujourd'hui.

Objets:

 

    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; 

Requêtes:

 

    --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

Quel est le but de lancer 'vNumbers' au type qu'il a déjà? –

Questions connexes