2014-01-17 44 views
-1

我得到01427. 00000 - 「單行子查詢返回多行」錯誤,同時執行下面的過程。這個問題,我相信,這是在子查詢01427. 00000 - 「單行子查詢返回多個行」

SELECT paymentterm FROM temp_pay_term WHERE pid = d.xProject_id

,但我怎麼能擺脫it.Now的,我已經添加了完整的代碼。請檢查並讓我知道錯誤告訴我是否有更多信息。將被提供。

CREATE OR REPLACE PROCEDURE paytermupdate IS 
    recordcount INT; 
    vardid   NUMBER(38); 
    varpaymentterm VARCHAR2(200 CHAR); 
    BEGIN 
    recordcount := 0; 

    SELECT COUNT(1) INTO recordcount 
    FROM temp_pay_term; 

    IF recordcount > 0 THEN 
     FOR x IN (SELECT DISTINCT r.ddocname 
       FROM temp_pay_term p, docmeta d, revisions r 
       WHERE TO_CHAR(p.pid) = d.xproject_id AND r.did = d.did   ) 
     LOOP 
     SELECT MAX(did) INTO vardid 
     FROM revisions r 
     WHERE r.ddocname = x.ddocname 
     GROUP BY r.ddocname; 

     UPDATE docmeta d 
     SET paymentterm = (
      SELECT paymentterm 
      FROM temp_pay_term 
      WHERE pid = d.xproject_id 
     ) 
     WHERE d.did = vardid; 

     INSERT INTO documenthistory (dactionmillis, dactiondate, did, drevclassid, 
            duser, ddocname, daction, dsecuritygroup, paymentterm) 
      SELECT 
      to_number(TO_CHAR(systimestamp, 'FF')) AS dactionmillis, 
      TRUNC(systimestamp, 'dd')    AS dactiondate, 
      did, 
      drevclassid, 
      'sysadmin'        AS duser, 
      ddocname, 
      'Update'        AS daction, 
      dsecuritygroup, 
      paymentterm 
      FROM revisions 
      WHERE did = vardid; 

     END LOOP; 

     COMMIT; 
    END IF; 
    END paytermupdate; 
+0

當預期只有一行時,子查詢(查詢中的SELECT)返回多行時會返回此錯誤。不幸的是,你的不完整的代碼不足以讓我們真正地幫助你。 –

+0

如果錯誤在行中:「SELECT paymentterm FROM temp_pay_term WHERE pid = d.xProject_id」,您應該發佈完整語句(以「WHERE d.did = vardid;」結尾)以幫助任何人提供幫助。 –

+0

在查詢中添加了完整的代碼。請檢查。感謝 –

回答

0

你是否使用來自像

選擇X,Y,Z,(子查詢)?

如果你正在獲得ORA-01427,你應該考慮如何使你的子查詢中的過濾條件更具限制性,並且這些限制應該是商業上合理的,而不僅僅是簡單的「和rownum < = 1」。

0

由於您想要通過該子查詢更新記錄,因此應該在其中添加更多過濾條件。您可以根據您要在外部查詢中的表中更新的值來決定過濾條件。如果有更多的值滿足條件(我不相信這是理想的,但以防萬一),那麼rownum < = 1就足夠了。

0

想到兩個基本選項。我將從最簡單的開始。

首先,添加截然不同的子查詢。

SET paymentterm = 
    (SELECT distinct paymentterm 
    FROM temp_pay_term 
    WHERE pid = d.xProject_id 
) 

其次,如果你從子查詢接收多個不同的值,那麼你將不得不(一)返工你的腳本不使用子查詢或(B)限值返回(作爲@Baljeet建議)使用更多的篩選條件或(c)使用聚合函數選擇您想要的多個不同值中的哪一個。

使用聚合方法,我猜PaymentTerm是幾個月或幾年?即使它是n/varchar字段(即「6個月」),仍然可以使用MIN()和MAX()聚合(或者至少可以在t-sql中使用)。如果它是數字字段,則也可以使用平均值。你必須弄清楚哪些最適合你的業務需求。

相關問題