跳转到主要内容

大约10年前,我试图在MS SQLServer上构建APEX应用程序。这是可能的,但表现不令人满意。(你可以在这里阅读这篇文章)……

今天我将介绍如何使用APEX和MySQL。显然,我不认为只在MySQL上构建APEX app是一个好主意。它可以作为Hybryd解决方案的一部分(Oracle + MySQL或Postrgres)。

我的描述涵盖了与MySQL的集成。从而实现了基于MySQL数据的交互式报表和CRUD表单的APEX应用。

描述包括两个部分:第一部分是一个MySQL站点,第二部分是一个APEX应用程序部分

先决条件:

  • Oracle 11 g +
  • 顶18.1 +
  • MySQL / Postgres
  • RestSQL

i . MySQL部分

1. MySQL包含一个apexutil表的简单apexdb数据库。

2. 要使用此数据库,请安装RestSQL。

RestSQL是什么?RestSQL是一个用于HTTP客户机的开源的、超轻量级的数据访问层。RestSQL是经典三层体系结构(客户机、应用程序服务器和数据库)的中间层的持久性框架或引擎。它也可以作为Java库嵌入到任何中间层中。在项目主页上,您可以找到一些分发类型。我选择WAR是因为我可以将它部署在Tomcat上,与我使用的orb相同。

Instalation:

1. 编辑$TOMCAT_HOME/conf/context.xml文件,如(添加这行):

<Parameter name="org.restsql.properties" value="/etc/opt/restsql/restsql.properties" override="false" />

2. 在/etc/op /restsql/路径中创建文件  restsql.properties ,并粘贴到此信息中:

database.password = MySQL_Pass
database.user = root
sqlresources.dir = /etc/opt/restsql
database.url = jdbc:mysql://localhost:3306

3.下一个放置restql-X.X.XX.war文件,新名称为restql.war在$TOMCAT/webapps目录中,并弹跳TOMCAT服务器。

现在尝试连接到RestSQL模块:转到http://localhost:8080/restsql。如果你连接成功,创造资源。转到工具菜单,清除子目录字段,并在数据库字段中使用数据库名称,在我的例子中是apexdb。然后单击Generate按钮。在此过程中,RestSQL扫描MySQL数据库并基于表创建webservice定义。

现在是检查特定http端点的时候了。在RestSQL模块中,转到资源菜单http://localhost:8080/restsql/res/ 并单击“query/json”链接。

如果您看到json文本下面的结果,那么您就到了。你已经准备好了MySQL网站。接下来我们将转向Oracle这边:

{ "apexutils": [
  { "apx_id": 1, "apx_service": "Development", "apx_percentage": 75 },
  { "apx_id": 2, "apx_service": "Apex hosting", "apx_percentage": 3 },
  { "apx_id": 3, "apx_service": "Apex system sustain", "apx_percentage": 15 },
  { "apx_id": 4, "apx_service": "Other", "apx_percentage": 7 },
 ]
}

II Oralce APEX

要使用Web源作为交互式报表源,请准备“远程服务器”和“Web源模块”。转到共享组件并单击右侧侧边栏中的远程服务器。下一步使用创建按钮和填写字段:

准备“远程服务器”

创建Web源模块

然后创建Web源模块。转到共享组件并单击Web源模块链接。使用创建按钮,并遵循向导步骤:

步骤1(Step 1)

Step 2

Step 3

Step 4
Click Advanced !

Step 5

Step 6

现在您可以创建交互式报表了。没有基于外部数据构建IR的特殊步骤。在最后的向导步骤中设置数据源“Web source”并在Web source模块字段中选择“APEXUTIL”。

报告准备好了,但是如何操作MySQL数据从APEX上下文?

在APEX 18.1没有表单向导来构建基于Web源模块的表单。只有一个向导来构建基于“遗留Web服务引用”的表单/报告:(我希望它是临时状态,在未来会得到增强。(也许是我没有找到它……也许您知道如何使用新的“Web源模块”作为表单源?)在这种情况下,最好的解决办法是手工创建表单。转到用于构建IR的页面。添加静态内容区域,有4个项目和1个按钮,像这样:

P2_ID - hidden
P2_SERVICE - text field
P2_PERCENTAGE - text field
P2_START_DATE - data picker

添加编辑 (按钮)-操作(提交页面)

IR区域也必须改变。添加一个新的列(动态项目/复选框/)和删除按钮。APX_ID列也必须更改,使其作为一个链接。

更改APX ID列。

进入APX_ID列属性->链接,如下设置:

添加“检查”新列

转到交互式报表区域->本地后处理->类型:SQL查询,粘贴此查询:

SELECT
 APEX_ITEM.CHECKBOX2(1,APX_ID)  as CHECKS,
 APX_ID                         as APX_ID,
 APX_SERVICE                    as APX_SERVICE,
 APX_PERCENTAGE                 as APX_PERCENTAGE,
 APX_START_DATE                 as APX_START_DATE
from #APEX$SOURCE_DATA#

更改检查列的安全性部分->转义特殊字符->号

添加删除按钮-操作(提交页面)

保存更改并从IR操作菜单中选择检查列。现在页面看起来像截图:

UI准备好了,现在添加进程:

创建3个过程:

1. MySQL CRU操作

来源:PL / SQL代码

条件:服务器端条件->时按钮按下->附加物

declare
l_json        clob;
l_response    clob;
l_http_method varchar2(128);
parsed_json   apex_json.t_values;
begin
/* Start JSON request preparation */
apex_json.initialize_clob_output;
apex_json.open_object;
        apex_json.open_array('apexutils');
            apex_json.open_object;
                 if :P2_ID is not null then
                   /* Update process */
                   l_http_method := 'PUT';
                   apex_json.write('apx_id', :P2_ID);
                 else
                   /* Insert process */
                   l_http_method := 'POST';
                 end if;
                 apex_json.write('apx_service', :P2_SERVICE);
                 apex_json.write('apx_percentage', :P2_PERCENTAGE);
                 apex_json.write('apx_start_date', to_char(to_date(:P2_START_DATE,'DD-MON-YY'),'YYYY-MM-DD'));
            apex_json.close_object;
        apex_json.close_array;
apex_json.close_object;
           
l_json := apex_json.get_clob_output;
/* HTTP request preparation. ACL must be set */
apex_web_service.g_request_headers(1).name := 'Content-Type';
apex_web_service.g_request_headers(1).value := 'application/json';
l_response := APEX_WEB_SERVICE.MAKE_REST_REQUEST(
    p_url                  =>'http://192.168.56.101:8080/restsql/res/apexutil',
    p_http_method          =>l_http_method,
    p_body                 =>l_json)  ;
end;

2. MySQL 删除操作

来源:PL / SQL代码

条件:服务器端条件-按下按钮时> ->删除

declare
l_json        clob;
l_response    clob;
l_http_method varchar2(128);
parsed_json   apex_json.t_values;
begin
/* Start JSON request preparation */
apex_json.initialize_clob_output;
apex_json.open_object;
        apex_json.open_array('apexutils');
                /* Start process dynamic items. Read checked checkboxes */
                FOR i IN 1..APEX_APPLICATION.G_F01.COUNT LOOP 
                    apex_json.open_object;
                    apex_json.write('apx_id', APEX_APPLICATION.G_F01(i));
                    apex_json.close_object;
                END LOOP;
        apex_json.close_array;
apex_json.close_object;
            
l_json := apex_json.get_clob_output;
/* HTTP request preparation. ACL must be set */
apex_web_service.g_request_headers(1).name := 'Content-Type';
apex_web_service.g_request_headers(1).value := 'application/json';
l_response := APEX_WEB_SERVICE.MAKE_REST_REQUEST(
    p_url                  =>    'http://192.168.56.101:8080/restsql/res/apexutil',
    p_http_method          =>    'DELETE',
    p_body                 =>    l_json)  ;
end;

3.清除会话

类型:清除当前页面上的所有项目

条件:服务器端条件->时按钮按下->附加物

完成了!:)

 

如果你想看看它是如何工作的,请观看视频:

 

 

 

原文:https://apexutil.blogspot.com/2018/07/oracle-apex-with-mysql.html

本文:http://jiagoushi.pro/node/1183

讨论:请加入知识星球【仙翁快速和低代码开发】或者QQ群【1061766808】

Tags
 
知识星球
 
微信公众号
 
视频号