钢钢更新

用行动改变世界,做个有情怀的技术宅

以下是截止至 2026.03.31收集的 Oracle APEX 最新博文,完整博文列表请移步这里:Oracle APEX Evangelion(EVA 补完计划)

常规 APEX 博文整理

以下是截止至 2026.02.28收集的 Oracle APEX 最新博文,完整博文列表请移步这里:Oracle APEX Evangelion(EVA 补完计划)

常规 APEX 博文整理

以下是截止至 2026.01.31收集的 Oracle APEX 最新博文,完整博文列表请移步这里:Oracle APEX Evangelion(EVA 补完计划)

常规 APEX 博文整理

以下是截止至 2025.12.31收集的 Oracle APEX 最新博文,完整博文列表请移步这里:Oracle APEX Evangelion(EVA 补完计划)

常规 APEX 博文整理

以下是截止至 2025.11.30收集的 Oracle APEX 最新博文,完整博文列表请移步这里:Oracle APEX Evangelion(EVA 补完计划)

常规 APEX 博文整理

基于 “本地大模型 + 内网穿透 + APEX” 的零成本大模型调用方案

对于开发者,往往希望:

  • 大模型要具备尽可能低成本,最好0成本,但还要足够安全,避免被白嫖
  • 应用由于要对外提供稳定服务,通常部署在 服务器或云主机上
  • 手头有闲置 Macbook,特别是搭载了 Apple M1/M2/M4 芯片,可以复用
  • 最低技术要求,最好用 PL/SQL 原生实现大模型的调用,以便结合 APEX 使用
  • 数据自始至终不需要提供给第三方,安全有保障

本指南给出一个经过验证的方案:

  • 本地 Apple M1 笔记本 → 运行 Ollama(Qwen3:8B大模型) → Ngrok 暴露公网API → 外网 APEX 通过 PL/SQL(uc_ai → provider_ollama)实现大模型调用

整个方案能够做到:

  • 零成本:100%免费
  • 不依赖任何外部 LLM 服务
  • 完整复用本地算力
  • 通过 PL/SQL 原生实现大模型调用
  • 实现 APEX 无缝接入大模型
  • 适合中小企业研究及个人学习使用

整体架构图

一、架构说明:为何必须使用内网穿透?

一般情况下:

  • Ollama 模型是运行在你本地的电脑上:如果你自己有GPU实例,当我没说
  • APEX 应用运行在外网服务器(云主机/OCI/自托管)

APEX 不能直接访问你本地ollama 提供的 http://localhost:11434,因为:

  • 笔记本电脑在局域网内(NAT后)
  • 外部服务器无法直连内网
  • 必须提供一个公网 HTTPS API

因此,需要:Ngrok → 将本地 11434 映射为公网可访问的 HTTPS URL

示例:https://xxxx.ngrok-free.dev/api

这样 APEX(PL/SQL)才有机会通过这个公网API访问你本地的大模型。

二、本地大模型环境准备(Mac电脑)

安装 & 配置 brew

1
2
3
4
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"

安装 Ollama

1
brew install ollama

启动 Ollama

1
brew services start ollama

验证 Ollama

1
2
ollama --version
ollama --help

下载 AI 大模型

比如下载通义千问最新的8B模型

1
ollama pull qwen3:8b

运行 AI 大模型

1
ollama run qwen3:8b

验证 AI 大模型

1
curl http://localhost:11434/api/generate -d '{"model":"qwen3:8b","prompt":"hello"}'

三、配置 Ngrok(暴露 Ollama API)

注册 Ngrok 账号

Ngrok 是一个内网穿透工具,可以将本地端口映射为公网可访问的url地址。对于开发验证方案,可以免费使用。
登录 Ngrok 官网(https://ngrok.com),注册一个账号。

安装并获取 Ngrok 授权码

1
2
brew install ngrok
ngrok config add-authtoken <你的token>

创建内网穿透隧道

1
ngrok http 11434

Ngrok 会输出类似下面的公网地址,其中 abcd1234 是随机生成的字符串,由于我们是学习研究使用,可以直接用这个。如果是正式使用,可以绑定到自己的域名上。

https://abcd1234.ngrok-free.dev

验证 Ngrok 是否正常工作

可以在命令行终端使用刚生成的网址来访问 Ollama 接口是否已生效:

1
curl https://abcd1234.ngrok-free.dev/api/generate -d '{"model":"qwen3:8b","prompt":"hello"}'

如果正常,会返回类似下面的结果:

至此,我们已经在本机上成功运行了 Ollama 大模型,并且通过 Ngrok 将本地端口映射为公网可访问的 HTTPS 地址,可以对外提供服务了。

四、下载安装 UC_AI(PL/SQL SDK)

UC_AI PL/SQL SDK 是国外一个大佬用 PL/SQL 实现的 AI 调用工具,支持多种 AI 提供商,包括 OpenAI、Anthropologie、Google、Ollama 和 Oracle 云基础设施 (OCI)。

  • 免费开源:可在 GitHub 上下载最新版本 SDK
  • 广泛兼容性:可与旧版 Oracle 数据库配合使用(如:12.2 版本,已在 18c 版本上测试)
  • 统一接口:一个 API 可供多个AI提供商使用
  • 提供商独立性:轻松切换模型和提供商。目前支持 5 个提供商:OpenAI GPT、Anthropologie Claude、Google Gemini、Ollama(离线模型)和 Oracle 云基础设施 (OCI)(Llama、Cohere、xAI Grok、Google Gemini)。

安装 UC_AI

将下载好的安装包解压后,使用 sysdba 用户登录数据库,执行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
sqlplus / as sysdba

-- 切换到正确的数据库容器下
alter session set container=orclpdb1;

-- 切换到正确的数据库模式下
alter session set current_schema=apexcn;

-- 安装 UC_AI
@install_uc_ai.sql

-- 也可以安装带日志模块的
@install_with_logger.sql

五、在 APEX 中调用 UC_AI

Oracle APEX 的 uc_ai原生支持 Ollama,无需创建 AI provider 或 model,只需设置 base_url 即可直接使用。适用于 Server-side Process、Dynamic Action、PL/SQL Block。具体调用方法可以参见 UC_AI 官方文档

在 APEX 中创建测试页面

创建一个空白页面,添加如下组件:

  • 1个输入框(P6_INPUT):普通的文本输入框;
  • 1个输出框(P16_AI_RESULT):Rick Text Editor输入框
  • 1个按钮(P16_BTN):普通按钮,点击后触发 Server-side Code。注意要设置 “Items to Submit“ 和 “Items to Return“ 属性,确保输入与输出能正确绑定到控件上。

1
2
3
4
5
6
7
8
9
10
11
12
13
DECLARE
l_result sys.json_object_t;
BEGIN
uc_ai.g_base_url := 'https://abcd1234.ngrok-free.dev/api';

l_result := uc_ai.generate_text(
p_user_prompt => :P16_INPUT,
p_provider => uc_ai.c_provider_ollama,
p_model => 'qwen3:8b'
);

:P16_AI_RESULT := l_result.get_string('final_message');
END;

最终效果

六、访问日志与安全增强

登录到 Ngrok 控制台,查看通道访问日志

点击 Ngrok 控制台左侧的 “Endpoints & Traffic Policy“ 菜单,在右侧你的通道点击“Inspect Traffic“,即可查看该通道的访问日志。

这条就是刚才我们通过 APEX 页面调用 Ollama 的请求日志,可以看到请求经过了1分24秒才返回结果,速度跟你的电脑配置和返回的内容多少有关。我测试用的 macbook 是 Apple M1 芯片,16GB 内存。

在命令行终端查看访问日志

同时,你也可以在命令行终端上看到 ngrok 隧道的访问日志。

对 Ngrok 隧道进行安全增强

截止到目前为止,你的 Ngrok 隧道上暴露的 Ollama 接口服务是完全公开的,任何人(只要知道了网址)都可以访问。为了安全起见,可以对 Ngrok 隧道进行安全增强。可以通过增加 “Traffic Policy“ 的方式限制访问 IP 地址(免费版只能在命令行终端增加 policy 规则)。

查看 Ngrok 配置文件

1
ngrok config check

编辑 Ngrok 配置文件

1
ngrok config edit

ngrok.yml 配置文件中增加以下内容,用来只允许我的 APEX 主机访问这个隧道:

1
2
3
4
5
6
7
8
9
10
11
12
13
tunnels:
ollama:
addr: 11434
proto: http
domain: abcd1234.ngrok-free.dev
traffic_policy:
on_http_request:
- actions:
- type: restrict-ips
config:
enforce: true
allow:
- 129.150.34.102/32

重启 Ngrok 服务后,再次访问 Ngrok 控制台,可以看到访问日志中已经增加了 IP 地址限制:

此时再次通过其他电脑(包括本机)访问该通道,请求将被 ngrok 拒绝:

1
curl https://abcd1234.ngrok-free.dev/api/generate -d '{"model":"qwen3:8b","prompt":"hello"}'

curl https://hulkier-pluckily-allan.ngrok-free.dev/api/generate -d ‘{“model”:”qwen3:8b”,”prompt”:”hello”}’

Ngrok 控制台上查看访问日志,同样能看到请求被拒绝的日志信息:

七、该方案的价值

该方案具备以下突出优势:

  • 完全零成本:软硬件均无需额外投入
  • 最大化利旧:利用 M1/M2/M4 Mac 的闲置算力
  • 无锁定:可随时切换 Qwen、Llama、DeepSeek 等模型
  • APEX 原生支持:无需 hack,无需扩展包
  • 开发体验优雅:本地模型随开随用,响应速度可控
  • 数据安全:模型与推理都在你的设备内执行

八、总结

本指南提供了一套完整的、零成本的、易推广的 APEX(外网) ←→ 内网 Mac 本地模型(Ollama+Qwen3) 的调用方法。核心技术路线包括:

  • 本地运行 Ollama
  • Ngrok 暴露稳定 HTTPS API
  • APEX 原生 uc_ai 直接调用 provider_ollama
  • 全链路可监控、可 debug、可复用

大家有更好的方案和建议,欢迎分享交流。

以下是截止至 2025.10.30收集的 Oracle APEX 最新博文,完整博文列表请移步这里:Oracle APEX Evangelion(EVA 补完计划)

常规 APEX 博文整理

以下是截止至 2025.09.30收集的 Oracle APEX 最新博文,完整博文列表请移步这里:Oracle APEX Evangelion(EVA 补完计划)

常规 APEX 博文整理

以下是截止至 2025.08.30收集的 Oracle APEX 最新博文,完整博文列表请移步这里:Oracle APEX Evangelion(EVA 补完计划)

常规 APEX 博文整理

本文主要讲解如何在 ORDS 中利用 OAuth2 认证保护 RESTful API,以及如何在 APEX 中使用 OAuth2 认证的 RESTful API。

创建演示用的 RESTful API

首先登录 Oracle APEX 工作台,在顶部菜单中选择 SQL Workshop -> RESTful Services,如图所示:

创建 Modules

  • 点击 Modules 节点,创建一个新模块,比如:lab.demo

创建 RESTful API

  • 选中这个模块,点击 Create Template 按钮,创建一个新的 RESTful Service,比如:customers,并创建一个最简单的 GET 服务(Resource Handler),如图所示:

在浏览器中测试 RESTful API

将 RESTful API 保护起来

现在我们的 RESTful API 已经创建成功,但是任何人都可以访问,我们需要将这个 RESTful API 保护起来,只允许授权用户访问。

创建 Roles

  • 选择 Roles 节点,新建一个角色(role) ,比如:oracle.dbtools.role.autorest.lab.customer

创建并配置 Privileges

  • 选择 Privileges 节点,新建一个权限(Privilege),比如:oracle.dbtools.autorest.privilege.lab.customer

  • 将刚才创建的角色(Role)关联到这个权限(Privilege)上,并将需要保护的 RESTful API 关联到这个权限(Privilege)上,如图所示:

  • 再次在浏览器中打开 RESTful API,会看到如下信息,证明 RESTful API 已经被保护起来了。

创建 OAuth2 Client

为了能够访问受保护的 RESTful API,我们需要创建一个 OAuth2 Client,将这个 Client 与刚才创建的 Role 关联起来。

点击 SQL Workshop -> SQL Commands 菜单,打开 SQL Worksheet,执行如下 SQL 语句:

1
2
3
4
5
6
7
8
9
BEGIN
oauth.create_client(
p_name => 'lab_client', --client name 必须唯一
p_grant_type => 'client_credentials', --选择 client_credentials 作为授权类型
p_description => 'lab client demo',
p_support_email => 'wfgdlut@gmail.com',
p_privilege_names => 'oracle.dbtools.autorest.privilege.lab.customer'); --将刚才创建的权限(Privilege)关联到 OAuth2 Client 上
COMMIT;
END;

Client 创建成功后,在 SQL Worksheet 中执行如下 SQL 语句,并将返回的 client_idclient_secret 记录下来,后面需要用来获取 access_token

1
2
3
4
5
6
7
SELECT id,
name,
description,
client_id, -- OAuth2 Client ID
client_secret -- OAuth2 Client Secret
FROM user_ords_clients
WHERE name = 'lab_client';

将 OAuth2 Client 与 Role 关联起来

继续在 SQL Worksheet 中执行如下 SQL 语句,将 OAuth2 Client 与 Role 关联起来:

1
2
3
4
5
6
BEGIN
oauth.grant_client_role(
p_client_name => 'lab_client', --刚才创建的 OAuth2 Client 的名称
p_role_name => 'oracle.dbtools.role.autorest.lab.customer'); --刚才创建的 Role 的名称
COMMIT;
END;

获取 access_token

打开命令行终端(或者使用 Postman),执行如下命令,获取 access_token

1
2
3
4
curl -X POST 'https://oracleapex.cn/ords/lab/oauth/token' \                                
-H 'Content-Type: application/x-www-form-urlencoded' \
-u '<Client ID>:<Client Secret>' \
--data 'grant_type=client_credentials&scope=oracle.dbtools.role.autorest.lab.customer'

如果一切正常,就会得到 access_token,如图所示:

这里的 access_token 就是用来访问受保护的 RESTful API 的令牌,将它复制下来。

钢哥提醒:如果获取 access_token 失败,请先参考文末的避坑指南。

通过 curl 命令访问受保护的 RESTful API,如下所示:

1
2
3
4
curl -i \
-X GET "https://oracleapex.cn/ords/lab/api/customers" \
-H "Authorization: Bearer <your_access_token>" \
-H "Accept: application/json"

如果一切正常,就会得到如下信息,证明 RESTful API 已经被成功访问了。

你也可以通过 Postman 或者 Hoppscotch 工具访问受保护的 RESTful API,原理是一样的,必须先通过 client_id 和 client_secret 获取 access_token,然后再通过 access_token 访问受保护的 RESTful API,如下图所示:

在 APEX 中使用 OAuth2 认证的 RESTful API

接下来就可以将这个 RESTful API 集成到 APEX 应用中了。进入到 APEX 工作台,点击 Shared Components -> REST Data Sources -> Create -> From scratch 菜单, 将刚刚创建的 RESTful API 注册到 APEX 中,如图所示:

钢哥提醒:这一步如果报错,请参考文末的避坑指南。

填写好 RESTful API 的相关信息,点击 Create 按钮,根据向导创建一个 REST Data Source,以下是基于我自己的 RESTful API 信息填写的,请参考并对应修改成你自己的。

  • 我的 RESTful API 没有使用分页,所以跳过此步设置,下一步:

这一步很关键,需要填写 OAuth2 的相关信息,如下图所示:

  • Authentication Required: 勾选
  • Authentication Type: OAuth2 Client Credentials
  • OAuth Token URL: https://oracleapex.cn/ords/lab/oauth/token
  • Client ID: 刚才获取到的 client_id
  • Client Secret: 刚才获取到的 client_secret

上述信息填写完成后,点击 Discover 按钮,APEX 会自动获取 access_token 并试图解析 RESTful API 的返回结果,如果一切正常,会看到如下信息:

点击 Create REST Data Source 按钮进行保存。

在 APEX 中使用 OAuth2 认证的 RESTful 数据源

新建一个 APEX 页面,增加一个 Interactive Report 组件,数据源关联刚刚创建的 REST Data Source,如下图所示:

运行后的效果如下:

避坑指南

在获取 access_token 时可能会踩的坑

  1. ORDS 获取 access_token 的 URL 是:https://oracleapex.cn/ords/lab/oauth/token, 其中 lab 是 ORDS 的 workspace 名称,如果你的 ORDS 的 workspace 名称不是 lab,需要将 lab 替换成你的 workspace 名称。后面的 /oauth/token 是固定写法,不要修改;
  2. 如果遇到 Token 获取失败:AUTH TOKEN_REQUEST_INVALID_RESPONSE 的错误,可能是由于 Nginx 或 tomcat 配置的问题。
  • 检查 nginx.conf 文件,确保配置了如下信息:
1
2
3
4
5
proxy_set_header X-Forwarded-Proto  $scheme;   # 关键:告诉后端原始协议
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header Host $host;
proxy_set_header Authorization $http_authorization; # 取 token 时要用到 Basic 头
  • 检查 tomcat 的 $CATALINA_BASE/conf/server.xml 文件,确保配置了如下信息:
1
2
3
4
5
6
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
URIEncoding="UTF-8"
proxyPort="443"
proxyName="oracleapex.cn"
scheme="https"
secure="true" />
  • 重启 Nginx 和 tomcat,再次尝试获取 access_token。

解析 RESTful API 可能会踩的坑

如果在解析 RESTful API 时遇到 ORA-29024: Certificate validation failure 的错误,是由于 SSL 证书导致的。APEX(实质是数据库里的 UTL_HTTP)在发起 HTTPS 调用时无法验证对端证书链,所以抛出 ORA-29024: Certificate validation failure。本机 curl 能通,是因为你的客户端已经信任了 Let’s Encrypt/DigiCert 的根证书;数据库并不会自动信任系统根,必须给 Oracle Wallet 配好受信任根证书,并把 APEX 实例的 Wallet Path 指到它。

所以只需要将对应的证书(我使用的是 Let’s Encrypt/DigiCert 的根证书)放到 Wallet 中即可。不知道如何配置 Wallet 的,可以参考钢哥的这篇文章:《Oracle Wallet 钱包配置》

SSL 证书导入 Wallet 后,再次解析 RESTful API,就可以继续往下执行了。

总结

本文详细介绍了如何通过 ORDS 将 RESTful API 保护起来,以及如何在 APEX 中使用 OAuth2 认证的 REST 数据源。很多第三方的 API 都是遵循 OAuth2 协议的,掌握了如何在 APEX 中使用 OAuth2 认证的 REST 数据源,将让你的 APEX 应用与第三方 API 的集成变得更加简单和安全,欢迎大家留言讨论。

0%