declare
    l_rename_object_details dbms_cloud_oci_object_storage_rename_object_details_t;
    l_put_response    dbms_cloud_oci_obs_object_storage_put_object_response_t;
    l_rename_response dbms_cloud_oci_obs_object_storage_rename_object_response_t;
    l_delete_response dbms_cloud_oci_obs_object_storage_delete_object_response_t;
    l_status_code integer;
    l_filename varchar2(4000);
    l_content_type varchar2(4000);
    l_blob blob;
    l_loc number;
    plsql_sdk_error exception;
    -- 日本語に対応させる
    function cs_workaround(str varchar2)
    return varchar2
    as
    begin
        return utl_url.escape(str, false, 'AL32UTF8');
    end cs_workaround;
begin
    case
    when :APEX$ROW_STATUS = 'C' then
        begin
            select filename, mime_type, blob_content into l_filename, l_content_type, l_blob
            from apex_application_temp_files
            where name = :P5_FILE;
        exception
            when no_data_found then
                l_blob := null;
        end;
        if lengthb(:P5_NAME) > 0 then
            l_filename := :P5_NAME;
        end if;
        l_filename := cs_workaround(l_filename);
        l_put_response := dbms_cloud_oci_obs_object_storage.put_object
        (
	        namespace_name => :G_NAMESPACE_NAME
            , bucket_name => :P5_BUCKET_NAME
            , object_name => l_filename
            , content_type => l_content_type
            , put_object_body => l_blob
	        , region => :G_REGION
	        , credential_name => :G_CREDENTIAL_NAME
        );
        l_status_code := l_put_response.status_code;
    when :APEX$ROW_STATUS = 'U' then
        l_rename_object_details := new
            dbms_cloud_oci_object_storage_rename_object_details_t;
        l_rename_object_details.source_name := :P5_ID;
        l_rename_object_details.new_name := :P5_NAME;            
        l_rename_response := dbms_cloud_oci_obs_object_storage.rename_object
        (
	        namespace_name => :G_NAMESPACE_NAME
            , bucket_name => :P5_BUCKET_NAME
            , rename_object_details => l_rename_object_details
	        , region => :G_REGION
	        , credential_name => :G_CREDENTIAL_NAME
        );
        l_status_code := l_put_response.status_code;
    when :APEX$ROW_STATUS = 'D' then
        l_delete_response := dbms_cloud_oci_obs_object_storage.delete_object
        (
	        namespace_name => :G_NAMESPACE_NAME
            ,bucket_name => :P5_BUCKET_NAME
            ,object_name => cs_workaround(:P5_NAME)
	        , region => :G_REGION
	        , credential_name => :G_CREDENTIAL_NAME
        );
        l_status_code := l_put_response.status_code;
    end case;
    if l_status_code != 200 then
        raise plsql_sdk_error;
   end if;   
end;