В посте рассматривается краткий обзор среды разработки Oracle APEX, пошаговая инструкция установки и настройки APEX версии 20.2 и ORDS версии 20.3 на Oracle Database 18c Express Edition.
Краткий обзор среды
разработки APEX.
Oracle Application Express (APEX) – это low-code платформа для разработки функциональных, масштабируемых и безопасных web-приложений. На сегодняшний день последней актуальной версией APEX является Oracle APEX 20.2. Данная версия выпущена в октябре 2020 года. Для установки и работы с APEX 20.2 в Oracle Database 18c Express Edition необходимо понимать принцип работы новой опции Oracle Database – Multitenant. Начиная с Oracle Database 12с поддерживается новая архитектура – Multitenant, которая предоставляет возможность использовать множество баз данных для консолидации их в составе единой и главной базы данных. Такое объединение упрощает задачи администрирования баз данных. Единая и главная база данных используется в качестве платформы и называется контейнерная база данных (Container Database – CDB), а база данных из множества работающих в составе контейнерной базы данных называется подключаемой базой данных (Pluggable Database – PDB). Архитектура Multitenat позволяет создать в Oracle Database 18с Express Edition одну CDB базу и до трех PDB баз. По умолчанию в Oracle Database 18с Express Edition APEX отсутствует. В связи с этим, для установки и работы с APEX необходимо подключиться к PDB и выполнять установку и настройку APEX. Ниже пошагово описывается процесс установки и настройки APEX 20.2 и Oracle REST Data Services версии 20.3 (далее ORDS) на Oracle Database 18c Express Edition, работающей на виртуальной машине под управлением операционной системы Oracle Linux. При использовании APEX 20.2 минимальная версия ORDS должна быть 19.1. Нижеописанные шаги также будут работать с Oracle Database 18c Express Edition установленной на операционную систему Windows.
Для информации: Кроме установки и использования платформы Oracle APEX на локальном компьютере, также есть возможность установить и использовать ее для разработки веб-приложений на бесплатном сервисе Always Free Service облака Oracle или же запросить и настроить свое рабочее пространство в бесплатном облачном сервисе apex.oracle.com. В данном посте рассматривается установка и доступ к среде разработки APEX на локальном компьютере.
Установка Oracle APEX 20.2. Предполагается, что есть успешно установленная Oracle Database 18c Express Edition. При необходимости, можно установить Oracle Database 18c Express Edition, используя следующие материалы: Установка Oracle Database 18c Express Edition на Linux и Установка Oracle Database 18c Express Edition на Windows. В посте подключение к PDB описываются различные способы подключения и работы в PDB.
Шаг 1. Установка
APEX на
Oracle Database 18c Express Edition
Oracle APEX распространяется бесплатно и установочный файл можно скачать с официального сайта Oracle – https://www.oracle.com/tools/downloads/apex-downloads.html
Для скачивания на портале Oracle необходимо наличие учетной записи с паролем. При ее отсутствии осуществляется регистрация новой учетной записи.
Пройдя по ссылке, выбирается версия Oracle APEX 20.2 – All languages.
После ознакомления и принятия условий лицензирования необходимо поставить галочку в разделе I reviewed and accept the Oracle License Agreement.
Нажать на «Download apex_20_2.zip». Запускается скачивание zip архива (apex_20.2.zip). Объем архива 228 Мб.
После завершения скачивания архив apex_20.2.zip нужно скопировать в директорию /home/oracle/ операционной системы Oracle Linux, работающей на виртуальной машине. Выполняется разархивирование файла и проверка содержимого архива:
[oracle@dushanbe ~]$ pwd /home/oracle [oracle@dushanbe ~]$ ls apex_20.2.zip Desktop Documents Downloads Music Pictures Public Templates Videos [oracle@dushanbe ~]$ ls -l apex_20.2.zip -rw-rw-rw-. 1 oracle oracle 239868057 Jan 14 22:50 apex_20.2.zip [oracle@dushanbe ~]# unzip apex_20.2.zip [oracle@dushanbe ~]$ ls apex apex_20.2.zip Desktop Documents Downloads Music Pictures Public Templates Videos [oracle@dushanbe ~]$ cd apex [oracle@dushanbe apex]$ pwd /home/oracle/apex [oracle@dushanbe apex]$ ls apexins1.sql apex_rest_config_cdb.sql apxdevrm_cdb.sql apxexit.sql apxremov_nocdb.sql apxrtins_nocdb.sql core dbcsins.sql apexins2.sql apex_rest_config_core.sql apxdevrm_nocdb.sql apxpatch_cdb.sql apxremov.sql apxrtins.sql coreins2.sql devins.sql apexins3.sql apex_rest_config_nocdb.sql apxdevrm.sql apxpatch_nocdb.sql apxrtins1.sql apxsdoins.sql coreins3.sql images apexins_cdb.sql apex_rest_config.sql apxdvins_cdb.sql apxpatch.sql apxrtins2.sql apxsilentins.sql coreins4.sql load_trans.sql apexins_cdb_upg.sql appins.sql apxdvins_nocdb.sql apxremov1.sql apxrtins3.sql apxupgrd.sql coreins5.sql utilities apexins_nocdb.sql apxappcon.sql apxdvins.sql apxremov2.sql apxrtins_cdb.sql builder coreins.sql apexins.sql apxchpwd.sql apxdwngrd.sql apxremov_cdb.sql apxrtins_cdb_upg.sql catapx.sql dbcsconf.sql [oracle@dushanbe apex]$
После разархивирования создалась папка apex с множеством sql скриптов для создания и настройки APEX. Необходимо из директории со скриптами (/home/oracle/apex/) подключиться к PDB XEPDB1 и начать установку APEX:
[oracle@dushanbe apex]$ sqlplus sys as sysdba SQL*Plus: Release 18.0.0.0.0 - Production on Sat Aug 8 11:21:28 2020 Version 18.4.0.0.0 Copyright (c) 1982, 2018, Oracle. All rights reserved. Enter password: Connected to: Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production Version 18.4.0.0.0 SQL> show pdbs;CON_ID CON_NAME OPEN MODE RESTRICTED
--------------------------------------2 PDB$SEED READ ONLY NO
3 XEPDB1 READ WRITE NO
SQL> alter session set container = XEPDB1; Session altered. SQL> show pdbs;CON_ID CON_NAME OPEN MODE RESTRICTED
--------------------------------------3 XEPDB1 READ WRITE NO
SQL>
Подключение к XEPDB1 прошло успешно. Запускается скрипт apexins.sql для установки APEX со следующим синтаксисом:
@apexins.sql tablespace_apex tablespace_files tablespace_temp images
где, tablespace_apex – название табличного пространства для пользователя приложения APEX. tablespace_files – название табличного пространства для пользователя файлов APEX. tablespace_temp – название временного табличного пространства. images – виртуальная директория для изображений APEX. Для обеспечения корректного обновления APEX в будущем необходимо задать значение для этого параметра равное /i/.
Скрипт apexins.sql запускается со следующими значениями параметров:
SQL> @apexins.sql SYSAUX SYSAUX TEMP /i/ ... <Эта часть лога не приведена> ... # Actions in Phase 3: # ok 1 - BEGIN | 0.00 ok 2 - Computing Pub Syn Dependents | 0.00 ok 3 - Upgrade Hot Metadata and Switch Schemas | 0.00 ok 4 - Removing Jobs | 0.00 ok 5 - Creating Public Synonyms | 0.03 ok 6 - Granting Public Synonyms | 0.10 ok 7 - Granting to FLOWS_FILES | 0.00 ok 8 - Creating FLOWS_FILES grants and synonyms | 0.02 ok 9 - Creating Jobs | 0.00 ok 10 - Creating Dev Jobs | 0.00 ok 11 - Installing FLOWS_FILES Objects | 0.00 ok 12 - Installing APEX$SESSION Context | 0.00 ok 13 - Recompiling APEX_200200 | 0.05 ok 14 - Installing APEX REST Config | 0.02 ok 15 - Set Loaded/Upgraded in Registry | 1.32 ok 16 - Removing Unused SYS Objects | 0.00 ok 17 - Validating Installation | 0.03 ok 3 - 17 actions passed, 0 actions failed | 1.57 PL/SQL procedure successfully completed. Thank you for installing Oracle Application Express 20.2.0.00.20 Oracle Application Express is installed in the APEX_200200 schema. The structure of the link to the Application Express administration services is as follows: http://host:port/ords/apex_admin The structure of the link to the Application Express development interface is as follows: http://host:port/ords timing for: Phase 3 (Switch) Elapsed: 00:01:34.83 timing for: Complete Installation Elapsed: 00:14:57.61 PL/SQL procedure successfully completed. 1 row selected. …null1.sql SYS>
Выше приводится последняя часть лога установки APEX, так как система генерирует очень много строк лога. Лог показывает, что установка прошла успешно и заняла 14 мин 57 секунд времени.
Шаг
2. Настройки и подключение к APEX
После успешного
завершения установки необходимо создать пользователя с административными
правами в APEX
и
назначить ему пароль, настроить ORDS
и создать рабочее пространство для разработки приложений.
Для создания
администратора и назначения ему пароля запускается скрипт apxchpwd.sql в PDB. Данный скрипт в будущем также
может быть использован для сброса пароля существующему администратору APEX.
После запуска скрипта система предложит ввести пользовательское имя для администратора (login), его email и пароль. По умолчанию система предлагает ADMIN для пользовательского имени администратора (login). Если необходимо оставить пользователя по умолчанию, то поле Enter the administrator’s username [ADMIN] следует оставить пустым и нажать Enter. В поле Enter ADMIN’s email [ADMIN] можно указать свою электронную почту. В поле Enter ADMIN’s password [] надо назначить пароль администратора, который будет удовлетворять следующим требованиям:
- Пароль должен содержать не менее 6 символов.
- Пароль должен содержать не менее одного буквенного символа.
- Пароль должен содержать не менее одного символа пунктуации:
(!”#$%&()“*+,-/:;?_). - Пароль должен содержать не менее одного заглавного буквенного символа.
- Пароль должен содержать не менее одного строчного буквенного символа.
Иначе система выдаст следующую ошибку:
ORA-20001: Password validation failed. ORA-06512: at line 30 ORA-06512: at "APEX_200100.WWV_FLOW_FND_USER_INT", line 3744 ORA-06512: at line 20
Запускается скрипт для создания администратора с именем ADMIN и назначения его email и пароля:
SYS> @apxchpwd.sql …set_appun.sql ====================================================================================== This script can be used to change the password of an Application Express instance administrator. If the user does not yet exist, a user record will be created. ====================================================================================== Enter the administrator's username [ADMIN] User "ADMIN" does not yet exist and will be created. Enter ADMIN's email [ADMIN] test@***.tj Enter ADMIN's password [] Created instance administrator ADMIN. SYS>
Пользователь успешно создан.
Также важно настроить учетную запись APEX_PUBLIC_USER для управления Oracle Application Express. Учетная запись APEX_PUBLIC_USER создается со случайным и недоступным паролем во время установки Oracle Application Express. Если же выполняется обновление (upgrade) с предыдущей версии Oracle Application Express, то приведенные ниже две команды не являются необходимыми:
SYS> ALTER USER APEX_PUBLIC_USER ACCOUNT UNLOCK; SYS> ALTER USER APEX_PUBLIC_USER IDENTIFIED BY new_password;
Для новой установки APEX (а не обновление) необходимо запустить скрипт apex_rest_config.sql для настройки RESTful сервисов. После запуска потребуется назначить пароль для учетных записей APEX_LISTENER, APEX_REST_PUBLIC_USER. Ниже во время установки и настройки ORDS будет необходимо вводить пароли этих учетных записей.
SYS> @apex_rest_config.sql Enter a password for the APEX_LISTENER user [] Enter a password for the APEX_REST_PUBLIC_USER user [] …set_appun.sql …setting session environment …create APEX_LISTENER and APEX_REST_PUBLIC_USER users SYS>
Настройка ORDS
В APEX версии 20.2 уже не поддерживается Web Listener с типом Embedded PL/SQL Gateway и Oracle HTTP Server. В связи с этим, необходимо установить и использовать Oracle REST Data Services (ORDS). Далее описывается процесс установки и базовой настройки APEX с ORDS версии 20.3.
Для начала, необходимо скачать ORDS. Oracle ORDS распространяется бесплатно и установочный файл можно скачать с официального сайта Oracle – https://www.oracle.com/database/technologies/appdev/rest-data-services-downloads.html
Для скачивания на портале Oracle необходимо наличие учетной записи с
паролем. При ее отсутствии осуществляется регистрация новой учетной записи.
Пройдя по ссылке, скачивается файл Oracle REST Data Services.
После ознакомления и принятия условий лицензирования необходимо поставить галочку в разделе I reviewed and accept the Oracle License Agreement.
Нажать на «Download ords-20.3.0.301.1819.zip». Запускается скачивание zip архива (ords-20.3.0.301.1819.zip). Объем архива 70 Мб.
После завершения скачивания необходимо создать директорию ords в /home/oracle/ и архив ords-20.3.0.301.1819.zip нужно скопировать в созданную директорию /home/oracle/ords операционной системы Oracle Linux, работающей на виртуальной машине. Выполняется разархивирование файла и проверка содержимого архива:
[oracle@dushanbe ~]$ pwd /home/oracle [oracle@dushanbe ~]$ ls apex apex_20.2.zip Desktop Documents Downloads Music Pictures Public Templates Videos [oracle@dushanbe ~]$ mkdir ords [oracle@dushanbe ~]$ cd ords [oracle@dushanbe ords]$ pwd /home/oracle/ords [oracle@dushanbe ords]$ ls -l total 70440 -rw-rw-rw-. 1 oracle oracle 72130015 Jan 15 00:00 ords-20.3.0.301.1819.zip [oracle@dushanbe ords]$ [oracle@dushanbe ords]$ unzip ords-20.3.0.301.1819.zip [oracle@dushanbe ords]$ ls -l total 139944 drwxr-xr-x. 3 oracle oracle 21 Oct 27 18:43 docs drwxrwxrwx. 7 oracle oracle 93 Oct 23 14:42 examples -rw-rw-rw-. 1 oracle oracle 40033 Oct 23 14:42 index.html drwxrwxrwx. 2 oracle oracle 43 Oct 23 14:42 installer -rw-rw-rw-. 1 oracle oracle 72130015 Jan 15 00:00 ords-20.3.0.301.1819.zip -rw-r--r--. 1 oracle oracle 71128103 Oct 27 18:43 ords.war drwxrwxrwx. 2 oracle oracle 36 Oct 23 14:42 params [oracle@dushanbe ords]$
При использовании ORDS для работы с APEX приложениями ORDS должен быть настроен для обслуживания статических файлов APEX. Необходимо скопировать директорию images (apex/images) из домашней директории с установочными файлами APEX в папку файловой системы, где установлены службы Oracle REST Data Services. В данном примере домашняя директория APEX находится в /home/oracle/apex и директория установки ORDS в /home/oracle/ords.
[oracle@dushanbe ords]$ cd /home/oracle/apex/ [oracle@dushanbe apex]$ pwd /home/oracle/apex [oracle@dushanbe apex]$ ls apexins1.sql apex_rest_config_core.sql apxdevrm.sql apxpatch.sql apxrtins3.sql builder dbcsconf.sql apexins2.sql apex_rest_config_nocdb.sql apxdvins_cdb.sql apxremov1.sql apxrtins_cdb.sql catapx.sql dbcsins.sql apexins3.sql apex_rest_config.sql apxdvins_nocdb.sql apxremov2.sql apxrtins_cdb_upg.sql core devins.sql apexins_cdb.sql appins.sql apxdvins.sql apxremov_cdb.sql apxrtins_nocdb.sql coreins2.sql images apexins_cdb_upg.sql apxappcon.sql apxdwngrd.sql apxremov_nocdb.sql apxrtins.sql coreins3.sql install2021-01-14_23-10-38.log apexins_nocdb.sql apxchpwd.sql apxexit.sql apxremov.sql apxsdoins.sql coreins4.sql load_trans.sql apexins.sql apxdevrm_cdb.sql apxpatch_cdb.sql apxrtins1.sql apxsilentins.sql coreins5.sql utilities apex_rest_config_cdb.sql apxdevrm_nocdb.sql apxpatch_nocdb.sql apxrtins2.sql apxupgrd.sql coreins.sql [oracle@dushanbe apex]$ cp -r images/ /home/oracle/ords/ [oracle@dushanbe apex]$ cd /home/oracle/ords/ [oracle@dushanbe ords]$ pwd /home/oracle/ords [oracle@dushanbe ords]$ [oracle@dushanbe ords]$ ls docs examples images index.html installer ords-20.3.0.301.1819.zip ords.war params
Проверяется текущая версия JDK.
[oracle@dushanbe ~]$ java -version java version "15.0.1" 2020-10-20 Java(TM) SE Runtime Environment (build 15.0.1+9-18) Java HotSpot(TM) 64-Bit Server VM (build 15.0.1+9-18, mixed mode, sharing) [oracle@dushanbe ~]$
Результат команды показывает, что на этой операционной системе установлена и настроена 15-я версия JDK. В этом посте можно ознакомиться со способом проверки текущей версии JDK, а также при необходимости установить, обновить, настроить и использовать новую версию по умолчанию (см. раздел «Установка JDK»).
Есть вероятность, что при использовании старой версии JDK (например, 8 версия) запуск установки ORDS выдаст следующую ошибку:
Enter the location to store configuration data: /home/oracle/ords/config Exception in thread "main" java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at oracle.dbtools.jarcl.Entrypoint.invoke(Entrypoint.java:66) at oracle.dbtools.jarcl.Entrypoint.main(Entrypoint.java:77) Caused by: java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3236) at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118) at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93) at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153) at java.util.zip.DeflaterOutputStream.deflate(DeflaterOutputStream.java:253) at java.util.zip.DeflaterOutputStream.write(DeflaterOutputStream.java:211) at java.util.zip.ZipOutputStream.write(ZipOutputStream.java:331) at java.nio.channels.Channels$WritableByteChannelImpl.write(Channels.java:458) at oracle.dbtools.util.StreamCopy.drain(StreamCopy.java:44) at oracle.dbtools.util.StreamCopy.drain(StreamCopy.java:31) at oracle.dbtools.zip.ZipBuilder._addEntry(ZipBuilder.java:55) at oracle.dbtools.zip.ZipBuilder.addEntry(ZipBuilder.java:63) at oracle.dbtools.common.zip.ZipBuilder.addEntry(ZipBuilder.java:24) at oracle.dbtools.common.zip.MutatedZip.mutate(MutatedZip.java:68) at oracle.dbtools.common.zip.MutatedZip.(MutatedZip.java:34) at oracle.dbtools.cmdline.ModifyConfigDir.modified(ModifyConfigDir.java:145) at oracle.dbtools.cmdline.ModifyConfigDir.modify(ModifyConfigDir.java:117) at oracle.dbtools.cmdline.Commands.configurationContext(Commands.java:568) at oracle.dbtools.cmdline.Commands.prepareApplicationContext(Commands.java:447) at oracle.dbtools.cmdline.Commands.main(Commands.java:407) … 6 more
Есть два варианта установки ORDS:
- Автономный (standalone) режим.
- На сервере приложений (Oracle WebLogic Server, Apache Tomcat).
Далее описывается установка ORDS в standalone режиме.
Для начала установки и настройки ORDS необходимо запустить следующую команду: java -jar ords.war install advanced
После запуска команды система потребует предоставить данные для множества параметров. Ниже приведены некоторые параметры и их значения во время установки. Остальные параметры оставлены по умолчанию или не требуют дополнительного описания.
– Enter the location to store configuration data: указывается директория настроек ORDS. Можно указать любую директорию. В данном примере указана следующая директория: /home/oracle/ords/config
– Enter the administrator username: Необходимо указать логин и пароль учетной записи базы данных с правами sysdba.
[oracle@dushanbe ords]$ java -jar ords.war install advanced This Oracle REST Data Services instance has not yet been configured. Please complete the following prompts Enter the location to store configuration data: /home/oracle/ords/config Specify the database connection type to use. Enter number for [1] Basic [2] TNS [3] Custom URL [1]: Enter the name of the database server [localhost]:dushanbe Enter the database listen port [1521]: Enter 1 to specify the database service name, or 2 to specify the database SID [1]: Enter the database service name:XEPDB1 Enter 1 if you want to verify/install Oracle REST Data Services schema or 2 to skip this step [1]: Enter the database password for ORDS_PUBLIC_USER: Confirm password: Requires to login with administrator privileges to verify Oracle REST Data Services schema. Enter the administrator username:sys Enter the database password for SYS AS SYSDBA: Confirm password: Connecting to database user: SYS AS SYSDBA url: jdbc:oracle:thin:@//dushanbe:1521/XEPDB1 Retrieving information. Enter the default tablespace for ORDS_METADATA [SYSAUX]: Enter the temporary tablespace for ORDS_METADATA [TEMP]: Enter the default tablespace for ORDS_PUBLIC_USER [USERS]: Enter the temporary tablespace for ORDS_PUBLIC_USER [TEMP]: Enter 1 if you want to use PL/SQL Gateway or 2 to skip this step. If using Oracle Application Express or migrating from mod_plsql then you must enter 1 [1]: Enter the PL/SQL Gateway database user name [APEX_PUBLIC_USER]: Enter the database password for APEX_PUBLIC_USER: Confirm password: Enter 1 to specify passwords for Application Express RESTful Services database users (APEX_LISTENER, APEX_REST_PUBLIC_USER) or 2 to skip this step [1]: Enter the database password for APEX_LISTENER: Confirm password: Enter the database password for APEX_REST_PUBLIC_USER: Confirm password: Enter a number to select a feature to enable: [1] SQL Developer Web (Enables all features) [2] REST Enabled SQL [3] Database API [4] REST Enabled SQL and Database API [5] None Choose [1]: 2021-01-07T18:32:25.400Z INFO reloaded pools: [] Installing Oracle REST Data Services version 20.3.0.r3011819 … Log file written to /home/oracle/ords_install_core_2021-01-07_233226_00133.log … Verified database prerequisites … Created Oracle REST Data Services proxy user … Created Oracle REST Data Services schema … Granted privileges to Oracle REST Data Services … Created Oracle REST Data Services database objects … Log file written to /home/oracle/ords_install_datamodel_2021-01-07_233302_00744.log … Log file written to /home/oracle/ords_install_apex_2021-01-07_233311_00188.log Completed installation for Oracle REST Data Services version 20.3.0.r3011819. Elapsed time: 00:00:52.120 Enter 1 if you wish to start in standalone mode or 2 to exit [1]:1 Enter the APEX static resources location:/home/oracle/ords/images Enter 1 if using HTTP or 2 if using HTTPS [1]: Enter the HTTP port [8080]: 2021-01-07T18:43:03.267Z INFO HTTP and HTTP/2 cleartext listening on host: localhost port: 8080 2021-01-07T18:43:03.311Z INFO Disabling document root because the specified folder does not exist: /home/oracle/ords/params/ords/standalone/doc_root 2021-01-07T18:43:06.167Z INFO Configuration properties for: |apex|| cache.caching=false cache.directory=/tmp/apex/cache cache.duration=days cache.expiration=7 cache.maxEntries=500 cache.monitorInterval=60 cache.procedureNameList= cache.type=lru database.api.enabled=true db.connectionType=basic db.hostname=dushanbe db.port=1539 db.servicename=XEPDB1 debug.debugger=false debug.printDebugToScreen=false error.keepErrorMessages=true error.maxEntries=50 feature.sdw=true jdbc.DriverType=thin jdbc.InactivityTimeout=1800 jdbc.InitialLimit=3 jdbc.MaxConnectionReuseCount=1000 jdbc.MaxLimit=10 jdbc.MaxStatementsLimit=10 jdbc.MinLimit=1 jdbc.statementTimeout=900 log.logging=false log.maxEntries=50 misc.compress= misc.defaultPage=apex restEnabledSql.active=true security.disableDefaultExclusionList=false security.maxEntries=2000 security.requestValidationFunction=wwv_flow_epg_include_modules.authorize security.validationFunctionType=plsql db.password= db.username=APEX_PUBLIC_USER resource.templates.enabled=true
На этом завершается установка и настройка APEX с ORDS. Можно подключиться к Oracle APEX 20.2 по следующему адресу: http://localhost:8080/ords
Вместо localhost можно указать адрес 127.0.0.1 или IP адрес хоста. В примере используется IP адрес хоста равный 192.168.0.1. Запускается веб-браузер и выполняется переход к следующему адресу:
http://192.168.0.1:8080/ords
Для информации: по умолчанию, для того чтобы получить доступ к корню APEX через сервисы ORDS необходимо перейти по пути /ords. Если есть необходимость использовать путь /apex для доступа к APEX, то потребуется переименовать файл ords.war в apex.war перед началом установки и настройки ORDS.
После завершения установки автоматически создается рабочее пространство (workspace) для выполнения административных задач в APEX. Название workspace – INTERNAL. Выполняется подключение к административному workspace под пользователем ADMIN и его паролем (данный пользователь и его пароль были созданы при запуске скрипта apxchpwd.sql (см. выше)).
После успешного входа система запросит создать новое рабочее пространство для разработки приложений:
Далее задается название, идентификатор и описание рабочего пространства. В примере ниже задается имя рабочего пространства «Dushanbe» и краткое описание. По умолчанию система сама генерирует идентификатор рабочего пространства.
На этапе Identify Schema надо будет указать название схемы (пользователя базы данных), к которой будет привязано новое рабочее пространство. Если в поле Re-use existing schema выбран No, то в поле Schema Name необходимо указать название нового пользователя/схемы, в поле Schema Password задать ему пароль, а в поле Space Quota (MB) назначить ему квоту на использование пространства в табличном пространстве.
В примере для поля Re-use existing schema выбирается значение Yes и в Schema Name указывается тестовая и учебная схема/пользователь hr.
Это даст возможность использовать связанные таблицы с готовыми тестовыми данными, представления, триггеры, данные и другие объекты схемы hr во время создания приложений в APEX.
Нажимается Next и выполняется переход на шаг создания пользователя с административными правами для нового создаваемого пространства – Dushanbe. Для нового пространства тоже создается пользователь с именем Admin. Указываются пароль, имя, фамилия и email администратора нового создаваемого пространства для разработки приложений:
Нажимается Next и выполняется переход на следующий шаг – подтверждения настроек нового рабочего пространства:
После нажатия Create Workspace начнется создание рабочего пространства и при успешном завершении система выдаст следующее сообщение:
Это означает, что в APEX успешно создано новое рабочее пространство с именем Dushanbe. Нажатие кнопки Done позволит пользователю ADMIN получить доступ к своему рабочему пространству (INTERNAL) и начать работу:
Выполняется выход пользователя ADMIN из административного рабочего пространства (workspace) INTERNAL. Для этого в правом верхнем углу нажимается на имя пользователя и нажимается на Sign Out.
Нажимается на Return to Sign in Page и на новой странице указываются данные для подключения к новому рабочему пространству (workspace) Dushanbe:
При первом входе администратору нового рабочего пространства (workspace) необходимо самостоятельно сменить пароль:
После успешной смены пароля администратор workspace Dushanbe получает доступ к среде:
Рабочее пространство Dushanbe готово для начала разработки веб-приложений.
Необходимо учитывать, что после перезагрузки операционной системы сервис будет недоступен. Для запуска ORDS необходимо вручную запустить следующую команду java -jar ords.war standalone из директории ords (в данном примере из /home/oracle/ords):
[oracle@dushanbe ords]$ pwd /home/oracle/ords [oracle@dushanbe ords]$ java -jar ords.war standalone
Если закрыть консоль операционной системы, то сервис ords выполнявшийся в ней завершится. Во избежание этого необходимо команду java -jar ords.war standalone запустить в фоновом режиме, используя nohup:
[oracle@dushanbe ords]$ nohup java -jar ords.war standalone &
При необходимости можно написать скрипт на уровне операционной системы, который будет запускать последнюю команду из нужной директории, и записывать детальную информацию о запуске в определенный лог файл для последующего анализа в будущем.
Продолжение туториала.
В этой части описаны процессы создания приложения Oracle APEX и создания страниц в приложении.
Предыдущая часть: Туториал по Oracle Application Express. Обзор IDE
Оглавление
Создание приложения
Страницы, создаваемые по умолчанию
Запуск приложения
Создание страниц
Основные компоненты страниц
Визуальные элементы
Невизуальные элементы
Основные свойства элементов
Общие свойства
Свойства страниц
Создание приложения
Чтобы создать приложение, нужно зайти в App Builder и нажать кнопку «Create».
Историческая справка о типах приложений
В прошлых версиях апекса на первом шаге мастер предлагал выбрать тип приложения (в версиях 4.х, если мне память не изменяет, это были типы «Database application» и «Websheet Application», в версиях 5.х — «Desktop», «Mobile», «Websheet» и «Packaged Application»), в текущей версии все остальные типы задвинули немного в сторону (хотя «Websheet» остался), и нужно выбрать просто «New Application». А «Packaged Application» — это те самые демо-приложения из App Gallery.
Далее запустится мастер создания приложения. На первом шаге нужно выбрать «New Application», на втором — достаточно заполнить поля «Name» («Название») и «Application ID» (номер приложения). Название нужно просто потому, что это обязательное для заполнения поле, а Application ID
— потому что потом поменять его будет нельзя. Точнее можно (через экспорт/импорт), но это долго и нудобно, лучше сразу задать нужный номер, если автоматически сгенерированный апексом не устраивает. Номер должен быть уникальным. Этот номер используется как часть адреса приложения. Посмотрим на типичный URL апекса:
https://apex.oracle.com/pls/apex/f?p=123456:1:14675052744498:::::
Здесь 123456
— это ID приложения.
На остальные поля в мастере можно пока не обращать внимания, все эти настройки можно будет поменять позже.
После этого нужно нажать «Create Application», апекс создаст приложение и автоматически переместит вас на страницу приложения, где вы увидите
Страницы, создаваемые по умолчанию
По умолчанию апекс создаст 3 страницы в приложении. Страницы, так же как и приложения, имеют номер и название. Номер точно так же используется в URL для идентификации страницы, он идет сразу за номером приложения и отделяется от него двоеточием. То есть формат такой:
https://apex.oracle.com/pls/apex/f?p=APPLICATION_ID:PAGE_ID:<остальная часть url>
Созданные по умолчанию страницы — это:
- Global page (ID страницы: 0)
Это специальная страница, которая не используется самостоятельно, но на которую можно добавить какой-нибудь элемент, если нужно, чтобы он отображался на всех страницах. -
Home page (ID страницы: 1)
Это стартовая страница приложения. На нее вы будете попадать по умолчанию после того, как введете логин и пароль в приложении, или если вы укажете URL вашего приложения без указания страницы и всего остального, то есть вот так:https://apex.oracle.com/pls/apex/f?p=123456
- Login page (ID страницы: 9999, в версиях 4.х, 5.х был 101)
Это, очевидно, страница логина. Она содержит поля для ввода логина и пароля, с некоторых пор (затрудняюсь назвать версию, но относительно недавно) — галочку «Remember username», и кнопку «Sign In».
Приложения и страницы имеют также полезное свойство Alias
. Для приложения это свойство настраивается в свойствах приложения («Application Properties» — «Definition» — «Name» — «Application Alias»), а для страницы — в редакторе страниц в панели свойств справа. Alias
можно использовать в URL страницы вместо номера. Страница логина по умолчанию создается с алиасом LOGIN_DESKTOP
, а домашняя страница — с алиасом HOME
. Если задать приложению алиас MY_APP
, то на страницу логина можно будет зайти по адресу
https://apex.oracle.com/pls/apex/f?p=MY_APP:LOGIN_DESKTOP
#define true false (или я знаю, о чем вы подумали)
Что будет, если приложению 123 сделать алиас 456, а приложению 456 — алиас 123? Ничего не будет, апекс не даст сделать такие алиасы приложениям. Четко в справке это не прописано, но алиас приложения, кажется, должен подчиняться правилам для имен идентификаторов в PL/SQL.
Что будет, если странице 123 сделать алиас 456, а странице 456 — алиас 123? Ничего не будет, страницам такие алиасы давать можно, но они будут проигнорированы. 123 в url откроет страницу с номером 123.
Запуск приложения
Теперь, когда приложение создано, его уже можно «запустить» (только смотреть там пока не на что). Это не совсем тоже самое, что запуск обычного приложения (как в Windows или в Linux). Приложение апекса рендерится тем же движком, что и сама IDE, так что как только вы создали приложение, оно мгновенно готово к использованию, и любой человек, который введет его адрес в адресную строку, сможет с ним работать. Сам запуск приложения, фактически, — это просто такое название для открытия стартовой страницы (той, которая с номером 1). Запустить приложение можно многими способами:
- в App Builder в списке приложений есть столбец «Run» с кнопкой напротив каждого приложения;
- на странице приложения есть большая кнопка «Run Application»;
- можно «запустить» не только приложение, но и любую недиалоговую страницу (диалоговые можно только вызвать с обычных страниц): в списке страниц приложения тоже есть столбец с кнопкой «Run»;
- можно запустить текущую страницу из редактора страниц, нажав на кнопку в верхнем правом углу;
- и, наконец, можно запустить страницу, если в верхнем правом углу есть такие кнопки:
Эти две кнопки есть почти в любом разделе IDE. Левая содержит номер последней страницы, которую вы открывали в редакторе страниц. Нажав на нее, вы перейдете к редактированию этой страницы, а нажав на правую кнопку, вы запустите эту страницу.
Что случится после запуска? Если запускаемая страница имеет ограниченный доступ, сначала пользователь будет перенаправлен на страницу логина. Если пользователь уже залогинен, или страница с настройках обозначена как общедоступная, то откроется сама эта страница.
По умолчанию страница создается с ограниченным доступом. В свойствах страницы (Редактор страниц — правая панель — группа свойств «Security» — «Authentication») есть две возможные настройки:
Page Requires Authentication
: страница будет доступна только залогиненным пользователям в течении сессии;Page is Public
: общедоступная страница, видна зарегистрированным и незарегистрированным пользователям.
Создание страниц
Создать страницу можно на странице приложения. Нажмите «Create», после чего запустится мастер создания страниц. Шаги мастера:
- Выбор типа страницы из (на данный момент) 12 типов, некоторые из которых имеют еще и подтипы (если они есть, то появятся на следующем шаге). Первый тип из списка — «Blank page», то есть пустая страница без всего. Остальные типы — это часто встречающиеся варианты страниц для работы с БД: отчеты, формы ввода, графики и т. п. Здесь я опишу процесс создания пустой страницы, а по остальным типам будет отдельная статья.
- Ввод номера и названия страницы. О номерах я говорил выше; номер задается на этом шаге и потом изменить его будет нельзя, так что смотрите внимательно. Иногда разработчики разбивают страницы на группы (по функциональному назначению, например), и за каждой группой резервируют диапазон номеров, так что если у вас в проекте такое используется, будьте внимательны. Тут же нужно выбрать тип страницы: обычная, модальный диалог, немодальный диалог.
- Настройка элементов навигации. Можно пропустить (нажать «Next») и настроить потом (хотя если у вас уже выстроена какая-то система навигации, удобно сразу задать всё на этом шаге и больше не париться).
- Подтверждение создания.
После этого страница создана и готова к использованию.
Основные компоненты страниц
Визуальные элементы
Визуальные элементы — это элементы, которые так или иначе отображаются на экране. Это:
- Верхнее меню. Содержит название приложения, логотип, имя пользователя, ссылку «Logout» (если пользователь залогинен). Туда же можно добавлять другие элементы;
- Меню навигации слева. Можно использовать для навигации по приложению, сделав, например, иерархическую структуру разделов приложения;
- Regions (обычно по-русски их так и называют — «регионы»): контейнеры элементов. Могут содержать в себе отчеты, графики, поля для ввода, кнопки и другие регионы;
- Items (устоявшегося перевода на русский нет, называют кто во что горазд, обычно используют слова item, поле и часто просто итем): это разнообразные поля для пользовательского ввода;
- Buttons (кнопки): ну, это обычные кнопки, короче, что тут еще сказать
- Отчеты: таблицы с данными на основе SQL запросов;
- Графики/диаграммы: графическое отображение информации из БД, также на основе SQL запросов.
Отчеты и графики можно рассматривать как разновидности регионов (технически это они и есть), но при этом они являются довольно самостоятельными сущностями, со своим поведением, свойствами и прочим.
Невизуальные элементы
Это элементы для обеспечения логики работы приложения. Там на самом деле огромное разнообразие элементов, хотя пользователю их и в буквальном смысле не видно. Основные типы:
- Process (процесс): как правило, PL/SQL код, выполняемый на сервере в ответ на какое-либо действие пользователя;
- Validation (валидация): разновидность процессов для проверки пользовательского ввода;
- Dynamic Action (нет устоявшегося перевода, обычно все так и пишут — Dynamic Action или просто DA, а когда лень раскладку переключать, могут написать динамик экшен или ДА): процесс, выполняемый браузером. В конечном счете DA — это обработчик какого-либо события javascript. Знать javascript необязательно, но если знать (а заодно и CSS селекторы) — можно творить чудеса;
- Branches (нет устоявшегося перевода): редиректы на другие страницы в зависимости от некоторых условий.
Основные свойства элементов
Общие свойства
Основные свойства, характерные для каждого (или почти каждого) типа элементов. Их можно смотреть и изменять в редакторе страниц, там они собраны в группы. Здесь я вкратце опишу их назначение (так что вы будете знать, что где искать), а более подробно расскажу в других статьях.
Identification
: задает название элемента и дополнительные совйства (в зависимости от типа);Appearance
: свойства, отвечающие за внешний вид визуального элемента. Для каждого типа элементов существует набор шаблонов, вы можете выбрать один из них здесь (свойствоTemplate
). Также шаблоны имеют дополнительные настройки (Template Options
— по нажатию на кнопку откроется окно с настройками);Layout
: настройка положения визуального элемента на странице. Элементы располагаются в сетке из 12 колонок, здесь можно указать, как именно они должны располагаться;Source
: у регионов и итемов — источник данных для отображения, у процессов — код процесса;Server-side Condition
: условие, проверяемое на сервере (есть огромный выбор условий, от простых, типа такой-то элемент имеет такое-то значение, до произвольного PL/SQL кода). Элемент будет отображаться на странице, если это условие выполняется, а если нет — то не будет. Причем он будет не скрыт, а просто не отрендерится;Client-side Condition
(уDynamic Action
): условие, проверяемое на клиенте (без обращения к серверу). DA будет выполнено, если условие выполняется;Read only
: работает так же, как иServer-side Condition
, только управляет не наличием/отсутствием элемента, а возможностью менять значение. Это свойство есть у итемов, регионов и страниц. У итема оно применяется к самому итему, а у регионов/страниц — ко всем итемам внутри соответствующего региона/страницы;Security
: управление доступом к элементу. В принципе, все тоже самое можно сделать и с помощьюServer-side Condition
, но лучше разграничить:Server-side Condition
— для логики приложения,Security
— для отображения в зависимости от прав доступа.Configuration
: для включения/выключенияBuild Option
. Очень неочевидная вещь, но очень полезная: позволяет включать и выключать отдельные фичи приложения, что очень удобно, когда вы разрабатываете параллельно фичи для нескольких разных релизов;Comments
: комментарии для других разработчиков;Help
(у визуальных элементов): справка для конечных пользователей приложения.
Свойства страниц
Свойства, характерные только для страниц:
Navigation
: в этой группе два свойства.Cursor Focus
указывает, передавать ли фокус полю для ввода на странице сразу после заргузки (варианты — либо не передавать, либо передавать первому полю на странице).Warn on Unsaved Changes
не дает пользователю уйти со страницы, если там есть несохраненные данные;JavaScript
: позволяет добавить JavaScript код на страницу. Можно указать путь к файлу или добавить свой код прямо на страницу;CSS
: то же самое для CSS. Подключить файл или добавить на страницу, если нужная какая-то локальная настройка CSS только для этой страницы;Advanced
: позволяет включить или отключить защиту от повторной отправки формы.
- Информация о материале
- Категория: Статьи
-
Опубликовано: 29 мая 2017
-
Просмотров: 20023
Создание приложения в Oracle Apex
- В данной статье мы рассмотрим основные аспекты разработки приложения в Oracle Apex. Перед началом работы нам необходимо создать приложение в Oracle Apex. Для этого заходим в основной интерфейс разработки и нажимаем «Create» на главной странице.
- Далее выбираем тип приложения. В нашем случае это будет «Desktop» версия приложения.
- На следующем шаге указываем схему в БД, в которой будет храниться приложение, его название, номер и основную тему.
- На этапе «Pages» уже можно создать страницы для нашего приложения, но мы рассмотрим их создание отдельным шагом.
- Shared Components мы пропускаем, т.к. у нас нет компонентов для копирования из других приложений.
- Производим настройку основных атрибутов приложения. Такие как язык приложения и формат даты, времени.
- Проверяем основные настройки приложения и подтверждаем его создание.
- Приложение создано, и мы находимся в разделе его редактирования. Данная среда является основной для дальнейшей разработки и редактирования приложения. Но уже сейчас мы можем запустить наше приложение с помощью кнопки «Run Application».
- Наше запущенное приложение. Пока что оно пустое, но уже скоро он будет обрастать новыми страницами и компонентами.
Создание страницы в приложении Oracle Apex
- Наше первое приложение создано, и мы находимся в основном разделе его редактирования. Как видим, в нём уже создано две страницы (домашняя и страница авторизации в приложение). Попробуем создать новую, для этого нажимаем «Create Page».
- Выбираем тип страницы. Это может быть пустая страницы, отчет, форма, график и т.д. Сейчас создадим пустую страницы, а далее рассмотрим создание регионов на новой странице.
- Присваиваем имя для страницы.
- На шаге «Navigation Menu» можно привязать страницу к разделу в навигационном меню.
- Подтверждаем создание страницы.
- Теперь список страниц в приложении пополнился новой страницей.
- Если выберем нашу страницу из списка выше, то попадем в основное меню создания, редактирования и обзор всех компонентов страницы. Для более наглядного редактирования компонентов на странице можно использовать «Page Designer», для этого необходимо перейти в соответствующий раздел.
- Внешний вид раздела «Page Designer» выглядит следующим образом:
Создание графика (Chart) в Oracle Apex
- Для создания графика в Oracle Apex на новой странице, в разделе редактирования страницы необходимо создать регион с типом «Chart». Регионом в Oracle Apex является некий контейнер содержащий набор информации (графики, отчеты, кнопки, формы и др.).
- На следующем этапе выбираем тип отображения графика на странице (Flash/HTML), в нашем случае это будет HTML5 и тип графика – гистограмма.
- Затем производится настройка атрибутов региона.
- Указываем название для графика. Также на данном шаге можно выбрать отображение значений на графике, имя аксис, отображение легенды, сетки и цвет заливки графика.
- На этапе «Source» задаем сам запрос для построения графика. На этом же этапе можно указать максимальное количество выводимых строк для построения графика и сообщение, если данных для построения графика будет не хватать.
- На последнем этапе можно выбрать схему авторизации для данного региона (если были созданы заранее).
- После того как мы создали регион, в меню «Chart Attributes» можно задать дополнительные настройки графика, такие как размеры графика, цветовые настройки, параметры отображения элементов графика, настройки легенды, создание второй серии графика, а также Drill Down до следующего уровня графика и многое другое.
- После того, как разобрались с дополнительными настройками можно запустить приложение и посмотреть, что получилось.
Создание интерактивного отчёта в Oracle Apex
- На странице создаем регион с типом «Report».
- Выбираем тип «Interactive Report», т.к. ряд возможностей работы с ним шире, чем у классического отчета.
- Задаем название региона.
- На этапе «Source» задается текст запроса для отчета. Его можно указать как привычным скриптом, так и построить через «Query Builder» выбрав пункт «Table».
- На последнем этапе можно выбрать схему авторизации для данного региона (если были созданы заранее).
- После создания отчета запустим приложение и посмотрим на результат. В отличие от классического отчета в интерактивном имеются функции сортировки и фильтрации данных, а также имеется возможность быстрого построения графиков на основе данных в отчете.
- Для настройки дополнительных атрибутов отчета необходимо зайти в настройки региона, кликнув на его название.
Работа с оглавлением приложения
- Для демонстрации создания и редактирования многоуровневого оглавления в приложении Oracle Apex, создадим несколько страниц, где в названии будет указан уровень в оглавлении.
- В разделе «Shared Components» выбираем раздел «Navigation Menu».
- На странице «List Details» необходимо добавить запись в меню навигации. Для этого в пункте «Page» выбираем страницу, на которую будет ссылаться раздел меню, а в пункте «List Entry Label» указываем название пункта меню.
- Для добавления дочерних разделов меню, для новой страницы повторяем предыдущий шаг, но в качестве родительской страницы, в пункте «Parent List Entry», выбираем необходимый раздел.
- По завершению работы с добавлением разделов меню, в структуре «List Details» мы видим названия разделов, родительский пункт меню и уровень в меню навигации.
- Теперь меню навигации в нашем приложении выглядит следующим образом.
- Как видите, разработка приложений в Oracle Apex довольно удобная и простая, что простыми действиями позволяет создавать интересные приложения. Следите за новостями на http://www.rtportal.ru – будет еще много полезных статей.
Другие статьи на тему APEX:
- Установка и конфигурирование Oracle Application Express 5 (APEX) и Oracle REST Data Services 3 (ORDS) для сервера приложений Weblogic 12
- Создание домена в weblogic 12с и запуск его как службы Windows
- Настройка доменной аутентификации в Oracle Apex
- Как настроить постраничную авторизацию в Oracle APEX
- Подключение схемы (таблицы) в Oracle Application Express 5 (APEX)
- Создание приложения в Oracle Application Express 5 (APEX)
- Перенос APEX приложения из среды разработки в продуктовую среду
В этой статье описываются три типа отчетов апекса: Classic Report, Interactive Report (IR) и Interactive Grid (IG). Classic Report — самый простой из них, но в сочетании с другими компонентами позволяет делать достаточно неожиданные вещи. IR и IG обладают намного более широкими возможностями из коробки, но это в значительной степени вещи в себе. С одной стороны, их широкие возможности делают ненужным какой-то дополнительный тюнинг, с другой, эти же возможности довольно жестко ограничивают возможность сделать что-то дополнительно. Многое из того, что применимо к Classic Report, применимо и к ним тоже.
Оглавление
Classic Report
Дополнительное форматирование данных
Форматирование с помощью свойств столбцов
Форматирование путем изменения шаблона
Добавляем интерактива
События вида «клик на строке отчета»
Изменение данных с помощью Classic Report
Interactive Report (IR)
Interactive Grid (IG)
Создание столбцов не через SQL
Новые типы столбцов
Master-Detail отчеты на основе IG
Обработка ввода данных в IG
Classic Report
Создать отчет можно двумя способами. Первый — создать вместе со страницей, через мастер создания страниц: выбрать тип страницы «Report», далее — подтип «Classic Report», далее пройти шаги мастера для задания свойств страницы, и последний шаг — указать источник данных. Будет создана новая страница с одним отчетом, на которую, при желании, можно потом добавить что-нибудь еще. Этот способ имеет скорее историческую ценность, до появления современного Page Designer в версии 5.0 так было действительно проще.
Второй способ — на уже созданной странице в Page Designer в левом меню на закладке «Rendering
» (она там первая) найти ветку «Regions
«, кликнуть на ней правой кнопкой и выбрать «Create Region
«. Далее нужно указать в группе свойств «Identification
» на правой панели: «Title
» — заголовок, под которым отчет будет отображаться на странице, и «Type
» — «Classic Report
«; в группе «Source
«: «Location
» — «Local Database
» (относительно новое поле, в 5.х его не было), «Type
» — «SQL Query
«, «SQL Query
» — собственно запрос. Этого достаточно.
SQL запрос, на котором построены дальнейшие примеры и КДПВ
Создание таблицы:
create table students as
select id, name, surname,
trunc(sysdate - dbms_random.value(18 * 365 - 180, 18 * 365 + 180)) birthdate,
trunc(sysdate - 8) examdate,
trunc(50 + dbms_random.value * 50) rating
from (select 1 id, 'Маша' name, 'Иванова' surname from dual union all
select 2 id, 'Петя' name, 'Балалайкин' surname from dual union all
select 3 id, 'Коля' name, 'Водкин' surname from dual union all
select 4 id, 'Вася' name, 'Петров' surname from dual union all
select 5 id, 'Катя' name, 'Медведева' surname from dual union all
select 6 id, 'Ира' name, 'Сидорова' surname from dual union all
select 7 id, 'Виктор Степанович' name, 'Победоносцев' surname from dual);
Запрос для отчета:
select id, name, surname, birthdate, examdate, rating, rn,
case when rn <= 3 then 'highrating' else '' end color,
apex_item.checkbox(1) chbx
from (select id, name, surname, birthdate, examdate, rating,
row_number() over (order by rating desc) rn
from students)
order by id
После того, как вы ввели текст запроса, апекс его самостоятельно распарсит и обнаружит столбцы. Настройки региона с отчетом в панели слева будут выглядеть так:
Здесь есть три основных раздела:
- раздел, названием которого является «
Title
» региона: там настраиваются свойства региона; - «
Columns
«: список столбцов, для каждого доступны свои настройки; - «
Attributes
«: свойства самого отчета, то есть конкретно таблички с данными (не знаю, кто как, а я поначалу долго путался, где свойства региона, а где — отчета; в частности, и регион, и отчет имеют каждый свой «Template
«, и если вы «Template
» поменяли, а вид отчета/региона не изменился, проверьте, не перепутали ли вы их друг с другом).
Базовые возможности Classic Report:
- Выравнивание (по левому краю, по центру, по правому краю) заголовков столбцов и данных в столбцах, задание маски формата для чисел и дат;
- Сортировка: если указать в свойствах столбца «
Sortable
» — «Yes
«, то на странице заголовок этого столбца будет представлен ссылкой, по клику на которую будет происходить сортировка. Вы можете сортировать данные либо добавлением «Order by
» в запрос, либо настройкой сортировки в свойствах столбцов, но нельзя делать и то, и другое вместе; - «
Pagination
«: можно указать количество строк на страницу («Attributes
» → «Number of Rows
«) и настроить вид селектора страницы (несколько вариантов на выбор). Также обратите внимание на параметр «Maximum Rows to Process
«: он задает, сколько строк запроса попадет в итоге в таблицу. Все сортировки, «Pagination
» и прочее будет применяться к этому количеству строк. Если ваш запрос, как предполагается, может/должен возвращать больше, увеличьте это число; - «
When No Data Found
«: когда запрос возвращает 0 строк, таблица не показывается вообще (даже заголовок, это особенность движка), а в этом разделе можно задать сообщение, которое будет выведено вместо таблицы с результатом; - Выгрузка данных в CSV: настраивается в разделе «
Download
«.
У столбцов есть поле «Type», в котором можно выбрать один из нескольких вариантов отображения результата:
- «Plain Text»: это вариант по умолчанию — просто результат из запроса.
- «Plain Text (based on List of Values)»: если у вас в результатах запроса есть поле, ссылающееся на таблицу-справочник, можно подставить значение из справочника с помощью этого поля (но лучше, конечно, просто приджойнить его в самом запросе).
- «Link»: позволяет сделать ссылку. О ссылках будет отдельная статья.
- «Display Image» и «Download BLOB»: эти типы позволяют получить доступ к файлам, которые хранятся в таблице в столбце типа
BLOB
. Первый отображает файл в виде картинки (если это картинка, конечно), а второй — отображает ссылку для скачивания. - «Percent Graph»: отображает число от 0 до 100 как картинку с прогресс-баром.
- «Hidden Column»: используется, когда значение из запроса — это что-то вспомогательное (например, для форматирования), но на экране отображаться не должно.
Дополнительное форматирование данных
Форматирование с помощью свойств столбцов
Рассмотрим пример, в котором у нас есть список учащихся, сдающих некий экзамен (SQL запрос был приведен выше). У нас есть табличка с результатами, и мы хотим выделить три лучших результата красным цветом и жирным шрифтом. На помощь нам приходят настройки столбца «Column formatting
«. Когда апекс рендерит отчет, он создает HTML таблицу, и в ее ячейки (<td></td>
) помещает значения из результатов запроса. Свойство «HTML Expression
» позволяет задать вместо этого произвольный HTML код. Если оно пустое, апекс поместит внутрь тега td
значение из запроса, а если непустое — то содержание свойства. В выражении «HTML Expression
» можно использовать ссылки на значение какого-либо столбца запроса, для этого нужно заключить его название между двух символов #
. В запросе в моем примере есть столбцы «RATING
» (результат, который нужно показать), и «COLOR
» (в нем вычисляется имя CSS-класса, который будет задавать стиль подсветки, в зависимости от значения столбца «RATING
«). В свойстве «HTML Expression
» столбца «RATING
» нужно написать:
<span class="#COLOR#">#RATING#<span>
А сам CSS-класс highrating
можно описать в свойствах страницы («CSS
» → «Inline
«):
.highrating {
color: red;
font-weight: bold;
}
Всё готово. Если теперь открыть страницу, вы увидите выделенные красным три самых высоких результата.
И конечно, данную задачу можно решить множеством альтернативных способов. Например, не использовать CSS-классы, а вычислить в SQL запросе цвет и вставить его в атрибут style
, или описать нужный CSS-класс в шаблоне страницы или отчета. Существует множество вариаций, выбирайте, кому что ближе.
Примечание: чтобы скрыть все дополнительные столбцы, используемые для форматирования или каких-то промежуточных вычислений, в свойствах столбца «Identification
» → «Type
» выберите «Hidden Column
«.
Форматирование путем изменения шаблона
У форматирования с помощью свойств столбца есть один недостаток: никак нельзя повлиять на формат самой ячейки, то есть тега td
. Из-за этого, например, не получится сделать полную заливку ячейки каким-либо цветом (потому что в стандартных апексовых CSS-файлах у ячейки таблицы ненулевой padding
, и внутри будет белая рамка).
Возьмем тот же пример, что и выше, и добавим выделение желтым цветом для строк с тремя самыми лучшими результатами.
Для этого нужно сделать следующие шаги:
- Отправляемся в «
Shared Components
» → «User Interface
» → «Templates
«, в появившемся списке шаблонов кликаем на заголовок столбца «Type
«, и в появившемся списке значений выбираем «Report
«. Теперь находим шаблон «Standard
» (он используется по умолчанию) и в самом правом столбце списка («Copy
«) кликаем на кнопку, чтобы создать копию шаблона. В появившемся окне даем шаблону название, например, «Standard with highlight». -
Открываются свойства шаблона. На закладке «
Column Template
» в поле «Column Template 1
» содержится что-то вроде такого:<td class="t-Report-cell" #ALIGNMENT# headers="#COLUMN_HEADER_NAME#">#COLUMN_VALUE#</td>
Это шаблон ячейки в том виде, как он используется сейчас. На этой закладке можно задать до четырех альтернативных шаблонов ячейки, выбор между которыми будет осуществляться в зависимости от результата вычисления условия каждого из шаблонов. У нас в запросе есть поле
RN
— порядковый номер результата (то есть лучший результат имеет номер 1, следующий — 2, и так далее), здесь мы будем использовать его. Первый шаблон (по условию задачи) должен применяться только к строкам, в которых значение столбцаRN
больше трёх. В свойствах шаблона в поле «Column Template 1 Condition
» выбираем «Use Based on PL/SQL Expression
«, а в поле «Column Template 1 Expression
» пишем::RN > 3
И остается только добавить альтернативный шаблон (в поле «
Column Template 2
«):<td class="t-Report-cell highlighted" #ALIGNMENT# headers="#COLUMN_HEADER_NAME#">#COLUMN_VALUE#</td>
Здесь к стандартному классу ячейки (
td
) добавлен классhighlighted
. Теперь осталось нажать на кнопку «Apply Changes». - Возвращаемся в Page Designer. Находим наш отчет, в свойстве «
Attributes
» → «Appearance
» → «Template
» выбираем из списка наш новый шаблон «Standard with highlight». - Как и в предыдущем примере, в свойствах страницы («
CSS
» → «Inline
«) описываем наш новый классhighlighted
:
.highlighted {
background-color: lightyellow !important;
}
Сохраняем страницу, проверяем результат (он должен быть как на картинке в начале статьи).
Добавляем интерактива
События вида «клик на строке отчета»
Одна из часто встречающихся задач — определить номер строки, на которую кликнул пользователь. За события в браузере в апексе отвечают компоненты Dynamic Action (DA). К сожалению, несмотря на большое количество самых разных их видов, типового DA для обработки клика на строке отчета нет. Но его относительно просто сымитировать. В качестве примера сделаем Master-Detail отчет из двух Classic Report на основе отчета из предыдущего раздела.
Вторым отчетом здесь будет выступать таблица с номерами телефонов. По клику на первой таблице она будет обновляться и показывать номер телефона выбранного человека (причем без перезагрузки страницы!). Для этого отчета создадим еще один регион типа «Classic Report».
Запрос будет, например, такой
with phone as (
select 1 id, '1684313' phone_num from dual union all
select 2, '6843513' from dual union all
select 3, '8916311' from dual union all
select 4, '6843213' from dual union all
select 5, '6513218' from dual union all
select 6, '9561311' from dual union all
select 7, '9843135' from dual)
select phone_num
from phone
where id = :P2_ROW_ID
Необходимые составляющие решения:
-
Способ идентификации выбранной пользователем строки. Для этой цели подойдет столбец
ID
. К сожалению, если этот столбец пометить как скрытый (очень часто лишние айдишники не показывают пользователю, чтобы не перегружать интерфейс), он не будет рендериться движком вообще, и эти данные никак не будут присутствовать на странице. Но их можно добавить к существующему столбцу тем же способом, что использовался для форматирования вывода. Возьмем какой-нибудь столбец (например, первый из видимых) и в поле «Column formatting
» → «HTML Expression
» напишем:<span class="click" data-id="#ID#"></span>#NAME#
Можно этот код и прямо в SQL запрос вставить, но лучше не надо
Есть другой вариант сделать то же самое — добавить этот HTML код прямо в запрос:
select id, '<span class="click" data-id="' || id || '"></span>' || name as name from ...
Результат в целом будет тот же, но перестанет работать сортировка по полю
name
, потому что движок СУБД будет считать всю эту строку данными и сортировать по ней. А если делать через «Column formatting
«, то данные, по которым будет делаться сортировка, не будут содержать ничего лишнего.
К тому же, в этом случае для вывода HTML кода в столбце вам придется отказаться от экранирования спецсимволов, а это еще и потенциальная дыра в безопасности. - Идентификатор отчета (на случай, если на странице таких отчетов больше одного). У региона есть свойство «
Advanced
» → «Static ID
«, поместим туда значениеmy_rep
. Значение этого свойства используется в HTML коде страницы. Элементdiv
, который содержит регион, получит атрибутid
с этим значением. Если поле «Static ID
» пустое, апекс будет использовать для атрибутаid
идентификатор региона из системных таблиц. На него лучше не полагаться, потому что при переносе приложения на другой сервер этот идентификатор может поменяться практически гарантированно изменится. - Итем для временного хранения значения
ID
выбранной строки. Создадим итемP2_ROW_ID
с типом «Hidden
» (это название, как вы могли видеть, используется в запросе, возвращающем список телефонов). -
Далее нужно создать Dynamic Action. Открываем Page Designer, в левой панели на закладке «Dynamic Actions» находим ветку «Click», кликаем на ней правой кнопкой, выбираем в меню «Create Dynamic Action». Далее нужно заполнить следующие свойства DA:
- «
Identification
» → «Name
«: какое-нибудь осмысленное имя, иначе вы потеряетесь в этих бесконечных «New», «New2», «New3» и т. д.; - «
When
» → «Selection Type
«: «jQuery Selector
«; -
в появившемся далее поле «
jQuery Selector
«: здесь можно указать селектор, который будет указывать на дополнительный невидимыйspan
с идентификатором строки:#my_rep table.t-Report-report tr
- «
Далее у этого DA создадим действия («True Actions
«):
-
Первое действие получает
ID
выбранной строки и сохраняет его в итем. Нужно установить следующие значения свойств: «Action
» — «Set Value
«, «Set Type
» — «JavaScript Expression
«, «JavaScript Expression
» — следующий код:this.triggeringElement.querySelector('span.click').dataset.id
В свойстве «
Affected Elements
» → «Selection Type
» выбрать «Item(s)
«, в свойстве «Item(s)
» указать итемP2_ROW_ID
. - Второе действие отправляет на сервер значение итема. Свойства: «
Action
» — «Execute PL/SQL Code
«, «PL/SQL Code
» — простоnull;
, «Items to Submit
» —P2_ROW_ID
(собственно, всё это действие нужно ради отправки значения итема на сервер — более простого способасделать это нет; как вариант, вместо этих двухActions
можно сделать одно с голым джаваскриптом внутри, который и значение вычислит, и на сервер отправит — и это будет даже не сильно сложнее). - Третье действие обновляет второй (Detail) отчет. Свойства: «
Action
» — «Refresh
«, «Affected Elements
» → «Selection Type
» — выбрать «Region
«, в «Region
» выбрать второй регион с телефонами.
Примечание о Dynamic Action
В будущем я напишу отдельную подробную статью про DA и многие другие компоненты апекса начального уровня, чтобы любой новичок сразу понял, как и что из описанного далее работает, а пока представим, что читатель все это уже знает.
На этом всё. Если вы сделали все эти шаги и ничего не пропустили, у вас на странице будут два отчета, и при клике на любой строке первого отчета второй будет обновляться и показывать данные выбранного человека.
Изменение данных с помощью Classic Report
В апексе с древних версий существовал вид отчета, известный как Tabular Form (он и сейчас в принципе существует, хотя и помечен как Legacy), который позволял изменять данные в нескольких строках таблицы сразу. На смену ему пришел намного более мощный Interactive Grid. Здесь же я продемонстрирую, как из подручных средств можно собрать аналог теплого лампового Tabular Form. Возьмем ту же таблицу, что и в прошлом примере, и добавим возможность редактировать имя и фамилию человека.
Для редактирования данных, количество которых заранее неизвестно даже приблизительно, нам понадобятся пакеты APEX_ITEM
и APEX_APPLICATION
. Первый позволяет создавать любые итемы в рантайме (созданием, в данном случае, является генерация соответствующего HTML), а второй — получать доступ к данным, введенным в созданные в рантайме поля.
Рассмотрим на примере функции APEX_ITEM.TEXT
(она возвращает HTML код простого текстового инпута). Вот как объявлена эта функция в документации:
APEX_ITEM.TEXT(
p_idx IN NUMBER,
p_value IN VARCHAR2 DEFAULT NULL,
p_size IN NUMBER DEFAULT NULL,
p_maxlength IN NUMBER DEFAULT NULL,
p_attributes IN VARCHAR2 DEFAULT NULL,
p_item_id IN VARCHAR2 DEFAULT NULL,
p_item_label IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2;
Параметры начиная со второго описывают, что будет содержать HTML код: значение в поле для ввода, дополнительные атрибуты, ограничения на длину и т. п. Самый важный в нашем случае параметр — первый (он же единственный обязательный, остальные имеют дефолтные значения). Этот параметр может принимать значения от 1 до 50, и потом введенное здесь число будет использоваться для доступа к данным, введенным пользователем. Каждому числу соответствует PL/SQL коллекция APEX_APPLICATION.G_FXX
, где XX
— это 01
, 02
,… 50
.
Для нашей задачи нужны три поля таблицы: id
, name
, surname
. Первое должно быть скрытым, второе и третье — полями для ввода.
-
Создаем отчет на базе SQL запроса:
select apex_item.hidden(1, id) || apex_item.text(2, name) name, apex_item.text(3, surname) surname, birthdate, examdate from students
- В свойствах столбцов
NAME
иSURNAME
убираем экранирование символов: в «Security
» → «Escape special characters
» ставим «No
«. - Создаем кнопку «
Save
«, настройки можно оставить по умолчанию. -
Создаем процесс «
After Submit
» со свойствами: «Identification
» → «Type
» — «PL/SQL
«; «Server-side Conditions
» → «When Button Pressed
» — кнопка «Save
«. И код для сохранения данных в БД:begin for i in apex_application.g_f01.first .. apex_application.g_f01.last loop update students set name = apex_application.g_f02(i), surname = apex_application.g_f03(i) where id = apex_application.g_f01(i); end loop; end;
Как видите, выглядит совсем просто. Осталось только упомянуть один неприятный подводный камень в работе с APEX_ITEM
. Если вы таким образом хотите добавить в отчет чекбоксы:
select ... apex_item.checkbox2(4, id) from students
То у вас в коллекции APEX_APPLICATION.G_F04
окажется столько элементов, сколько чекбоксов отмечено, в то время как во всех остальных коллекциях число элементов будет равно числу строк, отображенных на экране, а в содержимое коллекции попадет значение, которое вы передаете вторым параметром в функцию apex_item.checkbox2
. Таким образом, если вы используете коллекцию с данными из чекбоксов в коде, аналогичном приведенному выше, вы можете столкнуться с исключением NO DATA FOUND
.
Interactive Report (IR)
Interactive Report — это готовый к применению многоцелевой комбайн, в котором из коробки есть огромное количество функций для работы с данными. Все, что нужно, это включить их в настройках (точнее, не отключать, потому что по умолчанию там почти всё включено). На странице IR выглядит почти как обычный отчет, только над ним есть еще дополнительная панель с полем ввода для поиска и кнопкой «Actions
«. Кнопка «Actions
» показывает дополнительное меню, из которого доступны все остальные функции. Я только вкратце перечислю возможности:
- Панель поиска: позволяет искать заданный текст во всех столбцах отчета;
- «
Actions
» → «Columns
«: настройка отображения столбцов (порядок следования, скрыть/показать); - «
Actions
» → «Filter
«: инструменты фильтрации данных, позволяют выбрать поле, операцию фильтрации (больше, меньше, равно, содержит текст, и т. д.); - «
Actions
» → «Data
«: манипуляции с данными (сортировка, вычисления, агрегирование и Flashback); - «
Actions
» → «Format
«: настройка отображения данных; позволяет подсвечивать нужные данные (настраиваются цвета подсветки и условия на данные), делать Control Break (не знаю, как это называется по-русски, выглядит это так), выбирать число строк отчета на странице; - «
Actions
» → «Chart
«, «Group by
«, «Pivot
«: названия говорят сами за себя — построение диаграмм, графиков, сводных отчетов на основе данных IR; - «
Actions
» → «Report
«: позволяет конечному пользователю сохранить отчет с определенным именем. В этом случае сохранятся все сделанные настройки из всех пунктов меню, описанных выше, и у каждого пользователя они будут свои; - «
Actions
» → «Download
«: экспорт данных, поддерживаются 5 форматов: CSV, PDF, XLS, HTML, RTF.
Что из перечисленного выше будет доступно пользователю, настраивается в свойствах отчета: «Attributes
» → группы свойств «Search Bar
«, «Actions Menu
«, «Download
«.
К Interactive Report применимо практически все то же самое, что и к Classic Report. Точно так же можно делать собственное форматирование столбцов, использовать HTML элементы в столбцах (отключая при этом экранирование спецсимволов). Также есть дополнительный тип столбца — «Remove HTML
«, который убирает HTML теги из результата запроса (я лично ни разу не сталкивался с тем, чтобы это было нужно).
Но есть пара нюансов, на которые стоит сразу обратить внимание.
Во-первых, у IR в атрибутах отчета нет свойства «Template
«. То есть если вы разрабатываете своё собственное оформление, CSS-стили и прочее, то вы в пролете — IR будет выглядеть только так, как это заложено в него изначально. Выбирать придется из того, что есть. (Точнее, способ все-таки есть, но такой окольный, что проще считать, что его нет.)
Во-вторых, очень коряво устроена настройка порядка следования столбцов. Поле «Sequence
» у столбцов есть, но оно не работает. Чтобы изменить порядок столбцов, вам придется сделать следующее: создать отчет, запустить страницу с ним, открыть меню «Actions
» → «Columns
» и настроить порядок через него. Далее нужно сохранить: там же в «Actions
» → «Report
» выбрать «Save Report
«, а в появившемся окне выбрать тип «Primary
» — тогда текущий вид отчета сохранится для всех пользователей как основной (а чтобы тип «Primary
» был доступен, вы должны быть залогинены в IDE как разработчик и запустить страницу из IDE).
Interactive Grid (IG)
Interactive Grid — это логическое продолжение Interactive Report. Впервые он появился в версии 5.1. IG выглядит почти как IR, но в дополнение он имеет режим редактирования, а также несколько дополнительных возможностей. Еще IG имеет богатое javascript API, но публичным оно стало только совсем недавно (версии с 18.2, кажется). По этой причине я не успел с ним достаточно хорошо ознакомиться.
Как мы жили в те тяжелые времена, которые наконец-то закончились
До публикации документации приходилось довольствоваться только циклом из четырех статей (раз, два, три, четыре), основанных, как я понимаю, на результатах реверс-инжиниринга в браузерном отладчике. Вся официальная документация для версии 5.1, с которой я работал больше всего, выглядела вот так:
(ссылка)
Возможно, вы будете смеяться (а мне тогда было не смешно), но даже эта единственная документированная строчка кода была неправильной. Чтобы добавить строку к отчету (код делает именно это), вместо .invoke( "add-row" )
нужно было написать .invoke( "row-add-row" )
.
Но теперь-то, надеюсь, заживем.
А вообще, я не люблю Interactive Grid, и вот послушайте, почему
Первая причина изложена в предыдущем спойлере. Она уже частично недействительна (раз уж документация вышла), хотя версии 5.х по-прежнему остаются недокументированными, а документацию из более поздних версий нужно использовать осторожно. Вряд ли там будет написано, что именно появилось нового по сравнению с предыдущими версиями. Ну и вообще — «осадочек остался».
Вторая причина (общая с IR) — это архитектурная кривизна. Для настройки (и сохранения настроек) порядка столбцов нужно запустить страницу с отчетом, настроить всё на странице и потом сохранить отчет через интерфейс. В IDE по-прежнему настроить нельзя. Конкретно в IG появилась и другая проблема: там добавили возможность менять ширину столбцов мышкой, но если вы поменяете ширину одного столбца, ширина всех остальных столбцов тоже изменится, причем совершенно непредсказуемым образом. Например, если у вас 5 столбцов и вы уменьшаете ширину первого, остальные четыре станут шире, каждый по чуть-чуть. А если вам нужно сделать так, чтобы первые три были одинаковые, а остальные два — как получится, на все оставшееся место, то лучше забудьте сразу, мышью это не сделать (это можно сделать через меню «Actions» → «Columns»: там можно тупо вбить руками количество пикселей).
И третье — это глючность. Может, в последующих версиях это и пофиксили, но в 5.1 я несколько раз натыкался на баги IG. Один раз IG перестал сохранять данные, введенные в режиме редактирования, и несколько раз — не сохранял настройки отчета через меню «Actions
» → «Report
» → «Save
«. В каждом случае помогало только пересоздание отчета с нуля. При активной разработке напарываться раз в месяц на такой баг — это много, по-моему.
Создание столбцов не через SQL
Если в Classic Report или в Interactive Report столбцы создавались только на основе SQL запроса (столбцов в отчете может быть ровно столько, сколько их есть в SQL запросе), то в IG кроме этих столбцов можно создать дополнительные. Для этого нужно кликнуть правой кнопкой на списке столбцов в левой панели и выбрать пункт «Create Column
«. После этого появится столбец, которому можно в свойстве «Source
» → «Type
» указать «None
» (и тогда он будет полностью независим от SQL запроса, на базе которого создан отчет), или указать «Database Column
» / «SQL Expression
» и заполнить его данными на основе результатов запроса. Это удобно, потому что раньше иногда приходилось делать в запросе дубликат столбца с дополнительными вычислениями. И неудобно при отладке, если злоупотреблять (придется выяснять сначала, какой столбец откуда берется), поэтому лучше не злоупотреблять.
Новые типы столбцов
Новых типов столбцов (по сравнению с IR) добавили очень много. Новые типы:
- «
Actions Menu
«. Столбец такого типа будет выглядеть как кнопка с иконкой-«бутербродом» (три горизонтальные полоски — кажется, это называется «бутерброд»?). Эта кнопка активирует меню с действиями над строками — добавить, удалить, сделать копию строки и т. д. - «
Checkbox
«. Столбец будет показывать чекбоксы, но функционально это будут не такие чекбоксы, как в случае со столбцом типа «Row Selector
» (см. ниже). Про то, что из себя представляют чекбоксы в апексе, я расскажу отдельно (там можно много чего рассказать), пока только скажу, что чекбоксы — это не то, чем они кажутся. - «
Color picker
«. Натурально, выбор цвета, почти как в фотошопе. Я даже скриншот вам покажу:
- «
Row Selector
«. Столбец этого типа содержит чекбокс, которым можно выделять строки, а потом, при необходимости, к этим строкам можно обращаться в javascript или PL/SQL коде. - остальные («
Date picker
«, «Number field
«, «Password
«, и куча других) — это дополнительные настройки для ввода данных в режиме редактирования. То есть вместо создания таких полей вручную через пакетAPEX_ITEM
(как это было в примере для Classic Report) теперь можно указать нужный тип столбца.
При этом почему-то из типов столбцов убрали «Download BLOB
«. То есть ссылку на файл не получится сделать так же просто, как это можно было в Interactive Report и даже в Classic Report. И вот тут я не понял — кому этот тип мешал? (Этот пункт тоже можно добавить в раздел «почему я не люблю IG».)
Master-Detail отчеты на основе IG
С IG стало намного проще делать Master-Detail отчеты. Не нужно ничего из того, что описано для Classic Report выше. Код писать больше не нужно, достаточно создать два IG отчета. Далее в Master отчете выбираем столбец, являющийся первичным ключом, и указываем у него это свойство (свойства столбца → «Source
» → «Primary Key
» указываем «Yes
«). В Detail отчете в свойствах отчета находим «Master-Detail
» → «Master Region
» и в выпадающем списке выбираем нужный регион. Потом находим столбец, который является внешним ключом, в свойствах столбца находим «Master-Detail
» → «Master Column
» и выбираем из списка нужный столбец. Теперь всё должно заработать. При клике на строке Master отчета данные в Detail отчете будут обновляться.
Обработка ввода данных в IG
И последнее, что хотелось бы сказать об IG — как сделать дополнительную обработку данных, введенных в режиме редактирования. Из коробки IG умеет только вставлять новые строки или изменять/удалять существующие. Теперь, допустим, нужно сделать отчет (на базе таблицы STUDENTS
из примера выше) с возможностью редактирования данных и ввода новых строк, а также сделать дополнительную проверку данных: когда пользователь вводит имя и фамилию, нужно убедиться, что первая буква — прописная, а остальные — строчные. Для этого нужно создать IG отчет на базе запроса к таблице STUDENTS
:
select id, name, surname, birthdate, examdate
from students
Сделать его редактируемым («Attributes
» → «Edit
» → «Enabled
«), потом зайти на закладку «Processing
«, найти там созданный апексом процесс для сохранения данных IG (по умолчанию он будет называться примерно так: «IG — Save Interactive Grid Data»), и в свойстве «Settings
» → «Target Type
» указать «PL/SQL Code
«, а в появившемся поле «PL/SQL Code to Insert/Update/Delete
» написать следующий код:
begin
:NAME := initcap(:NAME);
:SURNAME := initcap(:SURNAME);
case :APEX$ROW_STATUS
when 'I' then
insert into students (name, surname, birthdate, examdate)
values (:NAME, :SURNAME, :BIRTHDATE, :EXAMDATE);
when 'U' then
update students
set name = :NAME,
surname = :SURNAME,
birthdate = :BIRTHDATE,
examdate = :EXAMDATE
where id = :ID;
when 'D' then
-- 'D' означает удаление, в случае удаления строк
-- тоже какой-то код выполнить можно
end case;
end;
Этот код будет выполнен для каждой строки отчета. Специальная переменная APEX$ROW_STATUS
при этом содержит значения I
, U
или D
(insert, update, delete) в зависимости от того, что происходит с текущей строкой (добавляется новая, изменяется/удаляется старая). Чтобы обратиться к данным столбцов, необходимо следующее (апекс делает это автоматически, вмешиваться практически не нужно): когда вы создаете отчет и указываете имя столбца в SQL-запросе, это имя будет указано потом в качестве источника данных в свойствах столбца отчета, и его же потом нужно использовать в коде выше для получения доступа к обновленным данным. В данном случае, используются столбцы NAME
, SURNAME
, BIRTHDATE
и EXAMDATE
.
Также при необходимости можно использовать переменную APEX$ROW_NUM
, которая содержит порядковый номер строки, обрабатываемой в данный момент, и APEX$ROW_SELECTOR
, которая содержит значение X
для строк, выделенных с помощью чекбоксов в столбце типа «Row Selector
«.
Автор: StrangerInTheKy
Источник
Недавно я с удивлением обнаружил, что, оказывается, толковых туториалов по Oracle Application Express (он же APEX, он же апекс, но не путать с языком apex, который используется в Salesforce) в природе не существует.
Это не самая распространенная технология, конечно, но, тем не менее, довольно востребованная. Есть десятки блогов об апексе (англоязычные, в основном), пара тысяч вопросов на Stackoveflow, специальный раздел по апексу на официальных форумах оракла, сам апекс существует уже 15 лет и все время развивается. Я был уверен, что и хороших туториалов полно. Но нет!
Мне тут же пришла в голову гениальная мысль восполнить этот пробел.
Оглавление
Почему существующие туториалы — плохие
Вводная информация
Обзор IDE
App builder
Страница приложения
Shared Components
Page Designer
SQL Workshop
Object Browser
SQL Commands
Почему существующие туториалы — плохие
Я немного поясню, почему я считаю существующие туториалы плохими. Апекс — это не язык программирования, это такой очень высокоуровневый инструмент разработки, ближайшим идейным аналогом которого я бы назвал MS Access. Соответственно, большая часть разработки на апексе состоит из работы с веб-интерфесом этой среды: нажимания на кнопки, перехода по ссылкам, заполнение полей с названиями компоментов, выбора значений из списков и так далее. Что делает типовой туториал? Он показывает скриншоты этих самых экранов с подписями «нажмите туда-то». При этом сама IDE достаточно удобная и понятная, почти все элементы снабжены справочными пояснениями, есть встроенная помощь. В итоге, если нужно объяснить пользователю, как создать приложение, в туториале будет большой скриншот, объясняющий, как нажать на кнопку «Create a new app». Вот, посмотрите сами на официальный оракловый туториал:
Они бы еще объяснили со скриншотами, что «клик» — это однократное нажатие на левую кнопку манипулятора типа «мышь».
Конечно, полезная информация в таких туториалах тоже есть, но ее там крохи. Процентов на 80 туториалы состоят из таких вот скриншотов, причем по своему опыту я могу сказать, что человек, не читавший никаких туториалов вообще, самостоятельно найдет, как создать приложение, добавить страницу, поместить на нее отчет и так далее. А потом ему нужно будет организовать более-менее нетривиальное взаимодействие нескольких элементов апекса, и оказывается, что этот вопрос туториалом почти не покрывается. Приведу аналогию: вы только-только учитесь программировать, изучили переменные, массивы, циклы, условия, и получили задание, в рамках выполнения которого вам нужно отсортировать массив. Как-то отсорировать массив — достаточно просто, но как только задание усложнится до «отсортировать большой массив быстро«, окажется, что имеющихся у вас знаний недостаточно. Погуглив, покопав Stackoverflow и форумы, вы найдете алгоритм быстрой сортировки. Конечно, кто-то и сам переизобретет этот алгоритм рано или поздно, но более эффективным путем было бы сразу прочитать книжку с разбором типовых алгоритмов. И вот как раз такого набора «типовых алгоритмов» для апекса обычно нигде нет, а на помощь приходят те же самые метод научного тыка, поисковики, форумы и Stackoverflow (и, я надеюсь, этот туториал).
Вводная информация
Предполагается, что читатель знаком с Oracle Database версии хотя бы с 11-й, SQL, PL/SQL и особенно с тем, что такое EXECUTE IMMEDIATE
и как оно работает.
IDE апекса значительно изменилась при переходе с версии 4.2 на 5.0 (релиз был как раз 4 года назад, в марте 2015-го). С тех пор IDE меняется мало, но иногда добавляются новые возможности. Я буду делать скриншоты на apex.oracle.com, где сейчас установлена версия 19.1, но если у вас где-то используется более ранняя версия (5.х, 18.х), вы без труда найдете нужный элемент, если только он не появился в более поздней версии, чем ваша.
Я начну с обзора наиболее часто используемых разделов IDE. Я тоже покажу несколько скриншотов. Куда же без них, раз всё здесь сделано из визуальных компонентов. Но их будет не так много, как в плохих туториалах, и в основном они будут в начальных главах, а дальше я буду просто указывать название раздела IDE, в котором находятся необходимые вещи. Сразу обращу ваше внимание, что это просто первое знакомство с IDE. Более подробная информация о том, когда на какую кнопку нажимать и где что смотреть, будет дана дальше, когда я перейду к конкретным темам.
Поехали.
Обзор IDE
Стартовый экран, который вы увидите сразу после входа в IDE:
Главные элементы здесь — это 4 большие кликабельные картинки:
- App Builder — это, собственно, то место, где можно создавать приложения и где вы будете проводить до 99% времени.
- SQL Workshop — заменитель обычной IDE для работы с СУБД Oracle. Там вы можете посмотреть объекты БД (таблицы, индексы, пакеты, и т. п.) и выполнять SQL-запросы. Если у вас есть возможность делать все это через «обычные» IDE (вроде Oracle SQL Developer или PL/SQL Developer) — делайте через них. Тем не менее, этот раздел тоже может быть полезен и о нем я тоже расскажу.
- Team Development — инструменты для командной разработки. Честно говоря, я ни разу не видел, чтобы хоть кто-то ими пользовался на практике (включая меня). Любопытства ради я туда тоже заглядывал и совсем бесполезным этот раздел я бы не назвал, хотя и очень хочется.
- App Gallery — раздел с демо-приложениями. К тому моменту, когда он появился, я уже неплохо знал апекс и почти не заглядывал туда, но начинающим, думаю, это будет полезно. Там много разных простеньких приложений, на их примере можно изучать, как использовать те или иные возможности.
В меню в самом верху страницы продублированы эти же 4 пункта.
Кроме этого, есть еще несколько малополезных вещей: ниже есть некоторое количество статистической информации (типа наиболее часто редактируемых приложений или наиболее активных разработчиков). И есть колонка справа, где также немного статистики и дополнительных ссылок.
Рассмотрим App Builder и SQL Workshop подробнее.
App builder
Эта страница выглядит примерно вот так:
Основные элементы этой страницы: четыре большие кнопки как на предыдущей странице, список уже имеющихся приложений, правая колонка со списком последних измененных приложений и дополнительными действиями. Четыре кнопки — это:
- «Create» — создать новое приложение. Эта же функция продублирована чуть ниже (синяя кнопка «Create» над отчетом со списком приложений). Кнопка запускает мастер создания приложений.
- «Import» — импортировать приложение. Апекс позволяет переносить приложения с одного сервера на другой в виде текстовых файлов (которые, по сути, являются длииииными PL/SQL скриптами с вызовами функций создания всех элементов приложения).
- «Dashboard» — малополезное сборище статистики разработки приложений. Кто, когда, где, сколько изменений сделал. Думаю, даже вашему начальнику будет неинтересно туда смотреть.
- «Workspace Utilities» — набор дополнительных инструментов для управления приложением. Честно говоря, туда я тоже почти не заглядываю.
Так же хочу обратить ваше внимание на вот такую маленькую кнопочку в панели отчета:
Она переключает вид отчета с такого, как на скриншоте выше (с «картинками» приложений) на отчет в виде таблицы:
Похожие отчеты встречаются и в других разделах IDE. Я предпочитаю табличный вид, поэтому далее все скриншоты будут с ним.
Страница приложения
После того, как вы создадите приложение или откроете существующее, вы увидите следующую страницу (очень похожую на предыдущую по структуре):
На эту страницу вы будете заходить очень часто, и полезных функций здесь тоже очень много. Большие кнопки с картинками:
- «Run Application». Эта кнопка запускает ваше приложение. Оно откроется в отдельном окне. По умолчанию — именно в окне, а не во вкладке браузера, но это поведение настраивается (об этом позже).
- «Supporting Objects». Этот раздел служит для решения вопросов, связанных с установкой, обновлением и удалением приложений. Обычно им почти не пользуются.
- «Shared Components» — я бы сказал, это первый или второй по важности раздел IDE (еще один — редактор страниц). Если вы будете много разрабатывать на апексе, то очень скоро заметите, что выучили структуру этого раздела как «Отче наш».
- «Utilities» — еще один набор (мало)полезных вспомогательных функций.
- «Export / Import». Позволяет экспортировать или импортировать приложения или отдельные части приложения.
И две дополнительные кнопки, которые обведены оранжевой рамкой на скриншоте:
- Кнопка «Edit application properties». Нажав на нее, вы попадете на страницу настроек свойств приложения. Возможно, вы не будете заходить в этот раздел часто, но он очень важен, потому что там хранятся настройки приложения, от которых много чего зависит. Далее, если я буду упоминать где-то «свойства приложения» — ищите их в этом разделе.
- В кои-то веки полезная функция в правой панели: «Delete this Application». В то время как многие функции в апексе продублированы в разных местах, эта функция есть только здесь, и с непривычки первый раз ее найти сложно.
Shared Components
Shared Components — это наше всё. Этот раздел является промежуточным пунктом на пути к конкретным компонентам приложений. Покажу здесь общий вид, просто чтобы вы представляли, где что находится:
Совсем неважной ерунды здесь почти нет. Каждый раздел вам так или иначе может понадобиться. Названия разделов говорят сами за себя, добавить почти нечего:
- Application Logic — средства управления логикой приложения.
- Security — вопросы безопасности и управления доступом к приложению целиком и к отдельным компонентам в зависимости от ролей пользователей.
- Other Components — это «все остальные компоненты». По-хорошему, этому разделу следовало бы быть последним, но он почему-то здесь. А подпункт «List of Values» я бы вообще в Application Logic перенес.
- Navigation — компоненты приложения для обеспечения навигации.
- User Interface — настройка внешнего вида приложения, стилей и т. п.
- Files — раздел для файлов (например, css или js). Незаменим, если у вас нет доступа к ОС, и все равно удобен, даже если доступ есть.
- Data Sources — работа с источниками данных (для загрузки и выгрузки).
- Reports — отчеты, очевидно.
- Globalization — раздел для перевода приложений на другие языки.
Плач Ярославны о переводе приложений в апексе
Перевод приложений в апексе сделан просто ужасно (честно, я пытался придумать, как сделать его хуже — и не смог), и нет никаких свидетельств того, что в будущем станет лучше.
Ужасно с точки зрения архитектуры и удобства работы над переводом. Могу только сказать разработчикам: «Спасибо, что хотя бы без багов» (но тут как посмотреть: переводы устроены так, что некоторые особенности их работы мало чем отличаются от багов).
Приходится с этим жить.
Page Designer
Page Designer — редактор страниц. Это, наверное, главное место в IDE. Здесь вы будете создавать то, с чем напрямую взаимодействует пользователь. Здесь просто куча функций, почти как в кабине самолета. На скриншоте разноцветными рамками выделены основные составляющие редактора:
Панель кнопок вверху (в красной рамке):
- Поле для ввода номера страницы, стрелки вверх и вниз и кнопка «Go»: навигация по страницам приложения. Каждая страница имеет номер, тут вы можете либо ввести номер нужной страницы, либо стрелками перейти к следующей/предыдущей, либо нажать на самую левую кнопку и в появившемся модальном окне выбрать страницу из списка.
- Кнопка с замком: позволяет заблокировать страницу от изменений другими разработчиками.
- Кнопки Undo/Redo
- Две кнопки с доступом к вспомогательным функциям.
- Кнопка-ссылка на Shared Components. Полезная, потому что туда-сюда ходить приходится постоянно. (Я сам, правда, предпочитаю просто держать Shared Components в отдельной вкладке — так еще быстрее).
- Кнопка «Save» — сохраняет изменения на странице.
- Кнопка «Run» — «запускает» страницу, то есть вы ее видите так, как ее потом увидит пользователь.
Слева (в оранжевой рамке) — панель с компонентами приложения. В этой панели есть 4 закладки:
- «Rendering» — показывает, из каких составных частей состоит страница, какие процессы выполняются при рендеринге;
- «Dynamic Actions» — действия, выполняемые на клиенте (например, обработчики событий javascript);
- «Processing» — серверные процессы, связанные со страницей;
- «Page Shared Components» — для прямого перехода к используемым на странице общим компонентам (те самые Shared Components).
По центру (в зеленой рамке) — панель, содержащая много разнородной информации. В верхней части панели есть 5 закладок, на которых можно найти:
- «Layout» — показывает примерное расположение компонентов на странице;
- «Component view» — по большому счету, это пережиток прошлого (похожим образом выглядел редактор страниц в 4-й версии апекса, в версии 5.0 или 5.1 этот старый «вид» получил статус deprecated, хотя и использовался параллельно с новым, а теперь тут осталась лишь его бледная тень);
- «Messages» — тут будут сообщения об ошибках (например, сообщение о том, что не заполнено какое-нибудь обязательное поле);
- «Page Search» — поиск на странице. Ищет искомую строку во всех местах, где вы можете что-то вводить (в коде, в текстах сообщений, в названиях компонентов и т. д.);
- «Help» — помощь. Довольно толковая, хотя и не всегда. Можно выбрать какое-нибудь свойство компонента и посмотреть его описание.
Также центральная панель имеет снизу еще одну дополнительную панель, которую можно использовать для быстрого добавления компонентов на страницу.
Справа (в синей рамке) — панель свойств. Тут все просто — она показывает свойства выбранного в данный момент компонента.
SQL Workshop
Как я уже говорил, SQL Workshop — это заменитель обычной IDE (если у вас по каким-то причинам нет возможности ее использовать).
Он состоит из 5 разделов:
- Object Browser — браузер объектов БД (таблиц, пакетов, функций и процедур, индексов, сиквенсов и прочего);
- SQL Commands — раздел, где можно выполнить любой SQL запрос или PL/SQL код;
- SQL Scripts — здесь можно загрузить текстовый файл со скриптом и выполнить его;
- Utilities — разные дополнительные возможности, связанные с БД: например, есть графический построитель запросов (но не только);
- RESTful Services — создание REST сервисов. Апекс тоже имеет REST (причем давно, еще в версии 4.2 они уже были)!
Object Browser
Здесь есть все, что нужно для работы с объектами БД: создание, изменение, удаление, просмотр свойств объектов, ввод данных в таблицы — для всего этого в этом разделе есть графический интерфейс. Вверху слева в выпадающем списке можно выбрать тип объектов (на скриншоте показаны таблицы), вверху справа можно выбрать схему, объекты которой вы можете посмотреть. В списке доступных схем вы не увидите все схемы сразу — это нормально. Как сделать схемы видимыми в апексе, я расскажу, когда дойду до администрирования.
Также я не вижу большого смысла описывать этот раздел подробнее: если вы знаете, что значит фраза «добавить столбец в таблицу», вы без труда догадаетесь, когда вам нужно будет нажимать на кнопку «Add Column» и что вас может ждать дальше.
SQL Commands
В этом разделе можно выполнять SQL запросы и PL/SQL код.
По возможностям этот раздел почти не уступает полноценным средам разработки. Не хватает разве что автодополнения кода и подсветки синтаксиса (а в Object Browser подсветка синтаксиса есть, кстати). Имеющиеся возможности:
- выполнение SQL, в том числе с параметрами (для ввода значений параметров появится отдельное окно);
- выполнение PL/SQL с возможностью вывода текста через dbms_output (вывод появится в окне ниже);
- выполнение только выделенной части кода (выделить текст мышкой, затем «Run»);
- просмотр плана запроса;
- сохранение запросов.
***
Это, как вы понимаете, далеко не всё, что есть в IDE APEX, но на данном этапе не имеет смысла углубляться дальше. Отдельные элементы интерфейса апекса будут разобраны более подробно в темах, которые имеют к ним непосредственное отношение.
P. S. Я пока не могу сказать, что четко продумал структуру этого туториала, возможно, в будущем я добавлю еще скриншоты и описания в эту статью или опишу дополнительные возможности в других статьях. Осталось придумать, как оповещать заинтересованных о значительных правках старых статей.