“Into”语句可以将多个结果写入列类型变量吗?

Posted

技术标签:

【中文标题】“Into”语句可以将多个结果写入列类型变量吗?【英文标题】:Can an "Into" statement write multiple results to a column type variable? 【发布时间】:2017-07-27 19:35:24 【问题描述】:

我有一个函数声明一个像这样的变量:

FUNCTION functionName((input_value) IN INTEGER) RETURN INTEGER IS

...
value_key_in   (database_name)(table_name).value_key%type;

然后它用这个 Select 语句写入这个值:

select value_key
into value_key_in
from (table)
where (Conditions);

如果(条件)为 Value_Key 返回一个以上的有效结果,“value_key_in”是否能够保存所有结果?

【问题讨论】:

是的,有可能,什么 rdms? en.wikipedia.org/wiki/Relational_database_management_system oracle.com/technetwork/issue-archive/2013/13-mar/… @IlyaBursov 听起来好像不行:“如果 SELECT 语句标识要获取多行,Oracle 数据库将引发 TOO_MANY_ROWS 异常。” Using the Cursor FOR Loop 【参考方案1】:

select into 会抛出 TOO_MANY_ROWS 错误。如果要存储选择查询的多个结果,请使用游标。

例如:open cur_values for select value_key from (table) where (Conditions);

将携带与选择查询匹配的所有记录。

【讨论】:

【参考方案2】:

没有。

如果您希望从查询中获得更多记录,您可以使用循环结果集或 BULK COLLECT 子句。

使用 BULK COLLECT,您可以将更多记录提取到 PL/SQL 集合中。

请参阅以下示例(来自this OTN article)并注意l_employees 数据类型:

PROCEDURE process_all_rows
IS
   TYPE employees_aat 
   IS TABLE OF employees%ROWTYPE
      INDEX BY PLS_INTEGER;
   l_employees employees_aat;
BEGIN
   SELECT *
   BULK COLLECT INTO l_employees
      FROM employees;

   FOR indx IN 1 .. l_employees.COUNT 
   LOOP
       analyze_compensation 
      (l_employees(indx));
   END LOOP;
END process_all_rows;

另请参阅这篇文章:Bulk Processing with BULK COLLECT and FORALL。

【讨论】:

以上是关于“Into”语句可以将多个结果写入列类型变量吗?的主要内容,如果未能解决你的问题,请参考以下文章

C#有没有DEBUG调试输出的语句提供输出变量值?

oracle存储过程select语句必须带into吗

PostgreSQL使用select into时有无STRICT关键字的区别

PostgreSQL使用select into时有无STRICT关键字的区别

select into 时有无strict关键字的区别

select into 时有无strict关键字的区别