You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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保存:

  1. 先写一个接收节点数据的存储过程:
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;
/
  1. 前端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);
        }
    }
);
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:20:25