Oracle是否具有等效的SQL Server表变量?

时间:2009-03-22 02:44:50

标签: oracle

在SQL Server中,您可以声明一个表变量(DECLARE @table TABLE),该变量在脚本运行时生成,然后从内存中删除。

Oracle是否具有类似的功能?还是我坚持使用CREATE / DROP语句来分割我的硬盘?

4 个答案:

答案 0 :(得分:19)

  

在a中声明TABLE TYPE变量   PL / SQL声明块。表变量   也被称为索引表或   阵列。表变量包含一个   列必须是标量或   记录数据类型加上主键   键入BINARY_INTEGER。语法:

     

DECLARE      TYPE type_name IS TABLE OF         (column_type |         变量%TYPE |         TABLE.COLUMN%TYPE            [NOT NULL]               由二元整数指数;

     

- 然后声明这种类型的TABLE变量:      variable_name type_name;

     

- 为TABLE变量赋值:      variable_name(n).field_name:=   '一些文字'; - 'n'是哪里   指数值

参考:http://www.iselfschooling.com/syntax/OraclePLSQLSyntax.htm

您可能还需要查看Global Temporary Tables

答案 1 :(得分:1)

是的,它确实有一个可以保存查询结果集的类型(如果我能猜出TABLE的作用)。来自ask Tom:您的程序可能如下所示:

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;

其中p_cursor就像一个表类型。正如已经回答的那样,在Oracle中存储结果集有很多选项。通常,Oracle PL / SQL比sqlserver脚本功能强大得多。

答案 2 :(得分:1)

oracle中变量中的表与MS SQLServer中的表变量不同。 在oracle中它就像java或c#中的常规数组。但在MS SQLserver中它与任何表都相同,可以将其称为逻辑表。 但是如果你想在oracle中使用与SQLserver的表变量完全相同的东西,你可以使用cursor。

问候

答案 3 :(得分:1)

以下解决方案是我今天能与SQL Server最接近的解决方案。

物件:


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