2016-05-27 2 views
0

У меня есть рабочий запрос, который подключается к удаленной базе данных Oracle через клиент Oracle 11g. Чтобы включить параметр на основе псевдонима, я использовал этот запрос в качестве подзапроса с параметром в основном запросе. Я ничего не вижу, этот вопрос - хоть что-то, очевидно, - так, прежде чем я измельчить на это еще в течение часа, я думал, что будет представлять код экспертов:Oracle ORA-00936 Отсутствует ошибка выражения с подзапросом

SELECT * 
FROM 
    (
    SELECT "UNITS"."UnitNumber", "UNITS"."ModelYear", "UNITS"."Make", "UNITS"."Model", "UNITS"."Class3", 
    "UNITS"."Class3Description", "UNITS"."TechnicalSpecification", SUBSTR("UNITS"."TechnicalSpecification", 13, 1) AS "FSC", 
    "UNITS"."OwnerDepartment", "UNITS"."UnitStatus", 
    CASE WHEN "UNITS"."Class3" = '1' AND SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'F' THEN 'Y' 
     WHEN ("UNITS"."Class3" = '10' OR "UNITS"."Class3" = '15') AND SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'U' THEN 'Y' 
     WHEN "UNITS"."Class3" = '11' AND SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'D' THEN 'Y' 
     WHEN ("UNITS"."Class3" = '2' OR "UNITS"."Class3" = '8' OR "UNITS"."Class3" = '18') AND 
    SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'C' THEN 'Y' 
     WHEN ("UNITS"."Class3" = '3' OR "UNITS"."Class3" = '9' OR "UNITS"."Class3" = '17') AND 
    SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'B' THEN 'Y' 
     WHEN "UNITS"."Class3" = '16' AND SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'S' THEN 'Y' 
     WHEN ("UNITS"."Class3" = '13' OR "UNITS"."Class3" = '4') AND SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'L' THEN 'Y' 
     WHEN ("UNITS"."Class3" = '12' OR "UNITS"."Class3" = '14') AND SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'G' THEN 'Y' 
     WHEN ("UNITS"."Class3" = '19' OR "UNITS"."Class3" = '20') AND SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'R' THEN 'Y' 
     WHEN "UNITS"."Class3" = '5' AND SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'E' THEN 'Y' 
     WHEN "UNITS"."Class3" = '6' AND SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'H' THEN 'Y' 
     ELSE '' 
     END AS "MISMATCH" 
    FROM "MFIVE"."VIEW_ALL_UNITS" "UNITS" 
    WHERE "UNITS"."OwnerDepartment" LIKE '580' AND "UNITS"."UnitStatus"='A' 
) "U" 
WHERE "U"."MISMATCH" = {?Mismatch} 
ORDER BY "U"."UnitNumber" 

При попытке запустить этот запрос я делат ошибка «Не удалось получить дату из базы данных», ORA-00936: отсутствует выражение.

Для жизни меня не видно, в чем проблема. Любая помощь будет оценена по достоинству.

+1

Что это: {? Mismatch} – OldProgrammer

+0

Это побуждает Crystal Reports 13 запрашивать параметр. В этом случае отсутствие значения будет возвращать все записи, тогда как «Y» будет возвращать только те записи, где псевдоним MISMATCH = «Y». – spacetanker

+0

Тогда, возможно, вы тоже должны были пометить CR? Что делать, если вы запускаете запрос прямо из sql? Удалите компоненты запроса до тех пор, пока проблема не исчезнет, ​​а затем добавьте обратно по одному. Это то, что кто-то еще должен будет сделать. Поскольку вы не предоставляете определения таблиц, это не похоже, что кто-то может запустить этот запрос, чтобы узнать, как его исправить. – OldProgrammer

ответ

0

Я вижу, вы усложняя процесс ... на мой опыт Select * формат не работает в кристалле

Если ваше требование использовать вспомогательный запрос, то вместо * имена столбцов, как взять выберите u.unitnumber .. .... From (sub query) и использование в Crystal Reports

Редактировать: ------------------------------ ----------------------------------- Один из вариантов - не использовать * и использовать имена столбцов, как показано в нижнем запросе.

SELECT U.UnitNumber,U.ModelYear,U."Make", U."Model", U."Class3", 
    U."Class3Description", U."TechnicalSpecification", U."FSC", 
    U."OwnerDepartment", U."UnitStatus", U.MISMATCH 
    FROM(
SELECT "UNITS"."UnitNumber", "UNITS"."ModelYear", "UNITS"."Make", "UNITS"."Model", "UNITS"."Class3", 
    "UNITS"."Class3Description", "UNITS"."TechnicalSpecification", SUBSTR("UNITS"."TechnicalSpecification", 13, 1) AS "FSC", 
    "UNITS"."OwnerDepartment", "UNITS"."UnitStatus", 
    CASE 
    WHEN "UNITS"."Class3" = '1' AND SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'F' THEN 'Y' 
     WHEN ("UNITS"."Class3" = '10' OR "UNITS"."Class3" = '15') AND SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'U' THEN 'Y' 
     WHEN "UNITS"."Class3" = '11' AND SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'D' THEN 'Y' 
     WHEN ("UNITS"."Class3" = '2' OR "UNITS"."Class3" = '8' OR "UNITS"."Class3" = '18') AND 
    SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'C' THEN 'Y' 
     WHEN ("UNITS"."Class3" = '3' OR "UNITS"."Class3" = '9' OR "UNITS"."Class3" = '17') AND 
    SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'B' THEN 'Y' 
     WHEN "UNITS"."Class3" = '16' AND SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'S' THEN 'Y' 
     WHEN ("UNITS"."Class3" = '13' OR "UNITS"."Class3" = '4') AND SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'L' THEN 'Y' 
     WHEN ("UNITS"."Class3" = '12' OR "UNITS"."Class3" = '14') AND SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'G' THEN 'Y' 
     WHEN ("UNITS"."Class3" = '19' OR "UNITS"."Class3" = '20') AND SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'R' THEN 'Y' 
     WHEN "UNITS"."Class3" = '5' AND SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'E' THEN 'Y' 
     WHEN "UNITS"."Class3" = '6' AND SUBSTR("UNITS"."TechnicalSpecification", 13, 1) <> 'H' THEN 'Y' 
     ELSE '' 
     END AS "MISMATCH" 
    FROM "MFIVE"."VIEW_ALL_UNITS" "UNITS" 
    WHERE "UNITS"."OwnerDepartment" LIKE '580' AND "UNITS"."UnitStatus"='A') U 
    WHERE "U"."MISMATCH" = {?Mismatch} 
ORDER BY "U"."UnitNumber" 

Второй вариант:

Может быть сложности запроса делает невозможным проследить ошибку ... Так что вы можете сделать наоборот взять простой запрос в add command остальной части проверки вы можете сделать в отчетах о кристаллах, которые будут легко развиваться, а также отслеживать ошибки.

Попробуйте ниже решение и дайте мне знать ваши данные.

Используйте эту команду и создайте MisMatch внутри самого отчета.

Запрос:

SELECT "UNITS"."UnitNumber", "UNITS"."ModelYear", "UNITS"."Make", "UNITS"."Model", "UNITS"."Class3", 
    "UNITS"."Class3Description", "UNITS"."TechnicalSpecification", SUBSTR("UNITS"."TechnicalSpecification", 13, 1) AS "FSC", 
    "UNITS"."OwnerDepartment", "UNITS"."UnitStatus", 
    FROM "MFIVE"."VIEW_ALL_UNITS" "UNITS" 
    WHERE "UNITS"."OwnerDepartment" LIKE '580' AND "UNITS"."UnitStatus"='A' 

Место необходимые столбцы в разработке отчета и создать формулу MisMatch и писать ниже код и разместить его на дизайн.

@Mismatch формула

if Class3 = '1' AND SUBSTR( FSC , 13, 1) <> 'F' THEN 'Y' 
else if ( Class3 = '10' OR Class3 = '15') AND SUBSTR( FSC , 13, 1) <> 'U' THEN 'Y' 
else if Class3 = '11' AND SUBSTR( FSC , 13, 1) <> 'D' THEN 'Y' 
else if ( Class3 = '2' OR Class3 = '8' OR Class3 = '18') AND 
SUBSTR( FSC , 13, 1) <> 'C' THEN 'Y' 
else if ( Class3 = '3' OR Class3 = '9' OR Class3 = '17') AND 
SUBSTR( FSC , 13, 1) <> 'B' THEN 'Y' 
else if Class3 = '16' AND SUBSTR( FSC , 13, 1) <> 'S' THEN 'Y' 
else if ( Class3 = '13' OR Class3 = '4') AND SUBSTR( FSC , 13, 1) <> 'L' THEN 'Y' 
else if ( Class3 = '12' OR Class3 = '14') AND SUBSTR( FSC , 13, 1) <> 'G' THEN 'Y' 
else if ( Class3 = '19' OR Class3 = '20') AND SUBSTR( FSC , 13, 1) <> 'R' THEN 'Y' 
else if Class3 = '5' AND SUBSTR( FSC , 13, 1) <> 'E' THEN 'Y' 
else if Class3 = '6' AND SUBSTR( FSC , 13, 1) <> 'H' THEN 'Y' 
ELSE '' 

Теперь создает рассогласование параметров, и я полагаю, ваш параметр будет иметь либо y или N и использовать это для подавления параметра Я данных в отчете.

Перейти к разделу эксперта проекта написать ниже код для подавления.

if {?Mismatch}='Y' 
then true 
else false 

Try и дайте мне знать результат

+0

Благодарим вас за попытку, но это вызывает ту же ошибку. Я использовал подзапрос, потому что псевдоним «MISMATCH» должен быть рассчитан для всех строк до того, как параметр {? Mismatch} может быть оценен. Я использовал тот же самый процесс только вчера по другому запросу, поэтому я не в состоянии понять, что оставляет плохой вкус в устах CR. – spacetanker

+0

Исправлена ​​синтаксическая ошибка, которая теперь проверяется. – Siva

+0

Все еще бросает ту же ошибку. Это негодяй. – spacetanker

0

Хотя он не отвечает, почему правильно отформатированный параметр производит «отсутствует выражение» ошибка, подход Siva предлагает делает работу. Экстра-кредит Шиве за усилия!

Я сделал несколько других изменений, прежде всего, чтобы имя параметра и имя столбца были разными. Все равно возвращает то же сообщение об ошибке.

Для моих целей мне придется жестко закодировать значение параметра в предложении WHERE для моих целей и запускать отдельные отчеты, если мне нужно увидеть все строки или только строки, где MISMATCH = «Y». Далеко не идеальный, но он работает.

Смежные вопросы