2017-01-16 61 views
0

我想在這裏使用遊標光標場,我想知道如何我在選擇列訪問光標場?如何使用選擇查詢

我有如下的實現,

create or replace TYPE "TABLE_TYPE_SAMPLE" AS OBJECT(
    ENTITY_NAME   VARCHAR2(100) 
); 

create or replace TYPE "TABLE_SAMPLE" AS TABLE OF TABLE_TYPE_SAMPLE; 

CREATE OR REPLACE FUNCTION segmentFields(
    txnId   VARCHAR2) 
    RETURN TABLE_SAMPLE 
IS 
attValue VARCHAR2(20); 
curStr VARCHAR2(20); 

    flexTable TABLE_SAMPLE := TABLE_TYPE_SAMPLE(); 

CURSOR cur_seg 
IS 
    (SELECT colA 
    FROM table1 -- (table name has column colA) 
    WHERE id = txnId 
    ); 
BEGIN 
FOR cur_recd IN cur_seg 
LOOP 
    curStr := cur_recd.colA; 
    SELECT curStr into attValue FROM PER_PEOPLE_GROUPS; 

flexTable.EXTEND; 
    flexTable(flexTable.count) := (TABLE_TYPE_SAMPLE(attValue)) ; 
END LOOP; 
RETURN flexTable; 
END; 

沒有錯誤遵守的功能。但是當我嘗試下面的查詢運行

select * from table(segmentFields(480)); 

我得到下面的錯誤,

ORA-01422:精確獲取回報超過行
ORA-06512的請求數:在 「SEGMENTFIELDS」 ,第19行
01422. 00000 - 「精確讀取返回的行數多於請求的行數」
*原因:精確讀取中指定的數字小於返回的行數。
*行動:重寫行的查詢或更改號碼請

我想明白了,什麼是錯的這個實現。

謝謝。

回答

0

錯誤行:

SELECT curStr成attValue FROM PER_PEOPLE_GROUPS;

執行代碼? PER_PEOPLE_GROUPS有多少行?

error indicates that more than one。你可能需要在where子句中加入一個條件?

0

問題在於select into。不知道爲什麼在那裏擺在首位。你的光標值可以在cur_recd.cola中找到,你可以直接使用它。

create or replace function segmentfields(txnid varchar2) return table_sample is 

    flextable table_sample := table_type_sample(); 

    cursor cur_seg is(
     select cola 
     from table1 -- (table name has column colA) 
     where id = txnid); 
begin 
    for cur_recd in cur_seg 
    loop 
     flextable.extend; 
     flextable(flextable.count) := (table_type_sample(cur_recd.cola)); 
    end loop; 
    return flextable; 
end; 
0

此查詢有沒有WHERE子句:

SELECT curStr into attValue FROM PER_PEOPLE_GROUPS; 

這意味着它會返回命中爲所有行在PER_PEOPLE_GROUPS。 SELECT ... INTO構造填充單個變量,因此需要一個返回恰好一行的查詢。 ORA-01422消息表明你沒有執行精確的提取,顯然是因爲PER_PEOPLE_GROUPS有多行。

幾個可能的解決方案,這取決於你想要達到的目的:

  1. 添加某種形式的限制,讓你只能從PER_PEOPLE_GROUPS返回一行。
  2. 使用BULK COLLECT來填充任何數組。
  3. 更換SELECT用一個簡單的任務flexTable(flexTable.count) := (TABLE_TYPE_SAMPLE(cur_recd.colA))

在它的面前,丟棄SELECT看來,因爲它不提供任何信息的最佳選擇。但是,您似乎也可能試圖實現一些未在發佈代碼中表示的業務邏輯,因此可能需要進行一些更改。

+0

嗨APC, 您的推薦BULK INTO工作。 TYPE segments_aat 是表cur_seg%ROWTYPE; l_columns segments_aat; SELECT curStr BULK COLLECT到l_columns FROM PER_PEOPLE_GROUPS; – SatyajeethT

+0

@SatyajeethT - 如果這個答案對你有用,請將它作爲正確答案加註和/或接受。這些行動提高了SO作爲未來求職者資源的質量。 – APC