Имеет ли Oracle эквивалент переменных таблицы SQL Server?
В SQL Server вы можете объявить переменную таблицы (DECLARE @table TABLE
), которая создается при запуске script, а затем удаляется из памяти.
Есть ли у Oracle аналогичная функция? Или я застрял с операторами CREATE
/DROP
, которые сегментируют мой жесткий диск?
Ответы
Ответ 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)
)
);