Oracle APEX中FamilyTree节点数据存入数据库的实现咨询
解决Oracle APEX家族树节点存入数据库的问题
第一步:创建存储节点的数据库表
先建一张专门存家族树节点的表,包含层级关联和基础属性,示例SQL如下:
CREATE TABLE FAMILY_TREE_NODES ( NODE_ID NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, PARENT_NODE_ID NUMBER REFERENCES FAMILY_TREE_NODES(NODE_ID), NODE_NAME VARCHAR2(100) NOT NULL, GENDER VARCHAR2(10), DATE_OF_BIRTH DATE, CREATED_DATE TIMESTAMP DEFAULT SYSTIMESTAMP );
NODE_ID自动生成作为主键,PARENT_NODE_ID关联自身表,用来体现家族树的层级关系,其他字段可根据你的需求增减。
第二步:在节点创建逻辑中加入存库代码
根据你当前创建节点的方式,分两种场景处理:
场景1:通过PL/SQL直接处理节点创建
如果是用户在页面输入节点信息后,点击按钮触发PL/SQL逻辑,直接在PL/SQL块里写插入语句即可:
DECLARE l_parent_id NUMBER := :P1_PARENT_ID; -- 从页面项获取父节点ID l_node_name VARCHAR2(100) := :P1_NODE_NAME; -- 从页面项获取节点名称 l_gender VARCHAR2(10) := :P1_GENDER; BEGIN INSERT INTO FAMILY_TREE_NODES (PARENT_NODE_ID, NODE_NAME, GENDER) VALUES (l_parent_id, l_node_name, l_gender); COMMIT; -- 刷新页面或家族树组件,展示新节点 APEX_UTIL.REDIRECT_TO_PAGE(:APP_PAGE_ID); END;
把这段代码绑定到页面按钮的「执行PL/SQL」动作上,页面项P1_PARENT_ID、P1_NODE_NAME用来收集用户输入的节点信息。
场景2:前端动态创建节点后批量保存
如果是用JavaScript拖拽或动态生成节点,需要先收集节点数据,再通过AJAX传给后端PL/SQL保存:
- 先写一个接收节点数据的存储过程:
CREATE OR REPLACE PROCEDURE SAVE_FAMILY_NODES(p_nodes IN CLOB) IS l_nodes JSON_ARRAY_T; l_node JSON_OBJECT_T; BEGIN l_nodes := JSON_ARRAY_T.parse(p_nodes); FOR i IN 0..l_nodes.get_size()-1 LOOP l_node := l_nodes.get(i).as_object(); INSERT INTO FAMILY_TREE_NODES (PARENT_NODE_ID, NODE_NAME, GENDER) VALUES ( l_node.get_number('parentId'), l_node.get_string('nodeName'), l_node.get_string('gender') ); END LOOP; COMMIT; END; /
- 前端JavaScript收集节点数据并调用AJAX:
// 假设已将所有节点数据存入nodes数组 var nodes = [ {parentId: 1, nodeName: '张三', gender: '男'}, {parentId: 1, nodeName: '李四', gender: '女'} ]; // 调用APEX AJAX执行存储过程 apex.server.process( 'SAVE_FAMILY_NODES', // 对应APAX里创建的AJAX回调名称 { x01: JSON.stringify(nodes) // 将节点数据转为JSON字符串传递 }, { success: function() { alert('节点保存成功!'); apex.region('FamilyTreeRegion').refresh(); // 刷新家族树组件 }, error: function(xhr) { alert('保存失败:' + xhr.responseText); } } );
- 在APEX共享组件的「AJAX回调」中创建名为
SAVE_FAMILY_NODES的过程,调用刚才的存储过程:
DECLARE l_nodes CLOB := apex_application.g_x01; BEGIN SAVE_FAMILY_NODES(l_nodes); END;
第三步:验证数据是否存入
执行以下SQL查询表,确认节点数据已保存:
SELECT * FROM FAMILY_TREE_NODES;
新手建议先从单节点保存测试,确认PL/SQL和页面项绑定没问题后,再扩展到批量或动态创建的场景。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

