【问题标题】:ORA-01427 Single row subquery return more than one rowORA-01427单行子查询返回多于一行
【发布时间】:2019-09-29 16:20:30
【问题描述】:

我有以下查询,一旦我运行它,它就成功超过了,没有错误,但是当我在一个过程中运行它时,我得到了一个错误。

CREATE OR REPLACE PROCEDURE ABLEA_NEW.AB_VATFILE
     IS
      fHandle UTL_FILE.FILE_TYPE;
      err       varchar2(200);
     v_str VARCHAR2(4000);

    CURSOR VAT1 IS
      SELECT (SELECT cif_no
                FROM nbfc_customer_m
               WHERE customerid = a.bpid) ||
               (SELECT EXTRACT_ACCT(HOST_ACCT_INFO, 'SUFFIX')             
                FROM LEA_AGREEMENT_GROUPGL_MAP A, FA_ACCTCATG_M B
               WHERE EXTRACT_ACCT(A.HOST_ACCT_INFO, 'ACCTCATG') = B.ACCTCATG
                 AND B.GROUPID = 'FA'
                 AND A.ACTIVE_FLAG = 'Y'
                 and AGREEMENTID   = a.caseid)
                 "Account No",lpad(a.caseid,6,0) Loan_No
                 ,
             (SELECT AGREEMENTNO
                FROM lea_agreement_dtl
               WHERE AGREEMENTID = a.caseid)
                 AGREEMENTNO
             ,
                 LPAD(A.productid,3,0) Scheme_ID,
             (SELECT rpad(schemedesc,35,' ')
                FROM lea_scheme_m
               WHERE schemeid = a.productid)
                 SchemeDesc,
           to_char(a.advicedate,'ddmmyyyy') advicedate,
           it_conv(a.adviceamt) adviceamt,
           rpad(a.chargeid,6,' ')chargeid,
           (SELECT rpad(chargedesc,35,' ')
              FROM nbfc_charges_m
             WHERE chargeid = a.chargeid)
               "Charge Description",
               IT_CONV(a.chargeamt)chargeamt,
               (SELECT 
                     decode(count(1),0,'N','Y')
                                 FROM  nbfc_pmnt_dtl y
               WHERE     a.txnadviceid = y.txnadviceid
                     AND a.status = 'A'
                     AND y.status IS NULL
                     --and TRUNC(y.pmntdate) between :p_datefrom and :p_dateto
                     AND a.tax_applicable = 'Y'
                     AND a.ptxnadviceid IS NULL)Paid,
                  LPAD(b.chargeid,6,0)
               "VAT ChargeID",
           (SELECT RPAD(chargedesc,35,' ')
              FROM nbfc_charges_m
             WHERE chargeid = b.chargeid)
               "VAT Charge Description",
           IT_CONV(b.chargeamt)
               "VAT Amount"
      FROM (SELECT *
              FROM nbfc_txn_advice_dtl
             WHERE status = 'A' AND tax_applicable = 'Y' AND ptxnadviceid IS NULL)
           a,
           (SELECT *
              FROM nbfc_txn_advice_dtl
             WHERE status = 'A' AND ptxnadviceid IS NOT NULL) b
     WHERE a.txnadviceid = b.ptxnadviceid;

     BEGIN
      fHandle := UTL_FILE.FOPEN('UAEDB', 'VAT', 'W');
       FOR I IN VAT1
         LOOP
         v_str:= null;
                v_str:= I."Account No"||I.Loan_No||I.AGREEMENTNO || I.Scheme_ID ||I.SchemeDesc|| I.advicedate|| I.adviceamt|| I.chargeid||I."Charge Description"||I.chargeamt||I.Paid||
                I."VAT ChargeID" ||I."VAT Charge Description"||I."VAT Amount";                                  
                  UTL_FILE.PUTF(fHandle,v_str);
                   UTL_FILE.PUTF(fHandle, '\n');
         END LOOP;
         UTL_FILE.FCLOSE(fHandle);
     END ;
    /

我该如何解决这个问题? 注意:查询返回多于10000条记录。

【问题讨论】:

    标签: oracle oracle10g


    【解决方案1】:

    对“(select from )as ColumnAlias”查询列一一注释或取消注释,可以找到哪个子查询列返回多行

    【讨论】:

    • 我认为是写入文件中的问题,因为一旦我执行该过程就会导致问题
    • 为简单起见,您也可以最大化或最小化子查询列
    • 我可以举个例子吗?
    • select T.TABLE_NAME, (select max(C.COLUMN_NAME) from USER_TAB_COLS c where c.TABLE_NAME=t.TABLE_NAME) one_of_column from USER_TABLES t;
    • 我也一样
    猜你喜欢
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多