2009-03-22 9 views
27

En SQL Server, puede declarar una variable de tabla (DECLARE @table TABLE), que se genera mientras se ejecuta el script y luego se elimina de la memoria.¿Oracle tiene un equivalente de las variables de tabla de SQL Server?

¿Oracle tiene una función similar? ¿O estoy atrapado con CREATE/DROP declaraciones que segmentan mi disco duro?

+0

Oracle no es mi fuerte, pero las variables de tabla parece ser un subconjunto de la Oracle [Colección de variación] (http://download.oracle .com/docs/cd/B28359_01/appdev.111/b28370/collections.htm # LNPLS00511) – cmsjr

Respuesta

18

Sí.

Declare las variables TABLE TYPE en un PL/SQL declare block. Las variables de tabla también se conocen como index-by table o array. La variable de tabla contiene una columna que debe ser un tipo de registro escalar o más una clave primaria de tipo BINARY_INTEGER. Sintaxis:

DECLARE TIPO nombre_tipo ES TABLA DE (tipo_columna | tipo de variable% | table.column% TIPO [NOT NULL] ÍNDICE por Binary entero;

- Luego de declarar una TABLA variable de este tipo: variable_name type_name;

- Asignación de valores para una variable de tabla: variable_name (n) .field_name: = 'algún texto'; - donde 'n' es elvaloríndice

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

Es posible que desee también echar un vistazo a Global Temporary Tables

+3

¿Cómo puedo declarar una tabla con más de una columna? En el ejemplo: tabla con 2 columnas. Número y Varchar2. – MTs

+0

Al crear una tabla de registros donde el registro contiene cada fila – MikeT

+2

@MikeT tablas - en productos SQL - tienen filas, no registros. Por favor, no confunda a otros usando el término "registros". –

0

Sí que sí tiene un tipo que puede contener el conjunto de resultados de una consulta (si puedo adivinar qué TABLE hace). De ask Tom: su procedimiento puede tener este aspecto:

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; 

donde p_cursor es como un tipo de tabla. Como ya se ha respondido, hay muchas opciones para almacenar conjuntos de resultados en Oracle. En general, Oracle PL/SQL es mucho más poderoso que las secuencias de comandos sqlserver.

+1

Hay una diferencia entre los vectores/matrices y los cursores de referencia. Creo que la pregunta original es sobre el primero. –

0

la tabla en variable en oráculo no es lo mismo que las variables de tabla en MS SQLServer. en Oracle es como una matriz regular en java o C#. pero en MS SQLserver es lo mismo que cualquier tabla, puede llamarlo tabla lógica. , pero si quiere algo en Oracle que haga exactamente lo mismo que la variable de tabla de SQLserver, puede usar el cursor.

respecto

0

La solución a continuación es el más cercano de SQL Server que puedo hacer hoy.

Objetos:

 

    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; 

Consultas:

 

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

¿Cuál es el propósito de convertir 'vNumbers' al tipo que ya tiene? –

Cuestiones relacionadas