Проблема с виртуальными столбцами в Oracle Forms - PullRequest
0 голосов
/ 13 января 2019

У меня есть интерфейс, созданный с помощью Oracle Forms. У него есть base table block, в котором есть поле (а именно col3 " имеет то же имя, что и столбец таблицы, полученный из ").

Форма имеет два других поля col1 и col2 числового типа, и эти поля также являются членами той же таблицы, имеющей столбец col3, упомянутый выше.

Я преобразовал col3 в виртуальный столбец как сумму столбцов col1 и col2 в определении таблицы (col3 number generated always as (nvl(col1,0)+nvl(col2,0)) virtual)

Когда я пытаюсь зафиксировать изменения в базовой таблице, появляется сообщение об ошибке

ORA-54013: Операция INSERT запрещена для виртуальных столбцов

Я знаю, что применять DML к виртуальному столбцу не имеет смысла, но даже я изменил поле col3

  • Query Only свойство от No до Yes

  • Update Allowed свойство от Yes до No

  • Insert Allowed свойство от Yes до No

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

Есть ли у вас идеи, как я могу решить эту проблему, не отказываясь от структуры base table block? ( Я использую версию Fusion Middleware 11g )

1 Ответ

0 голосов
/ 14 января 2019

Поскольку все, что вы делаете с этим столбцом, это запрос , как насчет того, чтобы установить для него столбец без базы данных? Это потребует написания триггера POST-QUERY, в противном случае вы не увидите его значение после выполнения запроса.

:block.col3 := :block.col1 + :block.col2;

Поместите один и тот же код в триггеры WHEN-VALIDATE-ITEM на элементах :block.col1 и :block.col2, чтобы можно было рассчитать результат при вставке / обновлении значений.

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

...