【问题标题】: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;

【问题讨论】:

    标签: oracle plsql oracle10g


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多