大数跨境
0
0

技术干货 | ORDS:让数据库秒变 REST API

技术干货 | ORDS:让数据库秒变 REST API 甲骨文中国
2025-10-29
30
导读:让您无需开发微服务即可构建 REST API!

在日常开发中,您是否会遇到这样的困境?

  • 想要快速提供接口,却要写一堆后端代码;

  • 移动端、前端要调数据,接口开发周期又长;

  • 数据库里的存储过程、查询结果,没法直接对外暴露。



别急,今天我们来聊聊一款神器 — Oracle REST Data Services(ORDS)。它让您无需开发微服务来构建 REST API,直接使用 ORDS 提供的 API 即可,省去了繁琐的中间步骤。





一、ORDS 是什么?

一句话理解:ORDS 可以把 Oracle 数据库里的表、视图、存储过程,直接变成 RESTful API,默认返回 JSON

  1. 支持 Oracle Database / APEX

  2. 部署灵活(独立运行 / Tomcat / WebLogic/ Kubernates)

  3. 前端、移动端直接调用

再也不需要写厚重的后端程序,只要一个 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访问

BEGIN  ORDS.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对象

BEGIN  ORDS.ENABLE_OBJECT (    p_object         =>'EMPLOYEE',    p_object_type    =>'TABLE',    p_auto_rest_auth =>FALSE  );  COMMIT;END;/

这样,HRPOC Schema下的EMPLOYEE表就能直接被 REST API 调用了 。




三、REST API示例

  1. 查询数据(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)ISBEGIN  UPDATE employee  SET salary = salary * (1+ p_percent/100)  WHERE id = p_emp_id;  status :=200;  msg :='success';  COMMIT;END;/

启用存储过程的REST对象

BEGIN  ORDS.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,implicit    p_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.绑定权限

建立(模块|路径匹配模式)与角色之间的关系

DECLARE  l_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。




六、实战应用场景

  1. 前后端分离:Vue/React 直接调 ORDS 输出的 JSON。

  2. 移动端开发:可轻松获取数据库数据。

  3. 系统集成:EBS或第三方平台对接。

  4. 低代码开发:ORDS 还是APEX低代码平台默认的请求处理引擎。




七、结语

ORDS 是一个真正能提效开发的神器:

  • 几分钟启用,无需写后端代码。

  • 天然支持 JSON 格式,与前端无缝对接

  • 安全可靠,支持 Basic/ OAuth2。

如果是使用 OCI 上的 ADB ,默认自带由OCI 运行管理的 ORDS 服务,一键可开启 ADB 库内的各类对象的 REST 服务,无需关注 ORDS 的部署及容量扩容、HA 等需求。


如果您也在思考

  1. 如何快速开放数据库接口?

  2. 如何让前端直接拿到干净的 JSON 数据?


那么,试试 ORDS 吧!


参考链接:https://docs.oracle.com/en/database/oracle/oracle-rest-data-services/25.3/books.html


*注:为免疑义,本文所用以下术语专指以下含义:

1. Oracle 专指 Oracle 境外公司而非甲骨文中国。

2. 相关 Cloud 或云术语均指代 Oracle 境外公司提供的云技术或其解决方案。

【声明】内容源于网络
0
0
甲骨文中国
1234
内容 530
粉丝 0
甲骨文中国 1234
总阅读1.6k
粉丝0
内容530