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