2009-03-22 8 views
27

In SQL Server können Sie eine Tabellenvariable (DECLARE @table TABLE) deklarieren, die erzeugt wird, während das Skript ausgeführt und dann aus dem Speicher entfernt wird.Hat Oracle eine Entsprechung der Tabellenvariablen von SQL Server?

Hat Oracle eine ähnliche Funktion? Oder stehe ich fest mit CREATE/DROP Aussagen, die meine Festplatte segmentieren?

+0

Oracle nicht meine Stärke, aber Tabellenvariablen erscheint eine Teilmenge der Oracle [Sammlung Variable] sein (http://download.oracle .com/docs/cd/B28359_01/appdev.111/b28370/Sammlungen.htm # LNPLS00511) – cmsjr

Antwort

18

Ja.

Deklarieren Sie TABLE TYPE-Variablen in einem PL/SQL-Deklarationsblock . Tabellenvariablen werden auch als Index-by-Tabelle oder -Array bezeichnet. Die Tabellenvariable enthält eine -Spalte, die ein skalarer oder Datensatz-Datentyp plus ein Primärschlüssel von Typ BINARY_INTEGER sein muss. Syntax:

DECLARE TYPE type_name IS TABLE OF (column_type | Variable% TYPE | table.column% TYPE [NOT NULL] INDEX BY BINARY INTEGER;

- Dann eine Tabelle zu erklären Variable dieses Typs: variable_name type_name;

- Zuweisen von Werten zu einer Tabelle Variable: variable_name (n) .field_name: = 'some text', - bei der 'n' ist die Indexwert

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

Vielleicht möchten Sie nehmen auch einen Blick auf Global Temporary Tables

+3

Wie kann ich eine Tabelle mit mehr als einer Spalte deklarieren? Im Beispiel: Tabelle mit 2 Spalten. Nummer und Varchar2. – MTs

+0

Durch Erstellen einer Tabelle von Datensätzen, in denen der Datensatz jede Zeile enthält – MikeT

+2

@MikeT-Tabellen - in SQL-Produkten - haben Zeilen, keine Datensätze. Bitte verwechseln Sie andere nicht mit dem Begriff "Aufzeichnungen". –

0

Ja es eine Art hat, die die Ergebnismenge einer Abfrage halten kann (wenn ich erraten was TABLE tut). Von ask Tom: Ihr Verfahren kann wie folgt aussehen:

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; 

wo p_cursor wie ein Tabellentyp ist. Wie bereits beantwortet, gibt es viele Möglichkeiten, Ergebnismengen in Oracle zu speichern. Generell ist Oracle PL/SQL weitaus leistungsfähiger als SQL Server-Skripte.

+1

Es gibt einen Unterschied zwischen Tabellenvariablen/Arrays und Ref-Cursorn. Ich denke, die ursprüngliche Frage betrifft die erstere. –

0

die Tabelle in Variable in Oracle nicht die gleiche wie Tabellenvariablen in MS SQLServer. in Oracle ist es wie regelmäßige Array in Java oder C#. aber in MS SQLserver ist es das gleiche wie jede Tabelle, Sie können es logische Tabelle nennen. , aber wenn Sie etwas in Oracle wollen, das genauso wie Tabellenvariable von SQLserver tut, können Sie den Cursor verwenden.

Grüße

0

Die folgende Lösung ist die von SQL Server am nächsten ich heute tun können.

Objekte:

 

    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; 

Abfragen:

 

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

Welchen Zweck hat es, 'vNumbers' in den bereits vorhandenen Typ umzuwandeln? –

Verwandte Themen