powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Oracle Forms
28 сообщений из 28, показаны все 2 страниц
Oracle Forms
    #33164244
Фотография Lilia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Подскажите возможные пути решения следующей задачи:
1.Имеется некая база в файле DBF. Структура таблиц заранее не известна.
Нужно перегнать ее в Oracle.
2. В Oracle Forms нужно создать интерфейс администратора к этой базе, позволяющий редактировать все поля во всех таблицах (каких именно заранее не известно). Т.е. формы генерятся динамически.
Это возможно сделать средствами Oracle? Или все-таки нужно искать другие пути? Все должно работать под Linux.
Спасибо
...
Рейтинг: 0 / 0
Oracle Forms
    #33164356
Фотография Tolmachov Dmitiry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделать, конечно, можно. Только вот что делать?
По п.1 "Перенос БД". Как планируется осуществить перенос из DBF в Oracle? Для этой задачи Forms не нужен вообще. Ручками, только ручками переносить. При этом требуется детальная проработка (возможно переработка) структуры БД и схемы хранения.
По п. 2 "Редактирование любых полей любых таблиц с заранее неопределенными структурами". Так может для этой задачи пользоваться не Forms, а каким-нибудь PL/SQL Developer'ом или SQL Navigator. Они для этой задачки подходят идеально и программировать ничего не надо!
...
Рейтинг: 0 / 0
Oracle Forms
    #33164509
Двоюшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По пункту номер 2:
Теоретически можно зделать на формс...
Блок должен быть основан на From clause query
Создать на фоме грид с 100 или сколько нужно полей

Динамически генерить запрос типа (select * from твоя_таблица)
Код: plaintext
1.
2.
3.
vQuery := '(select * from '|| vTable || ')';
Set_Block_Property('BLOCKNAME',QUERY_DATA_SOURCE_NAME,vQuery);
execute_query;

Узнать сколько полей в таблице (ALL_TAB_COLUMNS или DBA_TAB_COLUMNS), зделать видимими.
Можно также из ALL_TAB_COMMENTS или DBA_TAB_COMMENTS вытянуть коменты и их присвоить Промтам...

И так далее... зависит от фантазии...

---
Ну ты заходи ежели чё...
...
Рейтинг: 0 / 0
Oracle Forms
    #33175388
Фотография Lilia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо "Двоюшник"
Пытаюсь реализовать по вашему совету:

Задаю дата блок вручную при помощи визарда
на From clause query
на триггере вешаю New_Instance_Form
пытаюсь прописать свойства дата блока

Когда запускается форма
Событие New_Instance_Form не успевает сработать
И выдается ошибка FRM-41380: Cannot set blocks query data source.....
...
Рейтинг: 0 / 0
Oracle Forms
    #33175576
Двоюшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Check the form and make sure that the specified block is not a control block and the block status is new.

А какая версия Формсов?

---
Ну ты заходи ежели чё...
...
Рейтинг: 0 / 0
Oracle Forms
    #33175802
Фотография Tolmachov Dmitiry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй сделать не визардом, а ручками. Создаешь блок, ставишь свойство "Query Data Source Type" в "From clause query". В поле "Query Data Source Name" прописываешь запрос. Поле "DML Data Target Name" сбрось в Null. Потом в блоке ручками создай поля (Items) одноименные со столбцами результирующего набора запроса. У полей свойство "Database Item" д.б. "Yes".
Если хочешь программно изменять запрос для блока, то сначала надо его очистить Clear_Block, потом задать запрос Set_Block_Property('BLOCKNAME',QUERY_DATA_SOURCE_NAME,vQuery), потом выполнить его. Порядок именно такой. Режим очистки задаешь по задачке. Если блок основан на запросе, то тебе надо будет писать собственные методы вставки, обновления и удаления данных. Про это отдельно...
...
Рейтинг: 0 / 0
Oracle Forms
    #33175994
Двоюшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tolmachov DmitiryЕсли блок основан на запросе, то тебе надо будет писать собственные методы вставки, обновления и удаления данных. Про это отдельно...
Если запрос вида "select * from your_table" то собственные методы вставки, обновления и удаления данных писать не надо. В свойстве DML Data Target Type -> Table и будет тебе счастье :-)
...
Рейтинг: 0 / 0
Oracle Forms
    #33176672
Фотография Tolmachov Dmitiry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Двоюшник:

Точно. Для простых запросов это подходит. А вот когда уже начинаются соединения таблиц, то уже нет.
...
Рейтинг: 0 / 0
Oracle Forms
    #33178306
Фотография Lilia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо за помощь.
Но проблема осталась...

В Runtime выполняем
Set_Block_Property('BLOCKNAME',QUERY_DATA_SOURCE_NAME,vQuery),
выдается ошибка
FRM-41380: Cannot set blocks query data source

Вот это получается

>Попробуй сделать не визардом, а ручками. Создаешь блок, ставишь свойство "Query Data Source Type" в "From clause query". В поле "Query Data Source Name" прописываешь запрос. Поле "DML Data Target Name" сбрось в Null. Потом в блоке ручками создай поля (Items) одноименные со столбцами результирующего набора запроса. У полей свойство "Database Item" д.б. "Yes".

А здесь он выдает ошибку

>Если хочешь программно изменять запрос для блока, то сначала надо его очистить Clear_Block, потом задать запрос Set_Block_Property('BLOCKNAME',QUERY_DATA_SOURCE_NAME,vQuery), потом выполнить его. Порядок именно такой. Режим очистки задаешь по задачке.
...
Рейтинг: 0 / 0
Oracle Forms
    #33178609
Фотография Tolmachov Dmitiry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привожу код, который работает:

Код: plaintext
1.
2.
3.
4.
go_block('DYNAMIC');
Clear_Block(no_validate);
Set_Block_Property('DYNAMIC',QUERY_DATA_SOURCE_NAME, 
'(select t.custno_, t.invoice_ from sav_i_e_dbf t)');
execute_query;

Всё как я объяснял выше. Для уверенности рекомендую элементы управления, которые рулят содержимым блока, размещать в отдельном блоке.

P.S. Обрати внимание, что запрос находится в скобках
...
Рейтинг: 0 / 0
Oracle Forms
    #33181235
4uBaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Воспользовался вашими советами и вроде у меня тоже получилось динамически заполнить даннами Text Item'ы!!!
Запрос простой выборка из одной таблицы типа select TerminalId, TerminalName from terminals.
Хочу что бы у меня обновления данных происходило автоматически без написания хранимых процедур.
Выставляю у блока DML Data Target Type - Table.
Forms хотят что бы был выставлен Primary Key. Выставляю у одного из полей свойство Primary Key в YES.
Но вот когда я пытаюсь внести изменения или внести новую запись у меня выбрасывает такую ошибку
FRM-40501: ORACLE error: unable to reserve record for update or delete.

Какие варианты дальнейшего развития ситуации?
Мне придеться писать процедуры на обновление и добавление записей или все таки я что то упустил?
...
Рейтинг: 0 / 0
Oracle Forms
    #33182195
Kovalchuk Vitaly V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4uBaKFRM-40501: ORACLE error: unable to reserve record for update or delete.

Какие варианты дальнейшего развития ситуации?
Мне придеться писать процедуры на обновление и добавление записей или все таки я что то упустил?
На блоке создай триггер
ON-LOCK
TEXT =
Код: plaintext
1.
2.
begin
  null;
end;
Или вставь какой нибудь свой код для блокировки записи.
...
Рейтинг: 0 / 0
Oracle Forms
    #33182508
4uBaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to Kovalchuk Vitaly
Спасибо получилось. Теперь я могу изменять данные в Text Item'ах, но вот при
попытке Commit_form выбрасывает такую ошибку.
FRM-40509: ORACLE error: unable to UPDATE record.
В хелпе про нее написано что она выскакивает если такая таблица не существует(это не верно. Таблица присутствует), пользователь не имеет прав на работу с ней(тоже не верно. Таблица создана под этим пользователем) и т.д.
Что за засада за засадой?? Как это побороть?
...
Рейтинг: 0 / 0
Oracle Forms
    #33182795
Фотография Tolmachov Dmitiry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эту ошибка может возникать из-за кучи причин. После ее появления нажми Shift+F1 для получения более подробной информации
...
Рейтинг: 0 / 0
Oracle Forms
    #33182966
Фотография UK0IAI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiliaДобрый день!
Подскажите возможные пути решения следующей задачи:
1.Имеется некая база в файле DBF. Структура таблиц заранее не известна.
Нужно перегнать ее в Oracle.
2. В Oracle Forms нужно создать интерфейс администратора к этой базе, позволяющий редактировать все поля во всех таблицах (каких именно заранее не известно). Т.е. формы генерятся динамически.
Это возможно сделать средствами Oracle? Или все-таки нужно искать другие пути? Все должно работать под Linux.
Спасибо

В заголовке файла DBF в первый 200-200 байтах описана его структура. Это можно прочитать и пропарсить. Затем можно создать с вариантами
а) динамически - таблица БД оракле. и динамический форма - где много полей в рекорде - которые динамически отображат данные строки.

б) деревянный интерфейс - когда в форме делается элемент htree в котором исключительно за счет SQL формируется дерево узлов, где
узел = имена таблиц ,
подузел = имя поля,
строка узла = значение поля.

Тогда надо будет иметь в форме всего Одно (или четыре) айтема для редактирования содержимого поля...бр-р-р
...
Рейтинг: 0 / 0
Oracle Forms
    #33183091
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UK0IAIВ заголовке файла DBF в первый 200-200 байтах описана его структура. Это можно прочитать и пропарсить.

Брррр. Oracle OCA /Open Client Adapter/ + MS ODBC драйвер. Правда EXEC_SQL.DESCRIBE_COLUMN работало с ошибкой на 1-ой колонке, ее просто не замечало. В Forms 6.0, возможно в последних патчах исправили.

Структура таблиц заранее не известна.
Делать на чем угодно, только не на Форм. IMHO. Если нужно забивать гвозди - взять молоток, Forms для этого не лучшее средство.
...
Рейтинг: 0 / 0
Oracle Forms
    #33183102
4uBaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tolmachov DmitiryЭту ошибка может возникать из-за кучи причин. После ее появления нажми Shift+F1 для получения более подробной информации
При нажатие Shift+F1 вот что пишет засранец.
UPDATE Select * from dual SET test=:1 WHERE ROWID=:2

Во первых я прописал программно свойство Query Data Source Name
свой запрос - (select * from terminals)
Select * from dual это перевоначально в Design Mode прописал иначе выдает ошибку
FRM-41380: Cannot set blocks query data source
при попытке программно изменить это свойство.

Так что я упустил? Судя по сообщениям в данном топике мне достаточно было выставить свойство DML Data Target Type -> Table и было бы у меня счастье :))
Почему оно до меня еще не дошло ? Не соображу ни как.
...
Рейтинг: 0 / 0
Oracle Forms
    #33183552
Kovalchuk Vitaly V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4uBaK Tolmachov DmitiryЭту ошибка может возникать из-за кучи причин. После ее появления нажми Shift+F1 для получения более подробной информации
При нажатие Shift+F1 вот что пишет засранец.
UPDATE Select * from dual SET test=:1 WHERE ROWID=:2

Во первых я прописал программно свойство Query Data Source Name
свой запрос - (select * from terminals)
Select * from dual это перевоначально в Design Mode прописал иначе выдает ошибку
FRM-41380: Cannot set blocks query data source
при попытке программно изменить это свойство.

Так что я упустил? Судя по сообщениям в данном топике мне достаточно было выставить свойство DML Data Target Type -> Table и было бы у меня счастье :))
Почему оно до меня еще не дошло ? Не соображу ни как.
По моему ещё надо сделать так
Set_Block_Property(blk1,DML_DATA_TARGET_NAME,'terminals')
...
Рейтинг: 0 / 0
Oracle Forms
    #33183588
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4uBaKВо первых я прописал программно свойство Query Data Source Name
свой запрос - (select * from terminals)
....
выставить свойство DML Data Target Type -> Table и было бы у меня счастье

Почему Table, еслу ты делаеш блок на запросе? Если блок на запросе DML Data Target Type должен быть "FROM clause query".
...
Рейтинг: 0 / 0
Oracle Forms
    #33183595
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sorry ошибся, невнимательно посмотрел пред. посты :=(.

Kovalchuk Vitaly V правильно сказал!
...
Рейтинг: 0 / 0
Oracle Forms
    #33183797
4uBaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мда-а-а-а...
И последнее... А блин как прописать программно значение Column Name для Text Item?
Иначе то смысл теряется в динамическом построение форм.
Есть способы программной привязки text item'ов к полям таблицы?
...
Рейтинг: 0 / 0
Oracle Forms
    #33183966
Фотография UK0IAI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4uBaKМда-а-а-а...
И последнее... А блин как прописать программно значение Column Name для Text Item?
Иначе то смысл теряется в динамическом построение форм.
Есть способы программной привязки text item'ов к полям таблицы?

процедуры COPY и NAME_IN - в хелпе примеры - позволяют программно задавать имена айтемов для чтения/записи в них валуе
...
Рейтинг: 0 / 0
Oracle Forms
    #33183976
Фотография UK0IAI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev UK0IAIВ заголовке файла DBF в первый 200-200 байтах описана его структура. Это можно прочитать и пропарсить.

Брррр. Oracle OCA /Open Client Adapter/ + MS ODBC драйвер. Правда EXEC_SQL.DESCRIBE_COLUMN работало с ошибкой на 1-ой колонке, ее просто не замечало. В Forms 6.0, возможно в последних патчах исправили.

Структура таблиц заранее не известна.
Делать на чем угодно, только не на Форм. IMHO. Если нужно забивать гвозди - взять молоток, Forms для этого не лучшее средство.

Я говорил про ...шлюз к DBF - когда DBF есть произвольный файл. И мы читая заголовок - можем выкинуть в интерфейс имена полян. И на затем автомате прочитать с DBF то что нужно. 100% универсально. Затем , на лету, можно создавать таблицы в ОРАКЛЕ и к ним делать формы. Для задач администрирования - достаточно иметь доступ все к одной строке, а не к гриду.
...
Рейтинг: 0 / 0
Oracle Forms
    #33184486
4uBaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UK0IAI 4uBaKМда-а-а-а...
И последнее... А блин как прописать программно значение Column Name для Text Item?
Иначе то смысл теряется в динамическом построение форм.
Есть способы программной привязки text item'ов к полям таблицы?

процедуры COPY и NAME_IN - в хелпе примеры - позволяют программно задавать имена айтемов для чтения/записи в них валуе

Нужно не задавать имена айтемов, а привязывать их к полям ( Свойство Column Name). Это две разных весчи.
...
Рейтинг: 0 / 0
Oracle Forms
    #33184711
Фотография Tolmachov Dmitiry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задавать имена полей (Name property) в блоке , а также Column Name, программно нельзя! В этом вся и загвоздка. Можно накидать в блок полей типа key, value1, value2 и т.д., выполнять запрос типа Select id as key, fio as value1 from person.
Но тогда отвалиться процесс обновления, так как форма будет пытаться выполнить команду Update person Set value1 = <...> вместо Update person Set fio = <...>. Поэтому в этой ситуации можно предложить в качестве возможного решения написать триггер ON-UPDATE, в котором, используя динамический SQL, обновлять поля.
...
Рейтинг: 0 / 0
Oracle Forms
    #33184965
4uBaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tolmachov DmitiryЗадавать имена полей (Name property) в блоке , а также Column Name, программно нельзя! В этом вся и загвоздка. Можно накидать в блок полей типа key, value1, value2 и т.д., выполнять запрос типа Select id as key, fio as value1 from person.
Но тогда отвалиться процесс обновления, так как форма будет пытаться выполнить команду Update person Set value1 = <...> вместо Update person Set fio = <...>. Поэтому в этой ситуации можно предложить в качестве возможного решения написать триггер ON-UPDATE, в котором, используя динамический SQL, обновлять поля.

Да-а-а-а... На это я вчера наткнулся..
Блин грустно :(
Придется корячиться и писать процедуры на вставки и обновления :((
Абидна..
...
Рейтинг: 0 / 0
Oracle Forms
    #33185278
Фотография UK0IAI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4uBaK Tolmachov DmitiryЗадавать имена полей (Name property) в блоке , а также Column Name, программно нельзя! В этом вся и загвоздка. Можно накидать в блок полей типа key, value1, value2 и т.д., выполнять запрос типа Select id as key, fio as value1 from person.
Но тогда отвалиться процесс обновления, так как форма будет пытаться выполнить команду Update person Set value1 = <...> вместо Update person Set fio = <...>. Поэтому в этой ситуации можно предложить в качестве возможного решения написать триггер ON-UPDATE, в котором, используя динамический SQL, обновлять поля.

Да-а-а-а... На это я вчера наткнулся..
Блин грустно :(
Придется корячиться и писать процедуры на вставки и обновления :((
Абидна..

тут нет ничего сложного (в дбф-е всего 4 типа данных). Поэтому, данные одной строки всегда могут быть помещены в одномерный массив символьного типа.

Поэтому все что вам нужно - это сделать свой "переходник" что при чтении строки из БД (ораклы уже) сразу помещает их в одномерный символьный массив. (в динамическом sql - этакий парсер свой)

И ваша задача - в Формсе - научиться демострировать "ячейки" массива в соотвествущих Айтемах, имеющих тупую нотацию ...типа фиелд_1, фиелд_2.... где индекс в имени фиелда совпадает с номером элемента массива. Тут то и используются функции copy и name_in... при момощи которых можно все в три строки цикла - все перегонять все валуе.

После этого, у вас будет обратнаяч задача - считать айтемы (в цикле) и запихать валуе в другой одномерный массив. И уже изх него - в динамическом SQL реализовать процедуру update/insert. Все надо знать для этого - структуры таблицы БД из словарей.

Мы (давно) делали эту тему - наши условия ЕЩЕ хуже были...пришлось строить Генератор БД, что генерил спец_листинги включенные в модули как инклюды. И все компилировалось. А потом - САМО все работало - универсальный доступ к данным любой таблицы БД в универсальном интерфейсе. В Оракле - все легче, ибо есть динамич SQL.
...
Рейтинг: 0 / 0
Oracle Forms
    #33185720
Фотография UK0IAI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что мне видно занятся было нечем :-) ....вот скрипт что читает данные любой таблицы и выводит их на экран . В моем случае я жестко прописал имя табло = SYS.ALL_TABLES

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
CREATE OR REPLACE PROCEDURE TST_SQL IS

  STMT_STR VARCHAR2( 4000 );
  PRN_STR VARCHAR2( 4000 );
  
  CUR_HDL INT;
  ROWS_PROCESSED INT;
  
  TABLE_NAME VARCHAR2( 30 );
  OWNER VARCHAR2( 30 );
  
  COLUMN_NAME VARCHAR2( 30 );
  
  TYPE REC IS RECORD
  (
      COLUMN_NAME VARCHAR2( 30 ) -- РАЗМЕРНОСТЬ НАДО УТОЧНЯТЬ ДЛЯ DBF
  );
  TYPE  T_REC  IS TABLE OF REC  INDEX BY BINARY_INTEGER;
  
  LIST_COLUMN  T_REC ;  --МАССИВ С ИМЕНАМИ ПОЛЕЙ И ГДЕ БУДУТ ЛЕЖАТЬ САМИ ВАЛУЕ
  
  NUM_COL  INTEGER;     
  CUR_COL  INTEGER;
  END_STR  VARCHAR2( 4 ) :=', ';
  
BEGIN


DBMS_OUTPUT.PUT_LINE ('==');
DBMS_OUTPUT.PUT_LINE ('== СПИСОК ПОЛЕЙ ТАБЛИЦЫ');
DBMS_OUTPUT.PUT_LINE ('==');
CUR_HDL := DBMS_SQL.OPEN_CURSOR; -- OPEN CURSOR 

STMT_STR := 
'SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS 
WHERE TABLE_NAME = :T_NAME';

DBMS_OUTPUT.PUT_LINE (STMT_STR);


DBMS_SQL.PARSE(CUR_HDL, STMT_STR, DBMS_SQL.NATIVE); 
-- SUPPLY BINDS (BIND BY NAME) 
DBMS_SQL.BIND_VARIABLE(CUR_HDL, 'T_NAME', 'ALL_TABLES');  -- ПРОПИСАЛ ИМЯ ТАБЛИЦЫ -- А МОЖНО ПЕРЕДАВАТЬ КАК ПАРАМЕТР
-- DESCRIBE DEFINES 
DBMS_SQL.DEFINE_COLUMN(CUR_HDL,  1 , COLUMN_NAME,  200 ); 
ROWS_PROCESSED := DBMS_SQL.EXECUTE(CUR_HDL); 
-- EXECUTE 
NUM_COL := 0 ;
LOOP 
  -- FETCH A ROW 
  
  IF DBMS_SQL.FETCH_ROWS(CUR_HDL) >  0  THEN 
    -- FETCH COLUMNS FROM THE ROW 
    DBMS_SQL.COLUMN_VALUE(CUR_HDL,  1 , COLUMN_NAME); 
    NUM_COL := NUM_COL +  1 ;
    

    LIST_COLUMN(NUM_COL).COLUMN_NAME := COLUMN_NAME;
    DBMS_OUTPUT.PUT_LINE (LIST_COLUMN(NUM_COL).COLUMN_NAME||'--ПОЛЯ ТАБЛИЦЫ');
 ELSE
    EXIT; 
 END IF; 
END LOOP; 
DBMS_SQL.CLOSE_CURSOR(CUR_HDL); -- CLOSE CURSOR

--ЗАКОНЧИЛИ ОПРЕДЕЛЬ СПСИОК ПОЛЕЙ И НАЧНЕМ ЧИТАТЬ ДАННЫЕ
--СТРОКИ ТАБЛИЦЫ БУДУТ ЛЕЖАТЬ В ТОМ ЖЕ МАССИВЕ LIST_COLUMN()


CUR_HDL := DBMS_SQL.OPEN_CURSOR; -- OPEN CURSOR 




-- В МАССИВЕ LIST_COLUMN УЖЕ НАХОДИТСЯ СПИСОК ПОЛЕЙ ТАБЛИЦЫ 

-- ГЕНЕРИМ СЕЛЕКТ ДЛЯ ЗАППРОСА ПОЛЕЙ

STMT_STR := 'SELECT ';

NUM_COL :=  5 ; --ОГРАНИЧИМ ДЛЯ УДОБСТВА 5 ПОЛЯМИ

FOR I IN  1 ..NUM_COL LOOP
    IF I < NUM_COL THEN
       STMT_STR := STMT_STR || LIST_COLUMN(I).COLUMN_NAME|| END_STR;
    ELSE
       STMT_STR := STMT_STR || LIST_COLUMN(I).COLUMN_NAME|| ' ';
    END IF;   
END LOOP;



STMT_STR := STMT_STR || ' FROM ALL_TABLES 
WHERE OWNER <> :P_NAME';

DBMS_OUTPUT.PUT_LINE ('==');
DBMS_OUTPUT.PUT_LINE ('== SQL ЗАПРОСА К ТАБЛИЦЕ');
DBMS_OUTPUT.PUT_LINE ('==');

DBMS_OUTPUT.PUT_LINE (STMT_STR);
DBMS_OUTPUT.PUT_LINE ('==');



DBMS_SQL.PARSE(CUR_HDL, STMT_STR, DBMS_SQL.NATIVE); 
-- SUPPLY BINDS (BIND BY NAME) 
DBMS_SQL.BIND_VARIABLE(CUR_HDL, 'P_NAME', 'SYS'); 
-- DESCRIBE DEFINES 

-- В ЦИКЛЕ ОПРЕДЕЛЯЕМ КОЛОНКИ

FOR I IN  1 ..NUM_COL LOOP
    -- DBMS_SQL.DEFINE_COLUMN(CUR_HDL, 1, TABLE_NAME, 200); 
    -- DBMS_SQL.DEFINE_COLUMN(CUR_HDL, 2, OWNER, 200); 
    DBMS_SQL.DEFINE_COLUMN(CUR_HDL, I, LIST_COLUMN(I).COLUMN_NAME, 200 );
    
    
END LOOP;


DBMS_OUTPUT.PUT_LINE ('==');
DBMS_OUTPUT.PUT_LINE ('== ДАНЫЕ СТРОК ТАБЛИЦЫ ');
DBMS_OUTPUT.PUT_LINE ('==');


ROWS_PROCESSED := DBMS_SQL.EXECUTE(CUR_HDL); 
-- EXECUTE 
LOOP 
  -- FETCH A ROW 
  IF DBMS_SQL.FETCH_ROWS(CUR_HDL) >  0  THEN 
    -- FETCH COLUMNS FROM THE ROW 
    
    --ЧИТАЕМ РЕКОРД В МАССИВ LIST_COLUMN()
    FOR I IN  1 ..NUM_COL LOOP

    --DBMS_SQL.COLUMN_VALUE(CUR_HDL, 1, OWNER); 
    --DBMS_SQL.COLUMN_VALUE(CUR_HDL, 2, TABLE_NAME); 
    --DBMS_OUTPUT.PUT_LINE (OWNER ||'--'|| TABLE_NAME);
 
       DBMS_SQL.COLUMN_VALUE(CUR_HDL, I, LIST_COLUMN(I).COLUMN_NAME);
    END LOOP;

    -- ЦИКЛ ЧИСТО ДЛЯ ВЫВОДА ВАЛУЕ НА ЭКРАН
    PRN_STR := '';
    FOR I IN  1 ..NUM_COL LOOP

        PRN_STR := PRN_STR ||  LIST_COLUMN(I).COLUMN_NAME || ',  ';
    END LOOP;
    DBMS_OUTPUT.PUT_LINE (PRN_STR); 
    -- КОНЕЦ ВЫВОДА НА ЭКРАН
  ELSE
     EXIT; 
  END IF; 
END LOOP; 
DBMS_SQL.CLOSE_CURSOR(CUR_HDL); -- CLOSE CURSOR
  
END TST_SQL;

ЗАПУС ПРОЦЕДУРЫ В PL/SQL DEVELOPOER В ОКНЕ ТЕСТА

Begin
-- Call the procedure
tst_sql;
end;
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Oracle Forms
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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