Как исправить PL / SQL: ORA-00918: столбец, неоднозначно определенный в Oracle - PullRequest
0 голосов
/ 12 февраля 2019

Я создаю пакет в Oracle, и когда я компилирую тело пакета, я получаю PL / SQL: ORA-00918: столбец с неоднозначно определенной ошибкой.

У меня естьпрошел через код и дважды проверил псевдонимы, поэтому я немного озадачен тем, почему я получаю эту ошибку.

Ошибка, о которой идет речь, находится на строке 10. PERSON_CODE, FUND_YEAR и UIO_ID в предложении WHEREаргументы для функции, которую я создаю в пакете.

    SELECT CASE 
            WHEN LH.PROP_NOT_TAUGHT > 50 AND LA.DELIVERY_PROVIDER IS NOT NULL THEN TO_NUMBER(OU.UKPRN)
            ELSE LA.UK_PROV_NO 
           END AS UKPRN_T
    FROM FES.LEARNER_AIMS LA
     JOIN FES.LEARNER_HE LH
      ON LH.PERSON_CODE = LA.PERSON_CODE
       AND LH.FUNDING_YEAR = LA.FUNDING_YEAR
     LEFT JOIN FES.ORGANISATION_UNITS OU
      ON OU.ORGANISATION_CODE = LA.DELIVERY_PROVIDER
    WHERE LA.PERSON_CODE = PERSON_CODE
     AND LA.FUNDING_YEAR = FUND_YEAR
     AND LA.UIO_ID = UIO_ID;

Ответы [ 5 ]

0 голосов
/ 12 февраля 2019

.PERSON_CODE, FUND_YEAR и UIO_ID являются аргументами функции.

Неправильно использовать имена параметров PL / SQL, которые совпадают с именами столбцов.Компилятор применяет проверку ближайшего пространства имен, что означает, что в этом случае он пытается сопоставить PERSON_CODE со столбцом таблицы.Псевдоним не является обязательным, поэтому он не понимает, что вы пытаетесь ссылаться на параметры PL / SQL.

Поскольку у вас есть несколько таблиц со столбцом PERSON_CODE, вы получаете ошибку ORA-00918.В противном случае вы бы просто запросили все строки.

Лучше всего называть параметры по-разному;соглашение состоит в том, чтобы добавить к ним префикс p_:

WHERE LA.PERSON_CODE = P_PERSON_CODE
 AND LA.FUNDING_YEAR = P_FUND_YEAR
 AND LA.UIO_ID = P_UIO_ID;
0 голосов
/ 12 февраля 2019

Имя параметра вашей функции и имя поля конфликтуют, создавая эффект затенения.Вы можете добавить префикс имени параметра к имени функции, чтобы удалить неоднозначность

 AND LA.UIO_ID = MyfunctionName.UIO_ID;

В качестве альтернативы, переименуйте параметр, чтобы избежать таких случаев.

0 голосов
/ 12 февраля 2019

Псевдоним отсутствует для столбца UIO_ID, просто укажите OU.UIO_ID

SELECT CASE 
        WHEN LH.PROP_NOT_TAUGHT > 50 AND LA.DELIVERY_PROVIDER IS NOT NULL THEN TO_NUMBER(OU.UKPRN)
        ELSE LA.UK_PROV_NO 
       END AS UKPRN_T
FROM FES.LEARNER_AIMS LA
 JOIN FES.LEARNER_HE LH
  ON LH.PERSON_CODE = LA.PERSON_CODE
   AND LH.FUNDING_YEAR = LA.FUNDING_YEAR
 LEFT JOIN FES.ORGANISATION_UNITS OU
  ON OU.ORGANISATION_CODE = LA.DELIVERY_PROVIDER
WHERE LA.PERSON_CODE = PERSON_CODE
 AND LA.FUNDING_YEAR = FUND_YEAR
 AND LA.UIO_ID = OU.UIO_ID;

Спасибо

0 голосов
/ 12 февраля 2019

Всегда полезно использовать таблицу alais со столбцами Names.

SELECT CASE 
        WHEN LH.PROP_NOT_TAUGHT > 50 AND LA.DELIVERY_PROVIDER IS NOT NULL THEN TO_NUMBER(OU.UKPRN)
        ELSE LA.UK_PROV_NO 
       END AS UKPRN_T
FROM FES.LEARNER_AIMS LA
 JOIN FES.LEARNER_HE LH
  ON LH.PERSON_CODE = LA.PERSON_CODE
   AND LH.FUNDING_YEAR = LA.FUNDING_YEAR
 LEFT JOIN FES.ORGANISATION_UNITS OU
  ON OU.ORGANISATION_CODE = LA.DELIVERY_PROVIDER
WHERE LA.PERSON_CODE = <tableAlaisForPersonCode>PERSON_CODE
 AND LA.FUNDING_YEAR = <tableAlaisForFUND_YEAR>FUND_YEAR
 AND LA.UIO_ID = <tableAlaisForUIO_ID>UIO_ID;
0 голосов
/ 12 февраля 2019
 SELECT CASE 
            WHEN LH.PROP_NOT_TAUGHT > 50 AND LA.DELIVERY_PROVIDER IS NOT NULL THEN TO_NUMBER(OU.UKPRN)
            ELSE LA.UK_PROV_NO 
           END AS UKPRN_T
    FROM FES.LEARNER_AIMS LA
     JOIN FES.LEARNER_HE LH
      ON LH.PERSON_CODE = LA.PERSON_CODE
       AND LH.FUNDING_YEAR = LA.FUNDING_YEAR
     LEFT JOIN FES.ORGANISATION_UNITS OU
      ON OU.ORGANISATION_CODE = LA.DELIVERY_PROVIDER
    WHERE LA.PERSON_CODE = LH.PERSON_CODE
     AND LA.FUNDING_YEAR = LH.FUND_YEAR
     AND LA.UIO_ID = LH.UIO_ID;

попробуйте так

...