Есть ли у Oracle эквивалент табличных переменных SQL Server? - PullRequest
28 голосов
/ 22 марта 2009

В SQL Server вы можете объявить табличную переменную (DECLARE @table TABLE), которая создается во время выполнения сценария, а затем удаляется из памяти.

Имеет ли Oracle аналогичную функцию? Или я застрял с CREATE / DROP утверждениями, которые сегментируют мой жесткий диск?

Ответы [ 4 ]

20 голосов
/ 22 марта 2009

Да.

Объявление переменных TABLE TYPE в PL / SQL объявляет блок. Табличные переменные также известны как индексная таблица или массив. Переменная в таблице содержит один столбец, который должен быть скалярным или запись типа данных плюс первичный ключ введите BINARY_INTEGER. Синтаксис:

DECLARE TYPE type_name IS TABLE OF (column_type | переменная% TYPE | table.column% TYPE [НЕНУЛЕВОЙ] ИНДЕКС БИНАРНОГО ИНТЕГЕРА;

- Затем объявить переменную TABLE этого типа: имя_переменной тип_имя;

- Присвоение значений переменной TABLE: имя_переменной (n) .имя_поля: = «некоторый текст»; - Где «н» значение индекса

Ссылка: http://www.iselfschooling.com/syntax/OraclePLSQLSyntax.htm

Возможно, вы также захотите взглянуть на Глобальные временные таблицы

1 голос
/ 06 марта 2015

Приведенное ниже решение является наиболее близким к 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)
            )
          );

1 голос
/ 13 января 2010

таблица в переменной в oracle отличается от таблицы переменных в MS SQLServer. в оракуле это как обычный массив в Java или C #. но в MS SQLserver это то же самое, что и любая таблица, вы можете назвать ее логической таблицей. но если вам нужно что-то в oracle, которое делает то же самое, что и переменная таблицы SQLserver, вы можете использовать курсор.

привет

1 голос
/ 22 марта 2009

Да, у него есть тип, который может содержать результирующий набор запроса (если я могу догадаться, что делает TABLE). С спросите Тома : ваша процедура может выглядеть так:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...