在日常开发中,您是否会遇到这样的困境?
想要快速提供接口,却要写一堆后端代码;
移动端、前端要调数据,接口开发周期又长;
数据库里的存储过程、查询结果,没法直接对外暴露。
别急,今天我们来聊聊一款神器 — Oracle REST Data Services(ORDS)。它让您无需开发微服务来构建 REST API,直接使用 ORDS 提供的 API 即可,省去了繁琐的中间步骤。
一、ORDS 是什么?
一句话理解:ORDS 可以把 Oracle 数据库里的表、视图、存储过程,直接变成 RESTful API,默认返回 JSON。
支持 Oracle Database / APEX
部署灵活(独立运行 / Tomcat / WebLogic/ Kubernates)
前端、移动端直接调用
再也不需要写厚重的后端程序,只要一个 URL,就能拿到数据。
二、快速上手ORDS
1.安装与启动
安装命令:
[oracle@localhost u01]$ ords install
配置数据库连接:
Enter the database server hostname [localhost]: mydbserverEnter the database service name: ORCLPDB1Enter the database user name: HRPOC
独立模式运行最简单:
[oracle@localhost u01]$ ords serve
2.启用 REST访问
BEGINORDS.ENABLE_SCHEMA(p_enabled =>TRUE,p_schema =>'HRPOC',p_url_mapping_type =>'BASE_PATH',p_url_mapping_pattern =>NULL,p_auto_rest_auth =>FALSE);COMMIT;END;/
3.启用REST对象
BEGINORDS.ENABLE_OBJECT (p_object =>'EMPLOYEE',p_object_type =>'TABLE',p_auto_rest_auth =>FALSE);COMMIT;END;/
这样,HRPOC Schema下的EMPLOYEE表就能直接被 REST API 调用了 。
三、REST API示例
查询数据(GET) :
查询有所员工:
curl --location 'http://localhost:8080/ords/hrpoc/employee/'
返回结果:
{"items": [{"id": 1,"location": "NEW YORK","department": "ACCOUNTING","empno": 7839,"name": "KING","job": "PRESIDENT","hiredate": "2025-07-20T00:00:00Z","salary": 5000,"commmision": null,"manager": null,"deptno": 10,"links": [{"rel": "self","href": "http://localhost:8080/ords/hrpoc/employee/1"}]},{...},{...},...],"hasMore": false,"limit": 25,"offset": 0,"count": 14,"links": [{"rel": "self","href": "http://localhost:8080/ords/hrpoc/employee/"},{"rel": "edit","href": "http://localhost:8080/ords/hrpoc/employee/"},{"rel": "describedby","href": "http://localhost:8080/ords/hrpoc/metadata-catalog/employee/"},{"rel": "first","href": "http://localhost:8080/ords/hrpoc/employee/"}]}
查询单条记录
curl --location 'http://localhost:8080/ords/hrpoc/employee/:主键'
2.插入数据(POST):
插入表数据
curl --location 'http://localhost:8080/ords/hrpoc/employee/' \--header 'Content-Type: application/json' \--data '{"location": "NEW YORK","department": "ACCOUNTING","empno": 9527,"name": "9527Name","job": "PRESIDENT","hiredate": "2025-07-20T00:00:00Z","salary": 5000,"commmision": null,"manager": null,"deptno": 10}'
返回结果:
{"id": 15,"location": "NEW YORK","department": "ACCOUNTING","empno": 9527,"name": "9527Name","job": "PRESIDENT","hiredate": "2025-07-20T00:00:00Z","salary": 5000,"commmision": null,"manager": null,"deptno": 10,"links": [{"rel": "self","href": "http://localhost:8080/ords/hrpoc/employee/15"},{"rel": "edit","href": "http://localhost:8080/ords/hrpoc/employee/15"},{"rel": "describedby","href": "http://localhost:8080/ords/hrpoc/metadata-catalog/employee/item"},{"rel": "collection","href": "http://localhost:8080/ords/hrpoc/employee/"}]}
3.更新数据(PUT):
提示:更新name为"9527_New_Name"。
curl --location --request PUT 'http://localhost:8080/ords/hrpoc/employee/15' \--header 'Content-Type: application/json' \--data '{"location": "NEW YORK","department": "ACCOUNTING","empno": 9527,"name": "9527_New_Name","job": "PRESIDENT","hiredate": "2025-07-20T00:00:00Z","salary": 5000,"commmision": null,"manager": null,"deptno": 10}'
返回结果:
{"id": 15,"location": "NEW YORK","department": "ACCOUNTING","empno": 9527,"name": "9527_New_Name","job": "PRESIDENT","hiredate": "2025-07-20T00:00:00Z","salary": 5000,"commmision": null,"manager": null,"deptno": 10,"links": [{"rel": "self","href": "http://localhost:8080/ords/hrpoc/employee/15"},{"rel": "edit","href": "http://localhost:8080/ords/hrpoc/employee/15"},{"rel": "describedby","href": "http://localhost:8080/ords/hrpoc/metadata-catalog/employee/item"},{"rel": "collection","href": "http://localhost:8080/ords/hrpoc/employee/"}]}
4.删除数据(DELETE):
curl --location --request DELETE 'http://localhost:8080/ords/hrpoc/employee/15'
返回结果:
{"rowsDeleted": 1}
5.调用存储过程
编译下述存储过程,示例代码如下:
createor replace PROCEDURE raise_salary (p_emp_id IN NUMBER,p_percent IN NUMBER,msg OUT VARCHAR2,status OUT NUMBER)ISBEGINUPDATE employeeSET salary = salary * (1+ p_percent/100)WHERE id = p_emp_id;status :=200;msg :='success';COMMIT;END;/
启用存储过程的REST对象
BEGINORDS.ENABLE_OBJECT (p_object =>'RAISE_SALARY',p_object_type =>'PROCEDURE',p_auto_rest_auth =>FALSE);COMMIT;END;/
然后即可直接用 POST 请求:
curl --location 'http://localhost:8080/ords/hrpoc/raise_salary/' \--header 'Content-Type: application/json' \--data '{"p_emp_id": 1,"p_percent": 100}'
返回结果:
{"msg": "success","status": 200}
是不是非常丝滑?
四、更多支持对象 & 自定义 API
除了上述演示的表和存储过程,ORDS 还支持:
视图(View)、JSON关系二元性视图
程序包(Package)
函数(Function)
物化视图(Materialized View)
此外,ORDS 还支持通过 SQL 或 PL/SQL 灵活定制 REST API。
五、安全机制
ORDS 内置支持 Basic/ OAuth2,轻松搞定认证。
1.创建角色及Oauth2客户端
BEGIN-- STEP1:创建角色ORDS.CREATE_ROLE(p_role_name=>'ords_oauth2_role');-- STEP2:创建OAUTH2客户端OAUTH.CREATE_CLIENT(p_name =>'ords_oauth2', -- 客户端的名称p_grant_type =>'client_credentials', -- authorization_code,implicitp_owner =>'POC', -- 客户端应用的所有者或负责团队/个人的名称。p_description =>'OAUTH2认证',p_support_email =>'xxxx@xxx.com',p_privilege_names =>'');-- STEP3:授予 OAuth 客户端指定的角色OAUTH.GRANT_CLIENT_ROLE(p_client_name =>'ords_oauth2',p_role_name =>'ords_oauth2_role');COMMIT;END;/
2.绑定权限
建立(模块|路径匹配模式)与角色之间的关系
DECLAREl_priv_roles owa.vc_arr;l_priv_patterns owa.vc_arr;l_priv_modules owa.vc_arr;BEGIN-- 在权限中绑定角色(角色对应Oauth2权限)l_priv_roles(1) :='ords_oauth2_role'; -- 绑定角色l_priv_patterns(1) :='/employee/*'; -- 绑定对象路径l_priv_modules(1) :='hrpoc.ordstest'; -- 绑定模块-- 定义 Oracle REST 权限ords.define_privilege(p_privilege_name =>'ords_oauth2_privilege', -- 权限名称p_roles => l_priv_roles, -- 角色p_patterns => l_priv_patterns, -- 路径匹配模式p_modules => l_priv_modules, -- 绑定模块p_description =>'这是一个ords oauth2的测试');COMMIT;END;/
3.获取Client信息
select client_id, client_secret from user_ords_clients where name ='ords_oauth2';
返回结果:
------------------------------------------------------------------CLIENT_ID CLIENT_SECRET-QTqyb6rqZi0cjDmcz5RVQ.. b4tyVBdonYa3fA0I40UxnQ..
4. 获取 Access Token
curl --location 'http://localhost:8080/ords/hrpoc/oauth/token' \--header 'Content-Type: application/x-www-form-urlencoded' \--header 'Authorization: Basic Auth CLIENT_ID/CLIENT_SECRET ' \--data-urlencode 'grant_type=client_credentials'
返回结果:
调用时只需带上 Authorization: Bearer 即可安全访问 API。
六、实战应用场景
前后端分离:Vue/React 直接调 ORDS 输出的 JSON。
移动端开发:可轻松获取数据库数据。
系统集成:EBS或第三方平台对接。
低代码开发:ORDS 还是APEX低代码平台默认的请求处理引擎。
七、结语
ORDS 是一个真正能提效开发的神器:
几分钟启用,无需写后端代码。
天然支持 JSON 格式,与前端无缝对接。
安全可靠,支持 Basic/ OAuth2。
如果是使用 OCI 上的 ADB ,默认自带由OCI 运行管理的 ORDS 服务,一键可开启 ADB 库内的各类对象的 REST 服务,无需关注 ORDS 的部署及容量扩容、HA 等需求。
如果您也在思考
如何快速开放数据库接口?
如何让前端直接拿到干净的 JSON 数据?
那么,试试 ORDS 吧!
参考链接:https://docs.oracle.com/en/database/oracle/oracle-rest-data-services/25.3/books.html
*注:为免疑义,本文所用以下术语专指以下含义:
1. Oracle 专指 Oracle 境外公司而非甲骨文中国。
2. 相关 Cloud 或云术语均指代 Oracle 境外公司提供的云技术或其解决方案。

