2012-02-29 2 views
0

Имея некоторые проблемы с получением BIRT, чтобы я мог создать набор данных с параметрами, установленными во время выполнения.Создание набора данных BIRT с динамическими данными - ORA-01722

SQL, который дает мне ошибку является:

... 
FROM SPRIDEN, SPBPERS P, POSNCTL.NBRJOBS X, NHRDIST d1 
where D1.NHRDIST_PAYNO between '@PAYNO_BEGIN' and '@PAYNO_BEGIN' 
AND D1.NHRDIST_YEAR = '@YEAR' 
... 

Я мои Параметры отчета определяется как PaynoBegin, PaynoEnd,

Год

У меня есть сценарий набора данных набор для beforeOpen следующим образом:

queryText = String (queryText).replace ("@PAYNO_END", Number(params["PaynoEnd"])); 
queryText = String (queryText).replace ("@PAYNO_BEGIN", Number(params["PaynoBegin"])); 
queryText = String (queryText).replace ("@YEAR", Number(params["Year"])); 

проблема, кажется, что JDBC не может получить ResultSet от этого, однако у меня есть 10 других отчетов, которые работают точно так же. Я прокомментировал предложение where и создаст набор данных. Я также попытался разбить предложение where на два и предложения с < = и> =, но он по-прежнему выбрасывает неправильную ошибку ORA-01722 на линии.

Любые мысли по этому поводу?

ответ

0

Две совершенно разные мысли:

1) У вас есть одиночные кавычки вокруг каждого из параметров в запросе, но кажется, как будто каждый из них является числовым - попробуйте удалить одиночные кавычки, так что положение where выглядит следующим образом:

where D1.NHRDIST_PAYNO between @PAYNO_BEGIN and @PAYNO_BEGIN 
AND D1.NHRDIST_YEAR = @YEAR 

Не забывайте, что должны быть необходимы все три параметра. Если запрос по-прежнему возвращает ошибку, попробуйте заменить @PAYNO_BEGIN, @PAYNO_BEGIN и @YEAR на жестко заданные числовые значения в строке запроса и посмотреть, есть ли у вас ошибка.

2) В настоящее время вы используете динамический SQL-запрос строк запроса, чтобы заменить указанные маркеры текстом введенных параметров. Это делает вас уязвимым для SQL Injection attacks - если вы не знакомы с термином, вы можете найти простой пример here.

Если вы знакомы с концепцией, возможно, создается впечатление, что атаки SQL Injection не могут быть реализованы с помощью числовых параметров. Недавно Том Кайт опубликовал несколько статей о своем blog о SQL Injection, в том числе о том, что касается SQL Injection flaw using NLS settings with numbers.

Вместо этого вы должны использовать параметры привязки. Для этого с отчетом изменить ваш запрос включает:

... 
FROM SPRIDEN, SPBPERS P, POSNCTL.NBRJOBS X, NHRDIST d1 
where D1.NHRDIST_PAYNO between ? and ? 
AND D1.NHRDIST_YEAR = ? 
... 

вместо существующего кода, удалите код замены queryText из сценария beforeOpen и сопоставить три параметра набора данных для параметров отчета PaynoBegin, PaynoEnd и год соответственно в редакторе набора данных. (Вы также должны изменить любой другой замененный текст в тексте запроса, чтобы привязать маркеры параметров (?) и указать параметры набора данных карт по мере необходимости.)

+0

Это сделало это. Я попробовал это сразу после публикации этого вопроса, когда нашел такое же решение в «BIRT - A Field Guide», но это не сработало. Пройдите через него снова, и теперь он работает в веб-браузере, а также в нашем веб-приложении. Спасибо @Mark Bannister – idonaldson