Oracle 19c ADB下如何将对象存储重命名逻辑正确封装为PL/SQL包
ADB 19c 对象存储重命名逻辑PL/SQL包规范实现
ADB环境中所有dbms_cloud_oci_开头的系统包、预定义对象类型均为SYS schema公开授权对象,普通业务用户可直接调用,无需自行定义、重建类型。原匿名块的逻辑可直接封装为可复用的PL/SQL包,系统预定义类型的声明位置和匿名块保持一致,无需额外调整。
1. 定义PL/SQL包规范
把固定环境配置抽为包常量,对外暴露标准化的重命名接口,代码如下:
CREATE OR REPLACE PACKAGE os_object_rename_pkg AS -- 环境固定配置,可根据实际部署值修改 c_namespace_name VARCHAR2(30) := 'XX'; c_bucket_name VARCHAR2(100) := 'XX'; c_region VARCHAR2(30) := 'eu-frankfurt-1'; c_cred_name VARCHAR2(30) := 'OCIDI_CRED'; -- 对外重命名接口 PROCEDURE rename_oss_object( p_source_object_name IN VARCHAR2, p_new_object_name IN VARCHAR2, p_out_status_code OUT NUMBER ); END os_object_rename_pkg; /
2. 实现包体逻辑
系统预定义类型作为过程的本地变量声明,和原匿名块的语法完全一致,代码如下:
CREATE OR REPLACE PACKAGE BODY os_object_rename_pkg AS PROCEDURE rename_oss_object( p_source_object_name IN VARCHAR2, p_new_object_name IN VARCHAR2, p_out_status_code OUT NUMBER ) IS -- 直接引用系统全局预定义类型,无需自定义声明 l_rename_details dbms_cloud_oci_object_storage_rename_object_details_t; l_rename_result dbms_cloud_oci_obs_object_storage_rename_object_response_t; BEGIN -- 初始化重命名请求参数 l_rename_details := dbms_cloud_oci_object_storage_rename_object_details_t( source_name => p_source_object_name, new_name => p_new_object_name, src_obj_if_match_e_tag => NULL, new_obj_if_match_e_tag => NULL, new_obj_if_none_match_e_tag => NULL ); -- 调用系统内置对象存储重命名接口 l_rename_result := dbms_cloud_oci_obs_object_storage.rename_object( namespace_name => c_namespace_name, bucket_name => c_bucket_name, rename_object_details => l_rename_details, opc_client_request_id => NULL, region => c_region, endpoint => NULL, credential_name => c_cred_name ); -- 返回执行状态码 p_out_status_code := l_rename_result.status_code; DBMS_OUTPUT.PUT_LINE('重命名执行状态码: ' || l_rename_result.status_code); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('重命名执行失败: ' || SQLERRM); RAISE; END rename_oss_object; END os_object_rename_pkg; /
3. 包的调用示例
封装完成后可直接在PL/SQL块中调用,无需关注底层系统类型的实现逻辑:
DECLARE v_status_code NUMBER; BEGIN os_object_rename_pkg.rename_oss_object( p_source_object_name => '1.txt', p_new_object_name => 'CSV_Manual/1.txt', -- 支持带虚拟路径前缀实现对象移动 p_out_status_code => v_status_code ); END; /
注意事项
- 无需在包内重新定义两个系统预定义类型,这些类型是ADB内置的全局公开对象,直接引用即可识别
- 若执行时报权限错误,需确认当前业务用户是否拥有
DBMS_CLOUD_OCI相关包的EXECUTE权限,以及对应OCI凭证OCIDI_CRED的使用权限- 类型的参数赋值、接口调用逻辑和原匿名块完全一致,不会因为封装为包产生语法变更
内容的提问来源于stack exchange,提问作者DBetlGET
相关产品推荐
相关产品推荐

