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

Oracle APEX 24.1:如何从文本占位符生成页面链接?

在Oracle APEX中实现自由形式链接功能

1. 编写PL/SQL解析函数

创建一个PL/SQL函数,专门解析Comments字段中的<table_name:record_name>格式标签,将其替换为可点击的APEX页面链接,同时处理单匹配、多匹配两种场景:

CREATE OR REPLACE FUNCTION fn_parse_comments(p_comments CLOB) RETURN CLOB IS
    v_parsed_text CLOB := p_comments;
    v_table_name VARCHAR2(100);
    v_record_name VARCHAR2(200);
    v_match_count NUMBER;
    v_target_id NUMBER;
    v_link_url VARCHAR2(4000);
    -- 正则提取所有<table:name>格式标签
    CURSOR c_tags IS
        SELECT REGEXP_SUBSTR(p_comments, '<([a-zA-Z0-9_]+):([^>]+)>', 1, LEVEL, NULL, 1) AS table_name,
               REGEXP_SUBSTR(p_comments, '<([a-zA-Z0-9_]+):([^>]+)>', 1, LEVEL, NULL, 2) AS record_name
        FROM DUAL
        CONNECT BY LEVEL <= REGEXP_COUNT(p_comments, '<([a-zA-Z0-9_]+):([^>]+)>');
BEGIN
    IF p_comments IS NULL THEN
        RETURN NULL;
    END IF;

    FOR r_tag IN c_tags LOOP
        v_table_name := r_tag.table_name;
        v_record_name := r_tag.record_name;

        -- 限制可访问的表,防止SQL注入
        IF v_table_name NOT IN ('TABLE_1', 'TABLE_2', 'TABLE_3') THEN
            CONTINUE;
        END IF;

        -- 查询目标表中匹配Name的记录数和主键ID
        EXECUTE IMMEDIATE 'SELECT COUNT(*), MAX(id) FROM ' || v_table_name || ' WHERE name = :name'
        INTO v_match_count, v_target_id
        USING v_record_name;

        IF v_match_count = 0 THEN
            -- 无匹配记录,保留原标签
            CONTINUE;
        ELSIF v_match_count = 1 THEN
            -- 单匹配,生成跳转至只读查看页的链接
            v_link_url := APEX_PAGE.GET_URL(
                p_page   => 2, -- 替换为目标表的只读查看页面ID
                p_items  => 'P2_ID', -- 替换为详情页接收主键的页面项
                p_values => v_target_id
            );
            v_parsed_text := REPLACE(v_parsed_text, '<'||v_table_name||':'||v_record_name||'>', 
                                    '<a href="'||v_link_url||'" target="_blank">'||v_record_name||'</a>');
        ELSE
            -- 多匹配,生成跳转至列表页并过滤的链接
            v_link_url := APEX_PAGE.GET_URL(
                p_page         => 1, -- 替换为目标表的列表页面ID
                p_clear_cache  => 1,
                p_items        => 'P1_NAME', -- 替换为列表页过滤Name的页面项
                p_values       => v_record_name
            );
            v_parsed_text := REPLACE(v_parsed_text, '<'||v_table_name||':'||v_record_name||'>', 
                                    '<a href="'||v_link_url||'" target="_blank">'||v_record_name||' ('||v_match_count||'条匹配)</a>');
        END IF;
    END LOOP;

    RETURN v_parsed_text;
END;
/

2. 配置只读查看页面的Comments字段

在table_1的只读查看表单页面中,找到Comments对应的页面项,做如下配置:

  • 将字段类型改为「Display as Text (based on LOV, does not save state)」
  • 在Source选项卡中,选择「PL/SQL Function Body」,输入代码:
    RETURN fn_parse_comments(:PX_COMMENTS); -- PX_COMMENTS替换为当前页面存储Comments的页面项名称
    
  • 开启「Escape Special Characters」为No,确保HTML链接能正常渲染。

3. 适配你的APEX页面配置

上述代码中的页面ID、页面项需要根据实际应用调整:

  • 每个表的只读查看页ID、接收主键的页面项要对应(比如table_2的详情页可能是页面3,页面项为P3_ID)
  • 每个表的列表页ID、过滤Name的页面项要对应,同时确保列表页的交互式网格支持通过该页面项过滤数据(在IG的「Filtering」设置中开启对应字段的过滤)

4. 权限与安全校验

  • 确保执行该函数的APEX应用用户拥有table_1、table_2、table_3的查询权限
  • 函数中已添加表名白名单校验,避免SQL注入风险,请勿随意移除该逻辑

内容的提问来源于stack exchange,提问作者Dennis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:47:12