Oracle自治数据库ORDS POST插入含GENERATED ALWAYS列表报错如何解决
问题原因
ORDS默认自动将请求中未显式传递的列赋值为
null传入INSERT语句,而GENERATED ALWAYS类型的标识列禁止任何显式传入的赋值(包括null),这就是直接执行SQL不指定id列可正常插入、但ORDS调用报错的核心原因。
解决方案
以下三种方案均无需修改GENERATED ALWAYS的身份列规则,可直接适配现有表结构:
方案1:配置ORDS插入排除列(最推荐)
操作门槛最低,无需修改业务逻辑:
- 进入ORDS RESTful Services管理界面,找到对应POST接口所属的模块
- 进入该POST资源的编辑页面,在「排除列」配置项中填入
id,保存后重新发布模块即可 - 配置完成后ORDS执行插入时会自动将
id从插入字段列表中移除,不会传入null值触发报错
如果用PL/SQL批量配置ORDS,可直接执行以下语句:
BEGIN ORDS.DEFINE_HANDLER( p_module_name => '你的业务模块名称', p_pattern => '你的接口请求路径', p_method => 'POST', p_source_type => ORDS.source_type_collection_feed, p_source => 'select * from 你的目标表名', p_exclude_columns => 'id' -- 多个排除列用英文逗号分隔 ); COMMIT; END; /
方案2:自定义PL/SQL插入逻辑
如果需要额外的插入前校验、权限判断等逻辑,可替换ORDS默认的自动DML能力,手动写插入语句:
DECLARE v_new_id NUMBER; BEGIN INSERT INTO 你的目标表名 (col1, col2, col3) -- 语句中不写id列 VALUES (:col1, :col2, :col3) RETURNING id INTO v_new_id; -- 可选:返回生成的自增ID给调用方 -- 自定义返回内容 HTP.p('{"new_id":'||v_new_id||'}'); EXCEPTION WHEN OTHERS THEN HTP.p('{"error":"'||SQLERRM||'"}'); END;
方案3:修改列的读写权限
在ORDS的表资源属性配置中,将id列的可插入、可更新两个属性都设置为false,ORDS会自动在插入、更新操作中跳过该列,效果和方案1完全一致。
内容的提问来源于stack exchange,提问作者David Min
相关产品推荐
相关产品推荐

