Oracle Apex - возникла ошибка виртуального столбца - PullRequest
0 голосов
/ 24 августа 2018

В настоящее время я работаю в Oracle Application Express 18.1.0.00.45 и получаю ошибку, которую не понимаю.

Я создал интерактивную сетку, используя следующий запрос:

select periodic_topics_id, filter, topic,
CASE 
WHEN LINK1 like '%116%' then LINK1||:APP_SESSION 
ELSE LINK1
END AS LINK1
From periodic_topics
where meeting like :P31_MEETING_DESC
and
(nvl(:P31_FILTER,'0') = '0' or instr(:P31_FILTER||':',filter||':') > 0) 

В таблице в базе данных столбец period_topics_id является первичным ключом, и он автоматически заполняется при добавлении новой строки в таблицу с использованием следующего триггера:

create or replace TRIGGER periodic_topics_trigger
BEFORE INSERT ON periodic_topics
FOR EACH ROW
BEGIN
:new.periodic_topics_id := periodic_topics_seq.nextval;
END;

В приложении APEX link1 является текстовым полем, а в разделе «Ссылка» свойств этого столбца «Target» имеет тип URL, а URL - & LINK1. Я также указал в приложении APEX, что period_topics_id является первичным ключом. Это свойства столбца ссылок, на которые я ссылаюсь:

enter image description here

Проблема: когда я вручную вставляю значение в ячейку в столбце «LINK1» интерактивной сетки, возникает ошибка, которая говорит:

"• Ajax-вызов вернул ошибку сервера. ORA-20987: APEX - обработать« Периодические разделы - сохранить данные интерактивной таблицы »,« ORA-01733: виртуальный столбец здесь запрещен »во время выполнения команды DML. Эта ошибка может возникать, если Столбец основан на агрегации или выражении SQL. Установите для атрибута столбца «Только запрос» значение Да, чтобы исключить столбец из оператора INSERT и UPDATE. - Обратитесь к администратору приложения. for. "

Однако, если я создаю интерактивную сетку, используя тот же запрос, но без оператора case, у меня не будет проблем с добавлением ссылки в интерактивную сетку. Ошибка не возникает. Другими словами, при попытке добавить значение в столбец «Link1» в интерактивной сетке не возникает ошибка, если я создаю интерактивную сетку, используя следующий запрос:

select periodic_topics_id, filter, topic, link1
From periodic_topics
where meeting like :P31_MEETING_DESC
and
(nvl(:P31_FILTER,'0') = '0' or instr(:P31_FILTER||':',filter||':') > 0)

Только к вашему сведению, мне нужно, чтобы в запросе была указана ситуация, потому что некоторые ссылки будут перенаправлять пользователя на внешние веб-сайты, а другие - на другую страницу приложения. Без конкатенации оператора case: APP_SESSION к ссылке пользователь вынужден снова входить в приложение всякий раз, когда он щелкает ссылку, которая направляет его на другую страницу приложения.

Кто-нибудь знает, почему ошибка возникает, когда оператор case находится в запросе, а не когда оператор case отсутствует в запросе?

Заранее спасибо.

1 Ответ

0 голосов
/ 24 августа 2018

На мой взгляд, это известная проблема , которая восходит к табличным формам (TF) (в то время как интерактивная сетка (IG) является ее расширенной версией). Насколько я могу судить, вы не можете / не можете создать TF / IG, используя запрос с объединениями или сфабрикованных столбцов - тот, который вы создали с помощью CASE. Зачем? Потому что у Apex есть трудности в понимании того, как манипулировать такими данными.

Соединения обычно используются в ситуациях, подобных таблице EMP Скотта, когда вы хотите отобразить DEPTNO вместе с названием отдела (DNAME), но оно сохраняется в таблице DEPT. Регистрация - это естественный выбор, но он не будет работать. Решение состоит в том, чтобы создать функцию, которая возвращает такое значение. И, конечно, это не может быть enterable .

Точно так же, в вашем случае, вы на самом деле можете использовать CASE, но вам придется установить для него "только запрос" (как предложено) и использовать его для отображения, Тогда у вас должен быть «оригинальный» столбец LINK (база данных), который будет доступен для ввода.

По сути, макет будет выглядеть так:

PERIODIC_TOPICS_ID  FILTER  TOPIC  LINK  LINK_DESCRIPTION
------------------  ------  -----  ----  -------------------------
<-------  enterable columns  --------->  <- your CASE construct ->

Пользователи будут щелкать столбец LINK_DESCRIPTION, который приведет их к URL, а вы будете использовать LINK для ввода / обновления значения этого столбца.

...