将单列提取到数组中

Posted

技术标签:

【中文标题】将单列提取到数组中【英文标题】:Fetching a single column into array 【发布时间】:2011-12-19 21:03:29 【问题描述】:

我有一个 column_id 类型为 varchar2 的表。此表可能包含 1、0 或多行。我的业务逻辑取决于每种情况。

我正在尝试将该列提取到一个数组中,但我遇到了奇怪的错误(鉴于我对 pl/sql 的了解有限)

  TYPE t_col_id IS TABLE OF TEST_TABLE.COLUMN_ID%TYPE INDEX BY BINARY_INTEGER;
  AR_COL_ID T_COL_ID;

然后我试图将数据提取到这个数组中

SELECT COLUMN_ID INTO AR_SIM_ID FROM TEST_TABLE WHERE COLUMN_ID = 1;

我收到了这个错误

Error(7,3): PL/SQL: SQL Statement ignored
Error(7,25): PLS-00597: expression 'AR_SIM_ID' in the INTO list is of wrong type
Error(7,35): PL/SQL: ORA-00904: : invalid identifier

有什么我想念的吗?我的原始代码将使用这个数组作为

BEGIN
   -- FETCH ARRAY QUERY
   IF (AR_SIM_ID.LENGTH = 0) THEN 
      -- BUSINESS LOGIC 1
   ELSE
      -- BUSINESS LOGIC 2
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         -- BUSINESS LOGIC 3
END;

【问题讨论】:

【参考方案1】:

您必须使用BULK COLLECT INTO,而不是使用INTO

DECLARE
   TYPE t_col_id IS TABLE OF TEST_TABLE.COLUMN_ID%TYPE INDEX BY BINARY_INTEGER;
   AR_COL_ID T_COL_ID;
BEGIN
   SELECT COLUMN_ID 
     BULK COLLECT INTO AR_SIM_ID 
     FROM TEST_TABLE
    WHERE COLUMN_ID = 1;

   IF AR_SIM_ID.LENGTH = 0 THEN 
      -- BUSINESS LOGIC 1
   ELSE
      -- BUSINESS LOGIC 2
   END IF;

EXCEPTION
   WHEN NO_DATA_FOUND THEN
      -- BUSINESS LOGIC 3
END;

但是在这种情况下你不能只使用COUNT 吗?

DECLARE
   numRows   NUMBER;
BEGIN
   SELECT COUNT(COLUMN_ID)
     INTO numRows
     FROM TEST_TABLE 
    WHERE COLUMN_ID = 1;

   IF numRows = 0 THEN 
      -- BUSINESS LOGIC 1
   ELSE
      -- BUSINESS LOGIC 2, 3, etc...
   END IF;
END;

【讨论】:

问题是我的查询至少使用了 4 个连接。查询很重。如果有数据(1 条记录),我将不得不将该记录的值用于update。如果有多个数据,那么我必须为多个事件更新一些其他表。如果没有数据,那么我必须insert 新记录。因此,如果我使用计数查询,那么如果计数为 1,我将不得不重新运行查询以获取其值,以便我可以更新。 @x.509 啊,我明白了,所以我认为BULK COLLECT 会解决你的问题吗?【参考方案2】:

一个。如果您想获取所有行到 plsq 表 - 您需要批量收集 湾。如果您只想知道表中有多少行,您应该这样做:

 SELECT count(*) INTO v_count from TEST_TABLE where COLUMN_ID = 1;

c。我不喜欢将 EXCEPTION 范围用作程序工作流程的一部分- 我会这样做:

IF v_count = 0 THEN  
-- BUSINESS LOGIC 1  
ELSIF v_count = 1 THEN  
-- BUSINESS LOGIC 2  
ELSE  
-- BUSINESS LOGIC 3  
END IF;

【讨论】:

我不想获取 *.只有 1 列可以是多个值。其次,如果表中有NO_DATA怎么办? NO_DATA_FOUND 异常将被抛出,我必须在那里编写我的业务逻辑。 首先-据我了解,您不想要计数(不同的 col)那么为什么重要?其次-当您使用 count() 时,您不会得到 no_data_found 异常,而是会得到 0 ...第三-您始终可以使用选项 a - bulk collect

以上是关于将单列提取到数组中的主要内容,如果未能解决你的问题,请参考以下文章

如何将一个元素数组作为单列/列表返回? [复制]

listbox的值怎么获取vba

从 C# 中的矩形数组中提取一维数组的最佳方法是啥?

Spark将单列转换为数组

如何在 MySQL 和 Node.js 的单列中存储数组值?

如何将 Spark Dataframe 列转换为字符串数组的单列