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

能否创建PL/SQL存储过程将HTML网页内容保存至Oracle表?

PL/SQL存储过程实现URL抓取与HTML内容入库方案

完全可以通过PL/SQL实现需求,核心依赖Oracle自带的UTL_HTTP包处理HTTP请求,结合CLOB类型存储HTML内容。以下是具体实现方案:

1. 前置准备

1.1 授权必要权限

确保执行存储过程的数据库用户拥有UTL_HTTP的执行权限,需由DBA执行:

GRANT EXECUTE ON UTL_HTTP TO your_username;

1.2 创建存储表

先创建用于保存网页内容的表,用CLOB存储HTML以支持大文本:

CREATE TABLE web_content (
    content_id    NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    source_url    VARCHAR2(2000) NOT NULL,
    html_content  CLOB NOT NULL,
    fetch_date    TIMESTAMP DEFAULT SYSTIMESTAMP NOT NULL
);

2. 存储过程实现

CREATE OR REPLACE PROCEDURE fetch_and_save_web_content(
    p_url IN VARCHAR2
) IS
    l_http_req    UTL_HTTP.REQ;
    l_http_resp   UTL_HTTP.RESP;
    l_buffer      VARCHAR2(32767);
    l_clob        CLOB;
BEGIN
    -- 初始化临时CLOB用于存储HTML内容
    DBMS_LOB.CREATETEMPORARY(l_clob, TRUE);
    DBMS_LOB.OPEN(l_clob, DBMS_LOB.LOB_READWRITE);

    -- 发起HTTP GET请求
    l_http_req := UTL_HTTP.BEGIN_REQUEST(p_url);
    l_http_resp := UTL_HTTP.GET_RESPONSE(l_http_req);

    -- 循环读取响应内容并写入CLOB
    LOOP
        UTL_HTTP.READ_TEXT(l_http_resp, l_buffer, 32767);
        DBMS_LOB.WRITEAPPEND(l_clob, LENGTH(l_buffer), l_buffer);
    END LOOP;

EXCEPTION
    -- 捕获响应结束异常,完成入库操作
    WHEN UTL_HTTP.END_OF_BODY THEN
        UTL_HTTP.END_RESPONSE(l_http_resp);
        INSERT INTO web_content (source_url, html_content)
        VALUES (p_url, l_clob);
        COMMIT;
        -- 释放临时CLOB资源
        DBMS_LOB.CLOSE(l_clob);
        DBMS_LOB.FREETEMPORARY(l_clob);
    -- 处理其他异常,确保资源释放
    WHEN OTHERS THEN
        IF UTL_HTTP.IS_RESPONSE_OPEN(l_http_resp) THEN
            UTL_HTTP.END_RESPONSE(l_http_resp);
        END IF;
        IF DBMS_LOB.ISOPEN(l_clob) = 1 THEN
            DBMS_LOB.CLOSE(l_clob);
        END IF;
        DBMS_LOB.FREETEMPORARY(l_clob);
        RAISE;
END;
/

3. 关键注意事项

  • HTTPS处理:若目标URL为HTTPS,需配置Oracle Wallet信任站点证书,可在存储过程中添加UTL_HTTP.SET_WALLET('file:/path/to/wallet', 'wallet_password');指定钱包路径,同时确保用户有钱包访问权限。
  • 字符编码转换:如果网页编码非UTF-8,需用UTL_I18N.CONVERT转换编码,例如将GBK转UTF-8:DBMS_LOB.WRITEAPPEND(l_clob, LENGTH(UTL_I18N.CONVERT(l_buffer, 'AL32UTF8', 'GBK')), UTL_I18N.CONVERT(l_buffer, 'AL32UTF8', 'GBK'));
  • 超时设置:可添加UTL_HTTP.SET_TIMEOUT(l_http_req, 30);设置请求超时(单位:秒),避免长时间阻塞。
  • 大内容适配:CLOB类型最大支持4GB,完全满足绝大多数网页存储需求,避免使用VARCHAR2(最大仅32767字节)。
  • 权限补充:确保用户拥有web_content表的INSERT权限,以及临时CLOB的操作权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 18:43:20