Подтвердить что ты не робот

Имеет ли Oracle эквивалент переменных таблицы SQL Server?

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

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

4b9b3361

Ответ 1

Да.

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

DECLARE    TYPE type_name ТАБЛИЦА       (column_type |       переменная% TYPE |       table.column% TYPE          [НЕ НОЛЬ]             УКАЗАТЕЛЬ БИНАРНОГО ИНТЕГЕРА;

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

- Назначение значений переменной TABLE:    variable_name (n).field_name: = "некоторый текст"; - Где 'n' - это значение индекса

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

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

Ответ 2

Да, у него есть тип, который может содержать результирующий набор запроса (если можно догадаться, что ТАБЛИЦА делает). Из спросите 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.

Ответ 3

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

рассматривает

Ответ 4

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