Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> обработка переменных в строке, dbms_xmlgen 
V
    Опции темы
casinosoftguru
  Дата 10.3.2011, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.12.2008

Репутация: нет
Всего: нет



Всем привет! прошу помочь разобраться с такой проблемой:
Соединяю из своей программы вот таким образом запрос

Код

declare l_ctx  dbms_xmlgen.ctxHandle; l_sql  varchar2(400); begin l_sql := 


между верхни и нижним кодом вставляю свой запрос с переменными. если вставляю в ковычках то переменные не обрабатываются :(
а если без ковычек то тоже не лучше - вылазит ошибка 
ORA-06550: line 1, column 76.
PLS-00103: Encountered the symbol "SELECT" when expecting one of the following.

Код

; l_ctx := dbms_xmlgen.newContext(l_sql); :my_xml := dbms_xmlgen.getXml(l_ctx); end;


как правильно вставить в этот код запрос со своими переменными (если это возможно) ?
привожу полный примеры запросов, вместе с ошибками отловленными SQL Monitor
заметьте что переменные я назначаю в своей программе и ошибки там точно нет - проблема в том что с ковычками оракл не подставляет их в запрос видимо, а без ковычек возникает ошибка...


этот запрос без ковычек
Код

declare l_ctx  dbms_xmlgen.ctxHandle; l_sql  varchar2(400); begin l_sql := select a.rowid, a.*, nok.name, feut.name, pfk.name, wok.name
from natural_object a

left join natural_object_kind nok on (a.natural_object_kind = nok.id)
left join forest_end_use_type feut on (a.forest_end_use_type = feut.id)
left join protection_forest_kind pfk on (a.protection_forest_kind = pfk.id)
left join water_object_kind wok on (a.water_object_kind = wok.id)


where    (:NATURAL_OBJECT_KIND is null and LOWER(nok.name) like '%'|| LOWER(:QUERY) ||'%' or ((:NATURAL_OBJECT_KIND is null and :QUERY is null)    
or (:QUERY is null and LOWER(nok.name) like '%'|| LOWER(:NATURAL_OBJECT_KIND) ||'%')))
and (:ID is null and LOWER(a.id) like '%'|| LOWER(:QUERY) ||'%' or ((:ID is null and :QUERY is null) or
(:QUERY is null and LOWER(a.id) like '%'|| LOWER(:ID) ||'%')))
and    (:FOREST_END_USE_TYPE is null and LOWER(feut.name) like '%'|| LOWER(:QUERY) ||'%' or ((:FOREST_END_USE_TYPE is null and :QUERY is null)    
or (:QUERY is null and LOWER(feut.name) like '%'|| LOWER(:FOREST_END_USE_TYPE) ||'%')))
and    (:PROTECTION_FOREST_KIND is null and LOWER(pfk.name) like '%'|| LOWER(:QUERY) ||'%' or ((:PROTECTION_FOREST_KIND is null and :QUERY is null)    
or (:QUERY is null and LOWER(pfk.name) like '%'|| LOWER(:PROTECTION_FOREST_KIND) ||'%')))
and    (:WATER_OBJECT_KIND is null and LOWER(wok.name) like '%'|| LOWER(:QUERY) ||'%' or ((:WATER_OBJECT_KIND is null and :QUERY is null)    
or (:QUERY is null and LOWER(wok.name) like '%'|| LOWER(:WATER_OBJECT_KIND) ||'%')))
and    (:NAME is null and LOWER(a.NAME) like '%'|| LOWER(:QUERY) ||'%' or ((:NAME is null and :QUERY is null)    
or (:QUERY is null and LOWER(a.NAME) like '%'|| LOWER(:NAME) ||'%')))
and    (:COMMENTS is null and LOWER(a.COMMENTS) like '%'|| LOWER(:QUERY) ||'%' or ((:COMMENTS is null and :QUERY is null)    
or (:QUERY is null and LOWER(a.COMMENTS) like '%'|| LOWER(:COMMENTS) ||'%')))

or ((:QUERY is not null and LOWER(nok.name) like '%'|| LOWER(:QUERY) ||'%')
or (:QUERY is not null and LOWER(feut.name) like '%'|| LOWER(:QUERY) ||'%')
or (:QUERY is not null and LOWER(pfk.name) like '%'|| LOWER(:QUERY) ||'%')
or (:QUERY is not null and LOWER(wok.name) like '%'|| LOWER(:QUERY) ||'%')
or (:QUERY is not null and LOWER(a.id) like '%'|| LOWER(:QUERY) ||'%')
or (:QUERY is not null and LOWER(a.NAME) like '%'|| LOWER(:QUERY) ||'%')
or (:QUERY is not null and LOWER(a.COMMENTS) like '%'|| LOWER(:QUERY) ||'%')
)




; l_ctx := dbms_xmlgen.newContext(l_sql); :my_xml := dbms_xmlgen.getXml(l_ctx); end;
:NATURAL_OBJECT_KIND = <NULL>
:FOREST_END_USE_TYPE = <NULL>
:PROTECTION_FOREST_KIND = <NULL>
:WATER_OBJECT_KIND = <NULL>
:NAME = <NULL>
:COMMENTS = <NULL>
:QUERY = <NULL>
:ID = <NULL>
:MY_XML = <NULL>
Runtime error occurred: 6550 (ORA-06550: line 1, column 76:
PLS-00103: Encountered the symbol "SELECT" when expecting one of the following:


этот запрос с ковычками и в конце ошибка
Код

declare l_ctx  dbms_xmlgen.ctxHandle; l_sql  varchar2(400); begin l_sql := 'select a.rowid, a.*, nok.name, feut.name, pfk.name, wok.name
from natural_object a

left join natural_object_kind nok on (a.natural_object_kind = nok.id)
left join forest_end_use_type feut on (a.forest_end_use_type = feut.id)
left join protection_forest_kind pfk on (a.protection_forest_kind = pfk.id)
left join water_object_kind wok on (a.water_object_kind = wok.id)


where    (:NATURAL_OBJECT_KIND is null and LOWER(nok.name) like '%'|| LOWER(:QUERY) ||'%' or ((:NATURAL_OBJECT_KIND is null and :QUERY is null)    
or (:QUERY is null and LOWER(nok.name) like '%'|| LOWER(:NATURAL_OBJECT_KIND) ||'%')))
and (:ID is null and LOWER(a.id) like '%'|| LOWER(:QUERY) ||'%' or ((:ID is null and :QUERY is null) or
(:QUERY is null and LOWER(a.id) like '%'|| LOWER(:ID) ||'%')))
and    (:FOREST_END_USE_TYPE is null and LOWER(feut.name) like '%'|| LOWER(:QUERY) ||'%' or ((:FOREST_END_USE_TYPE is null and :QUERY is null)    
or (:QUERY is null and LOWER(feut.name) like '%'|| LOWER(:FOREST_END_USE_TYPE) ||'%')))
and    (:PROTECTION_FOREST_KIND is null and LOWER(pfk.name) like '%'|| LOWER(:QUERY) ||'%' or ((:PROTECTION_FOREST_KIND is null and :QUERY is null)    
or (:QUERY is null and LOWER(pfk.name) like '%'|| LOWER(:PROTECTION_FOREST_KIND) ||'%')))
and    (:WATER_OBJECT_KIND is null and LOWER(wok.name) like '%'|| LOWER(:QUERY) ||'%' or ((:WATER_OBJECT_KIND is null and :QUERY is null)    
or (:QUERY is null and LOWER(wok.name) like '%'|| LOWER(:WATER_OBJECT_KIND) ||'%')))
and    (:NAME is null and LOWER(a.NAME) like '%'|| LOWER(:QUERY) ||'%' or ((:NAME is null and :QUERY is null)    
or (:QUERY is null and LOWER(a.NAME) like '%'|| LOWER(:NAME) ||'%')))
and    (:COMMENTS is null and LOWER(a.COMMENTS) like '%'|| LOWER(:QUERY) ||'%' or ((:COMMENTS is null and :QUERY is null)    
or (:QUERY is null and LOWER(a.COMMENTS) like '%'|| LOWER(:COMMENTS) ||'%')))

or ((:QUERY is not null and LOWER(nok.name) like '%'|| LOWER(:QUERY) ||'%')
or (:QUERY is not null and LOWER(feut.name) like '%'|| LOWER(:QUERY) ||'%')
or (:QUERY is not null and LOWER(pfk.name) like '%'|| LOWER(:QUERY) ||'%')
or (:QUERY is not null and LOWER(wok.name) like '%'|| LOWER(:QUERY) ||'%')
or (:QUERY is not null and LOWER(a.id) like '%'|| LOWER(:QUERY) ||'%')
or (:QUERY is not null and LOWER(a.NAME) like '%'|| LOWER(:QUERY) ||'%')
or (:QUERY is not null and LOWER(a.COMMENTS) like '%'|| LOWER(:QUERY) ||'%')
)




'; l_ctx := dbms_xmlgen.newContext(l_sql); :my_xml := dbms_xmlgen.getXml(l_ctx); end;
Runtime error occurred: 1036 (ORA-01036: illegal variable name/number)



PM MAIL   Вверх
Zloxa
Дата 10.3.2011, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Код

set echo on
var bind1 varchar2
var bind2 varchar2
var result varchar2
exec :bind1 := 'Hello';
 
PL/SQL procedure successfully completed
bind1
---------
Hello
exec :bind2 := 'World';
 
PL/SQL procedure successfully completed
bind2
---------
World
declare
  l_ctx  dbms_xmlgen.ctxHandle;
  l_sql  varchar2(400);
begin
  l_sql := 'select :val1 value1, :val2 value2 from dual';
  l_ctx := dbms_xmlgen.newContext(queryString => l_sql);
  dbms_xmlgen.setBindValue(ctx => l_ctx
                           ,bindName => 'val1'
                           ,bindValue => :bind1
                           );
  dbms_xmlgen.setBindValue(ctx => l_ctx
                           ,bindName => 'val2'
                           ,bindValue => :bind2
                           );
  :result := dbms_xmlgen.getXML(ctx => l_ctx);
end;
/
 
PL/SQL procedure successfully completed
bind1
---------
Hello
bind2
---------
World
result
---------
<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <VALUE1>Hello</VALUE1>
  <VALUE2>World</VALUE2>
 </ROW>
</ROWSET>
 
SQL> 



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
casinosoftguru
Дата 10.3.2011, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.12.2008

Репутация: нет
Всего: нет



спасибо, буду пробовать
а что дает этот код ?
queryString => l_sql
ctx => l_ctx
PM MAIL   Вверх
Zloxa
Дата 10.3.2011, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(casinosoftguru @  10.3.2011,  14:45 Найти цитируемый пост)
а что дает этот код ?
queryString => l_sql
ctx => l_ctx 

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


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
casinosoftguru
Дата 10.3.2011, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.12.2008

Репутация: нет
Всего: нет



Случаем, не надо ли в строке dbms_xmlgen.setBindValue(ctx => l_ctx ,bindName => 'FOREST_END_USE_TYPE',bindValue => :FOREST_END_USE_TYPE); ставить :FOREST_END_USE_TYPE в ковычки ? Выводит ошибку.

Код

declare l_ctx  dbms_xmlgen.ctxHandle; l_sql  varchar2(4000); begin l_sql := 'select a.rowid, a.*, nok.name, feut.name, pfk.name, wok.name
from natural_object a

left join natural_object_kind nok on (a.natural_object_kind = nok.id)
left join forest_end_use_type feut on (a.forest_end_use_type = feut.id)
left join protection_forest_kind pfk on (a.protection_forest_kind = pfk.id)
left join water_object_kind wok on (a.water_object_kind = wok.id)


where    (:NATURAL_OBJECT_KIND is null and LOWER(nok.name) like ''%''|| LOWER(:QUERY) ||''%'' or ((:NATURAL_OBJECT_KIND is null and :QUERY is null)    
or (:QUERY is null and LOWER(nok.name) like ''%''|| LOWER(:NATURAL_OBJECT_KIND) ||''%'')))
and (:ID is null and LOWER(a.id) like ''%''|| LOWER(:QUERY) ||''%'' or ((:ID is null and :QUERY is null) or
(:QUERY is null and LOWER(a.id) like ''%''|| LOWER(:ID) ||''%'')))
and    (:FOREST_END_USE_TYPE is null and LOWER(feut.name) like ''%''|| LOWER(:QUERY) ||''%'' or ((:FOREST_END_USE_TYPE is null and :QUERY is null)    
or (:QUERY is null and LOWER(feut.name) like ''%''|| LOWER(:FOREST_END_USE_TYPE) ||''%'')))
and    (:PROTECTION_FOREST_KIND is null and LOWER(pfk.name) like ''%''|| LOWER(:QUERY) ||''%'' or ((:PROTECTION_FOREST_KIND is null and :QUERY is null)    
or (:QUERY is null and LOWER(pfk.name) like ''%''|| LOWER(:PROTECTION_FOREST_KIND) ||''%'')))
and    (:WATER_OBJECT_KIND is null and LOWER(wok.name) like ''%''|| LOWER(:QUERY) ||''%'' or ((:WATER_OBJECT_KIND is null and :QUERY is null)    
or (:QUERY is null and LOWER(wok.name) like ''%''|| LOWER(:WATER_OBJECT_KIND) ||''%'')))
and    (:NAME is null and LOWER(a.NAME) like ''%''|| LOWER(:QUERY) ||''%'' or ((:NAME is null and :QUERY is null)    
or (:QUERY is null and LOWER(a.NAME) like ''%''|| LOWER(:NAME) ||''%'')))
and    (:COMMENTS is null and LOWER(a.COMMENTS) like ''%''|| LOWER(:QUERY) ||''%'' or ((:COMMENTS is null and :QUERY is null)    
or (:QUERY is null and LOWER(a.COMMENTS) like ''%''|| LOWER(:COMMENTS) ||''%'')))

or ((:QUERY is not null and LOWER(nok.name) like ''%''|| LOWER(:QUERY) ||''%'')
or (:QUERY is not null and LOWER(feut.name) like ''%''|| LOWER(:QUERY) ||''%'')
or (:QUERY is not null and LOWER(pfk.name) like ''%''|| LOWER(:QUERY) ||''%'')
or (:QUERY is not null and LOWER(wok.name) like ''%''|| LOWER(:QUERY) ||''%'')
or (:QUERY is not null and LOWER(a.id) like ''%''|| LOWER(:QUERY) ||''%'')
or (:QUERY is not null and LOWER(a.NAME) like ''%''|| LOWER(:QUERY) ||''%'')
or (:QUERY is not null and LOWER(a.COMMENTS) like ''%''|| LOWER(:QUERY) ||''%'')
)




'; l_ctx := dbms_xmlgen.newContext(l_sql); 
dbms_xmlgen.setBindValue(ctx => l_ctx ,bindName => 'FOREST_END_USE_TYPE',bindValue => :FOREST_END_USE_TYPE);
dbms_xmlgen.setBindValue(ctx => l_ctx ,bindName => 'PROTECTION_FOREST_KIND',bindValue => :PROTECTION_FOREST_KIND);
dbms_xmlgen.setBindValue(ctx => l_ctx ,bindName => 'WATER_OBJECT_KIND',bindValue => :WATER_OBJECT_KIND);
dbms_xmlgen.setBindValue(ctx => l_ctx ,bindName => 'NAME',bindValue => :NAME);
dbms_xmlgen.setBindValue(ctx => l_ctx ,bindName => 'COMMENTS',bindValue => :COMMENTS);
dbms_xmlgen.setBindValue(ctx => l_ctx ,bindName => 'QUERY',bindValue => :QUERY);
dbms_xmlgen.setBindValue(ctx => l_ctx ,bindName => 'ID',bindValue => :ID);
:my_xml := dbms_xmlgen.getXml(l_ctx); end;
:MY_XML = <NULL>
Runtime error occurred: 1008 (ORA-01008: not all variables bound)


впрочем с ковычками тоже выводит ошибку, странно, вроде выходит переменная одна :MY_XML и она декларована точно...

Это сообщение отредактировал(а) casinosoftguru - 10.3.2011, 16:13
PM MAIL   Вверх
Zloxa
Дата 10.3.2011, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(casinosoftguru @  10.3.2011,  16:09 Найти цитируемый пост)
ORA-01008: not all variables bound

Связанные переменные должны быть определены.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
casinosoftguru
Дата 10.3.2011, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.12.2008

Репутация: нет
Всего: нет



это понятно
если делаю так
Код

     // ClearVariables;
     // Variables := (DictGridView.DataController.DataSet as TOracleDataSet).Variables;
      DeclareVariable('my_xml', otPLSQLString);

то ошибка 01008
а если раскомментировать код - то ошибка invalid variable name\number 
Хотя переменные копируются просто из датасета где они точно объявлены.
не пойму что он считает за переменную когда пишет not all variables bound 

Это сообщение отредактировал(а) casinosoftguru - 10.3.2011, 16:17
PM MAIL   Вверх
casinosoftguru
Дата 10.3.2011, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.12.2008

Репутация: нет
Всего: нет



хм, а можно ли делать одинаковые имена здесь ?
Код

                           ,bindName => 'val1'
                           ,bindValue => :val1

PM MAIL   Вверх
Zloxa
Дата 10.3.2011, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



да


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0528 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.