Ошибка в интерактивном отчете Oracle APEX - ORA-01427: однострочный подзапрос возвращает более одной строки - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь создать интерактивный отчет с запросом ниже.

Это отлично работает в SQLPLUS, но когда я пишу этот запрос в APEX и запускаю отчет, он выдает ошибку:

ORA-01427: однострочный подзапрос возвращает более одной строки

        SELECT --count(*) --31335
           hou.name ORGANISATION_NAME,            asp.vendor_name SUPPLIER_NAME,              asa.vendor_id SUPPLIER_NUMBER,
          asa.country SUPPLIER_SITE_COUNTRY_CODE,              ft1.territory_short_name  SUPPLIER_SITE_COUNTRY_DESC,                 
          case when  nvl(asa.inactive_date,sysdate) >= sysdate then             'Active'               else             'Inactive'             End SUPPLIER_SITE_STATUS,
          cbbv.bank_name BANK_NAME,
          ieb.IBAN IBAN,
         (select nvl(ppf.full_name, fu.user_name) 
          from fnd_user fu,  per_all_people_f ppf
          where fu.user_id = ieb.created_by
          and ppf.person_id (+) = fu.employee_id ) CREATED_BY,
          ieb.creation_date  CREATION_DATE,
          (select nvl(ppf.full_name, fu.user_name) 
          from fnd_user fu,  per_all_people_f ppf
          where fu.user_id = ieb.last_updated_by
          and ppf.person_id (+) = fu.employee_id ) UPDATED_BY,
          payees.bank_charge_bearer BANK_CHARGE_BEARER

         FROM apps.iby_pmt_instr_uses_all instrument,
          apps.iby_account_owners owners,
          apps.iby_external_payees_all payees,
          apps.iby_ext_bank_accounts ieb,
          apps.ap_supplier_sites_all asa,
          apps.ap_suppliers asp,
          apps.ce_bank_branches_v cbbv, 
          hr_operating_units hou  ,  fnd_lookup_values flv,  
          fnd_territories_tl ft1,
          fnd_territories_tl ft2

        WHERE  owners.ext_bank_account_id = ieb.ext_bank_account_id
        AND owners.ext_bank_account_id = instrument.instrument_id(+)
        AND payees.ext_payee_id        = instrument.ext_pmt_party_id(+)
        AND payees.payee_party_id      = owners.account_owner_party_id
        AND payees.supplier_site_id    = asa.vendor_site_id
        AND asa.vendor_id              = asp.vendor_id
        AND cbbv.branch_party_id(+)    = ieb.branch_id  
        and payees.org_id = 101
        and hou.organization_id = PAYEES.ORG_ID
        and FLV.LOOKUP_CODE = asp.vendor_type_lookup_code
        and flv.lookup_type  = 'VENDOR TYPE'
        and ft1.territory_code(+) = asa.country
        and ft2.territory_code(+) = ieb.country_code
        and PAYEES.BANK_CHARGE_BEARER = 'SHA';

Эта ошибка не возникает, если я просто раскомментирую последнее условие where, то есть "--and PAYEES.BANK_CHARGE_BEARER = 'SHA';"

Это последнее условиедаже не подзапрос, поэтому я не могу понять, почему это ошибка в APEX.В SQLPLUS все работает нормально.Также, если я запускаю запрос в SQL Workshop приложения APEX, там тоже все работает нормально.Только в то время, когда мы запускаем приложение, оно выдает эту ошибку.

Кроме того, если я удаляю это условие из запроса, приложение работает нормально, но когда я фильтрую по этому значению «SHA», оно выдает мне ту же ошибку,Это прекрасно работает, если я выберу любое другое значение, например, "OUR".

Подскажите, пожалуйста, что мне следует сделать, чтобы избежать этой ошибки.

1 Ответ

0 голосов
/ 28 ноября 2018

У вас есть два подзапроса в вашей проекции:

(select nvl(ppf.full_name, fu.user_name) 
 from fnd_user fu,  per_all_people_f ppf
 where fu.user_id = ieb.created_by
 and ppf.person_id (+) = fu.employee_id ) CREATED_BY,

и

(select nvl(ppf.full_name, fu.user_name) 
 from fnd_user fu,  per_all_people_f ppf
 where fu.user_id = ieb.last_updated_by
 and ppf.person_id (+) = fu.employee_id ) UPDATED_BY,

Один или оба из этих запросов возвращают более одной записи для конкретной комбинации пользователь / человек.Ваши таблицы выглядят как таблицы Oracle E-Business Suite.Если это так, per_all_people_f является таблицей с отслеживанием дат и может иметь более одной записи для данного person_id.Вы должны добавить дополнительный предикат в ваши условия соединения, чтобы ограничить ppf одной записью для fu.Если бы вы создали даты и обновили даты в ieb, то я бы использовал те, которые в противном случае использовали бы sysdate:

(select nvl(ppf.full_name, fu.user_name) 
 from fnd_user fu
 left join per_all_people_f ppf
   on ppf.person_id = fu.employee_id
  and trunc(sysdate) between ppf.effective_start_date and ppf.effective_end_date
 where fu.user_id = ieb.created_by) CREATED_BY,

или

(select nvl(ppf.full_name, fu.user_name) 
 from fnd_user fu
 left join per_all_people_f ppf
   on ppf.person_id = fu.employee_id
  and trunc(ieb.creation_date) between ppf.effective_start_date and ppf.effective_end_date
 where fu.user_id = ieb.created_by) CREATED_BY,

, изменения для обновления были бы аналогичными,хотя оставлено как упражнение для читателя;)

...