powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Использование динамического PL/SQL с параметрами блоков данных в Oracle Forms
8 сообщений из 8, страница 1 из 1
Использование динамического PL/SQL с параметрами блоков данных в Oracle Forms
    #37041928
Magic+
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Возникла необходимость анализировать значения параметров в форме, причём параметры задаются во внешней среде, хотел сделать через слияние данных запроса в строке и дальнейшем разборе, но не могу понять, как победить ошибки Не все переменные привязаны/Переменной привязки не существует

Пример кода

Код: plaintext
1.
2.
3.
4.
v_cursor := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(v_cursor, 'select count(1) from dual where :WORK_ORDER.ATTRIBUTE1 = ''Просмотр''',  2 );
DBMS_SQL.DEFINE_COLUMN_CHAR(v_cursor,  1 , v_dname,  4000 );
v_rows := DBMS_SQL.EXECUTE(v_cursor);

Суть данного кода, при его вызове должен быть проанализирован параметр ATTRIBUTE1 блока WORK_ORDER на указанное значение.
Ошибка Не все переменные привязаны возникает на команде v_rows := DBMS_SQL.EXECUTE(v_cursor);

Основная проблема в том, что условие во фразе WHERE заранее не известно, и атрибутов "всего лишь" может быть 100 штук (ATTRIBUTE1 - ATTRIBUTE100).

Т.е. как бы суть ошибки понятно, пакет думает, что :WORK_ORDER.ATTRIBUTE1 - это связанная переменная

Как вариант решения проблемы вот такой код:
Код: plaintext
1.
2.
3.
4.
5.
v_cursor := DBMS_SQL.OPEN_CURSOR;
/*Изменил*/DBMS_SQL.PARSE(v_cursor, 'select count(1) from dual where :ATTRIBUTE1 = ''Просмотр''',  2 );
/*Добавил*/DBMS_SQL.BIND_VARIABLE(v_cursor, ':ATTRIBUTE1',:WORK_ORDER.ATTRIBUTE1);
DBMS_SQL.DEFINE_COLUMN_CHAR(v_cursor,  1 , v_dname,  4000 );
v_rows := DBMS_SQL.EXECUTE(v_cursor);

При таком раскладе работает, но у меня может быть 100 разных атрибутов, и при добавлении строки
DBMS_SQL.BIND_VARIABLE(v_cursor, ':ATTRIBUTE2',:WORK_ORDER.ATTRIBUTE2);
для данного примера выдаётся ошибка, что переменной привязки не существует

В общем как то так.
...
Рейтинг: 0 / 0
Использование динамического PL/SQL с параметрами блоков данных в Oracle Forms
    #37042037
ya.vypusck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Много раз читал, ничего не понял.
Может просто так надо писать?
Код: plaintext
DBMS_SQL.PARSE(v_cursor, 'select count(1) from dual where ' || :WORK_ORDER.ATTRIBUTE1 || ' = ''Просмотр''',  2 );
...
Рейтинг: 0 / 0
Использование динамического PL/SQL с параметрами блоков данных в Oracle Forms
    #37042226
Magic+
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ya.vypusck,

Условие WHERE заранее не известно, задаётся во внешней системе и сохраняется в отдельной таблице как текст, и эти условия могут быть разными.
...
Рейтинг: 0 / 0
Использование динамического PL/SQL с параметрами блоков данных в Oracle Forms
    #37042256
-=APS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Естественно, что, используя пакет dbms_sql, вы не можете заставить его "понимать" айтемы блока в качестве bind-переменных. Фактически, в такой ситуации вам придется выполнять предварительный разбор запроса - находить переменные в тексте и выполнять их привязку, причем, каким-то образом еще и высняя типы параметров... Может быть, вам проще будет такие проверки выполнять, устанавливая DEFAULT_WHERE для специально созданного "проверяющего" блока (т.к. там можно ссылатьтся на block items в синтаксисе :WORK_ORDER.ATTRIBUTE1)?
...
Рейтинг: 0 / 0
Использование динамического PL/SQL с параметрами блоков данных в Oracle Forms
    #37042289
Magic+
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-=APS=-Естественно, что, используя пакет dbms_sql, вы не можете заставить его "понимать" айтемы блока в качестве bind-переменных. Фактически, в такой ситуации вам придется выполнять предварительный разбор запроса - находить переменные в тексте и выполнять их привязку, причем, каким-то образом еще и высняя типы параметров... Может быть, вам проще будет такие проверки выполнять, устанавливая DEFAULT_WHERE для специально созданного "проверяющего" блока (т.к. там можно ссылатьтся на block items в синтаксисе :WORK_ORDER.ATTRIBUTE1)?
Дак вот не хочется так делать, это для 100 атрибутов поверки писать, индусятиной отдаёт.
...
Рейтинг: 0 / 0
Использование динамического PL/SQL с параметрами блоков данных в Oracle Forms
    #37042314
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Magic+Дак вот не хочется так делать, это для 100 атрибутов поверки писать, индусятиной отдаёт.
А ты думаешь, что твой случай настолько типичен, что разработчики должны были его предусмотреть?
...
Рейтинг: 0 / 0
Использование динамического PL/SQL с параметрами блоков данных в Oracle Forms
    #37042345
-=APS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, CREATE_GROUP_FROM_QUERY не спасёт ли отца русской демократии?
Там, вроде, тоже :BLOCK.ITEM поддерживается.
...
Рейтинг: 0 / 0
Использование динамического PL/SQL с параметрами блоков данных в Oracle Forms
    #37043375
Magic+
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-=APS=-Кстати, CREATE_GROUP_FROM_QUERY не спасёт ли отца русской демократии?
Там, вроде, тоже :BLOCK.ITEM поддерживается.
Отличный ответ. Спасибо большое. Всё получилось.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Использование динамического PL/SQL с параметрами блоков данных в Oracle Forms
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]