2009-03-22 1 views
27

Trong SQL Server, bạn có thể khai báo biến bảng (DECLARE @table TABLE), được tạo ra trong khi tập lệnh được chạy và sau đó bị xóa khỏi bộ nhớ.Oracle có tương đương với các biến bảng của SQL Server không?

Oracle có chức năng tương tự không? Hoặc tôi có mắc kẹt với câu hỏi CREATE/DROP phân đoạn ổ đĩa cứng của tôi không?

+0

Oracle không phải là sở trường của tôi, nhưng biến bảng dường như là một tập hợp con của Oracle [Collection Variable] (http://download.oracle .com/docs/cd/B28359_01/appdev.111/b28370/bộ sưu tập.htm # LNPLS00511) – cmsjr

Trả lời

18

Có.

Khai báo TABLE Biến TYPE trong một khối khai báo PL/SQL. Biến bảng còn được gọi là bảng chỉ mục theo bảng hoặc mảng . Biến bảng chứa một cột phải là cột vô hướng hoặc kiểu dữ liệu bản ghi cộng với khóa chính của loại BINARY_INTEGER. Cú pháp:

DECLARE TYPE type_name LÀ MỤC (column_type | % TYPE biến | table.column% TYPE [NOT NULL] INDEX THEO Binary INTEGER;

- Sau đó, để khai báo một TABLE biến kiểu này: variable_name type_name;

- Gán giá trị cho một biến TABLE: variable_name (n) .field_name: = 'một số văn bản'; - Trường hợp 'n' làgiá trịindex

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

Bạn có thể muốn cũng để có một cái nhìn tại Global Temporary Tables

+3

Làm cách nào để khai báo một bảng có nhiều cột? Ví dụ: bảng có 2 cột. Số và Varchar2. – MTs

+0

Bằng cách tạo một bảng các bản ghi trong đó bản ghi chứa mỗi hàng – MikeT

+2

các bảng @MikeT - trong các sản phẩm SQL - có các hàng, chứ không phải các bản ghi. Xin vui lòng, không nhầm lẫn người khác bằng cách sử dụng thuật ngữ "hồ sơ". –

0

Có nó có một loại có thể chứa các tập kết quả của một truy vấn (nếu tôi có thể đoán TABLE làm gì). Từ ask Tom: quy trình của bạn có thể trông giống như sau:

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; 

nơi p_cursor giống như loại bảng. Như đã được trả lời, có rất nhiều tùy chọn để lưu trữ các bộ kết quả trong Oracle. Nói chung Oracle PL/SQL là mạnh hơn rất nhiều so với kịch bản sqlserver.

+1

Có một sự khác biệt giữa bảng varables/mảng và ref con trỏ. Tôi nghĩ câu hỏi ban đầu là về câu hỏi cũ. –

0

bảng trong biến trong oracle không giống như biến bảng trong MS SQLServer. trong oracle nó giống như mảng thông thường trong java hoặc C#. nhưng trong MS SQLserver nó giống như bất kỳ bảng nào, bạn có thể gọi nó là bảng logic. nhưng nếu bạn muốn một cái gì đó trong oracle mà không chính xác giống như biến bảng của SQLserver bạn có thể sử dụng con trỏ.

liên quan

0

Giải pháp dưới đây là gần nhất với SQL Server tôi có thể làm hôm nay.

Đối tượng:

 

    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; 

Queries:

 

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

Mục đích trong việc truyền 'vNumbers' thành loại nó đã có? –