在SQL Server中,您可以声明一个表变量(DECLARE @table TABLE
),该变量在脚本运行时生成,然后从内存中删除。
Oracle是否具有类似的功能?还是我坚持使用CREATE
/ DROP
语句来分割我的硬盘?
答案 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) ) );