Apex html in sql

Apex html in sql

An item is part of an HTML form such as a checkbox, date picker, file browse field, popup list of values (LOV), select list, shuttle, flip toggle switch, text field, text area, and so on.

When defining an item, developers must follow defined naming conventions and follow specific rules when referencing item values stored in session state.

  • About the Differences Between Page Items and Application Items
    Page items are placed on a page and have associated user interface properties and Application items are not associated with a page.
  • About Item Naming Conventions
    When creating an item name, developers must follow very specific item naming conventions.
  • Referencing Item Values
    You can reference item values stored in session state in regions, computations, processes, validation, and branches.
  • About Referencing Items Using JavaScript
    When you reference an item, the best approach is to reference by ID.
  • Working with Multiple Select List Item
    Learn how to handle values returned from a multiple select list item.

13.1.1.1 About the Differences Between Page Items and Application Items

Page items are placed on a page and have associated user interface properties and Application items are not associated with a page.

Читайте также:  Sql timestamp java type

There are two types of items: page items and application items. Page items are placed on a page and have associated user interface properties, such as Display Only, Label and Label Template. Examples of page items include a checkbox, date picker, display as text, file browse field, popup list of values, select list, or a text area. In contrast Application items are not associated with a page and therefore have no user interface properties. You can use an application item as a global variable.

13.1.1.2 About Item Naming Conventions

When creating an item name, developers must follow very specific item naming conventions.

When specifying an item name, remember the following rules. Item names must:

  • Be unique within an application.
  • Not include quotation marks.
  • Begin with a letter or a number, and subsequent characters can be letters, numbers, or underscore characters.
  • Be case-insensitive.
  • Should not exceed 30 characters. Items longer than 30 characters cannot be referenced using bind variable syntax. See «Referencing Session State Using Bind Variable Syntax.»
  • Cannot contain letters outside the base ASCII character set.

As a best practice Oracle recommends including the page number when naming items. By default, wizards prefix page item names with P _ (for example, P1_NAME) .

13.1.1.3 Referencing Item Values

You can reference item values stored in session state in regions, computations, processes, validation, and branches.

Table 13-1 describes the supported syntax for referencing item values.

Table 13-1 Syntax for Referencing Item Values

Standard bind variable syntax for items whose names are no longer than 30 bytes. Use this syntax for references within a SQL query and within PL/SQL code.

PL/SQL syntax referencing the item value using the V function. Use this syntax in PL/SQL code of packages or stored procedures and functions.

Avoid this syntax in SQL statements. It may result in performance problems.

Standard PL/SQL syntax referencing the numeric item value using the NV function. Use this syntax in PL/SQL code of packages or stored procedures and functions.

Avoid this syntax in SQL statements. It may result in performance problems.

Static text. Exact Substitution.

Note : Exact substitution syntax should be avoided in SQL or PL/SQL code because it can result in SQL Injection vulnerabilities.

You can set the value of an item in your application using any of the following methods:

  • For page items, use the Source Attribute to set the item value. From the page, select the item name to view the Edit Page Item page. Scroll down to Source and edit the appropriate fields. You can also set the value of an item in any region based on PL/SQL or a process using the following syntax:
BEGIN :MY_ITEM := 'new value'; END;
f?p=100:101:10636547268728380919::NO::MY_ITEM:ABC
TO_CHAR(SYSDATE,'Day DD Month, YYYY');
APEX_UTIL.SET_SESSION_STATE('MY_ITEM',SYSDATE);

13.1.1.4 About Referencing Items Using JavaScript

When you reference an item, the best approach is to reference by ID.

If you view the HTML source of an Oracle Application Express page in a web browser, you would notice that all items have an id attribute. This ID corresponds to the name of the item, not the item label. For example, if you create an item with the name P1_FIRST_NAME and a label of First Name , the ID is P1_FIRST_NAME .

You can get and set item attributes and values using the JavaScript functions $v(‘P1_FIRST_NAME’) and $s(‘P1_FIRST_NAME’, ‘Joe’); . Consider the following example:

function showFirstName()< alert('First Name is ' +$v('P1_FIRST_NAME')) >; function setFirstName(pFirstName)< $s('P1_FIRST_NAME', pFirstName); >;

These functions can be called by other JavaScript functions or with the Execute JavaScript code dynamic action.

13.1.1.5 Working with Multiple Select List Item

Learn how to handle values returned from a multiple select list item.

13.1.1.5.1 About Handling Values Returned from a Multiple Select List Item

A multiple select item renders as a multiple select list form element which can be either a Multiselect List or Shuttle item type. When submitted, selected values are returned in a single colon-delimited string. You can handle values in this format in three ways:

  • Using the INSTR function
  • Using the APEX_STRING.SPLIT function
  • Creating a shuttle

13.1.1.5.2 Using APEX_UTIL.STRING_TO_TABLE to Convert Selected Values

Suppose you had a report on the EMP and DEPT tables that is limited by the departments selected from a Department multiple select list. First, you create the multiple select item, P1_DEPTNO, using the following query:

SELECT dname, deptno FROM dept

Second, you return only those employees within the selected departments as follows:

SELECT ename, job, sal, comm, dname FROM emp e, dept d WHERE d.deptno = e.deptno AND instr(':'||:P1_DEPTNO||':',':'||e.deptno||':') > 0

Next, assume you want to programmatically step through the values selected in the multiple select item, P1_DEPTNO. To accomplish this task, convert the colon-delimited string into a PL/SQL array using the apex_string.split function. The following example demonstrates how to insert the selected departments into an audit table containing the date of the query.

DECLARE l_selected apex_t_varchar2; BEGIN -- -- Convert the colon separated string of values into -- a PL/SQL array l_selected := apex_string.split( p_str => :P1_DEPTNO, p_sep => ':' ); -- -- Loop over array to insert department numbers and sysdate -- FOR i IN 1..l_selected.count LOOP INSERT INTO report_audit_table (report_date, selected_department) VALUES (sysdate, l_selected(i)); END LOOP; END;

Источник

APEX: Почему использование HTML в составе SQL-запросов для Interactive Report может быть опасно?

Почему использование HTML в составе SQL-запросов для Interactive Report может быть опасно? Посмотрите на скриншоты! Неострожное использование HTML может повлечь за собой неочевидные на первый взгляд проблемы:

Проблема 1: С точки зрения бизнес-пользователя отфильтрованные строки не содержат слова «default» (это слово содержится внутри HTML-тега)
Проблема 2: При фильтрации по статусу вместо понятного пользователю текста он получает HTML-выражение, которое выглядит для него как абракадабра

Экспорт тоже выглядит ужасно.
Как лучше все поправить?

Сначала следует обратить внимание на разделение слоя бизнес-логики и слоя представления (presentation tier). В слое бизнес-логики не должно быть ничего относящегося к отображению информации, особенно HTML.

Сначала взглянем на исходный запрос в Interactive Report.

Представление “v_cost_report” возвращает столбец status в виде HTML. Использование HTML в представлениях(view) является плохой практикой, так как это значительно затрудняет дальнейшее использование представления в других представлениях и PL/SQL процедурах, особенно при попытке выборки или связывания с другими таблицами с использованием этого столбца.
Для корректного разделение логики на слои необходимо вынести выражение, возвращающее HTML, на уровень Апекса.

CREATE OR REPLACE FORCE VIEW v_cost_report AS SELECT p.id, p.project, p.task_name, ‘’ status, p.assigned_to, p.status as status_desc, p.cost, p.BUDGET FROM eba_demo_ir_projects p; 
CREATE OR REPLACE FORCE VIEW v_cost_report AS SELECT p.id, p.project, p.task_name, p.status_no status, p.assigned_to, p.status as status_desc, p.cost, p.BUDGET FROM eba_demo_ir_projects p; 

Апекс относится к слою представления (presentation tier), поэтому на этом уровне нет подобных строгих ограничений. HTML в SQL-запросах может ограниченно использоваться, однако, лучше всего избегать непосредственного использования подобных возвращающих HTML столбцов в Interactive Reports. Эти столбцы должны быть скрыты, а возвращаемые ими результаты должны быть показаны не напрямую, а с использованием свойства “HTML Expression” в других столбцах.
Это означает, что нам нужно 2 столбца вместо одного, первый для HTML и второй для текстового описания.

В нашем примере столбец “Status” возвращает номер (ID), который идентифицирует соответствующий статус. Мы используем LOV (список значений), чтобы вместо ID показать текстовое описание, которое будет использоваться для поиска, фильтрации и экспорта.
Другой столбец, “STAT_IMAGE”, будет использоваться для соответствующей каждому статусу картинки.
Мы можем просто использовать DECODE или CASE в SQL для выбора нужного изображения, но более корректным является использование статического списка (Static LOV), особенно при большом возможном количестве значений. С помощью удобного табличного редактора списков (Grid Edit) их создание и редактирование значительно упрощается.

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

Теперь нужно установить необходимые свойства столбца “STAT_IMAGE”.
Сначала необходимо изменить свойство Display Type столбца на Hidden. Таким образом, тот столбец не будет выводиться на экран или экспортироваться. Поиск по значению этого столбца теперь тоже запрещён.

Теперь поработаем над со столбцом “Status”.
Этот столбец должен выводиться на экран. Для того, чтобы вместо кода статуса выводилось текстовое описание, изменим Display Type столбца на Display as Text (based on LOV, escape special characters).
Список значений STATUS_DESCRIPTION содержит следующие статусы:

Теперь столбец показывает текстовые описания статусов, но нам-то вместо этого нужны картинки. Воспользуемся замечательной функциональностью HTML Expression, которая появилась в Апекс 4.1. Мы можем использовать шаблон #ИМЯ_СТОЛЦА# для показа значений как текущего так и других столбцов в HTML-выражении.

Здесь в примере мы используем HTML Expression для показа в столбце значения другого столбца, “STAT_IMAGE”. Дополнительный тег title нужен для отображения всплывающей подсказки с описанием статуса.
Чистый HTML и #COLUMN#-синтаксис выглядит и читается гораздо лучше чем при использовании внутри SQL, кроме того, отпадает нужда в дополнительном экранировании кавычек.
HTML Expression используется только для вывода текста и HTML в браузер. Для поиска, фильтрации в выпадающих списках используются оригинальные значения столбца.

Экспорт также выполняется корректно.

Итог: корректный дизайн WEB-приложений, разделение между слоями и корректное использование функциональностей Апекса позволяет улучшить жизнь разработчику и избежать множества скрытых потенциальных ошибок при поиске, экспорте, фильтрации и т.д. Делайте всё сразу правильно, и это вам зачтётся….

Источник

Оцените статью