PL/SQL调用REST API上传附件

2024-08-27 16:52

本文主要是介绍PL/SQL调用REST API上传附件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PL/SQL调用REST API上传附件

  • 概述
    • 代码示例
    • 说明

概述

本文主要介绍如何用PL/SQL程序调用REST API上传附件。初始代码源自github, 经过修改测试。

代码示例

  TYPE part IS RECORD(ds_header VARCHAR2(2048),ds_value  VARCHAR2(1024),ds_blob   BFILE);TYPE parts IS TABLE OF part;
v_boundary CONSTANT VARCHAR2(60) := '---------------------------30837156019033';
v_end      CONSTANT VARCHAR2(10) := '--';//准备http请求里包含的内容,封装在p_parts参数中PROCEDURE add_file(p_parts        IN OUT parts,p_name         IN VARCHAR2,p_filename     VARCHAR2,p_content_type VARCHAR2,p_blob         BFILE) ASv_part part;BEGIN//p_name: 'file'; p_filename:文件名;v_newline: 0D0A; p_content_typ:application/pdfv_part.ds_header := 'Content-Disposition: form-data; name="' || p_name ||'"; filename="' || p_filename || '"' || v_newline ||'Content-Type: ' || p_content_type || v_newline || v_newline;v_part.ds_blob := p_blob;p_parts.extend();p_parts(p_parts.last) := v_part;END add_file;
//把parts里的内容写入http请求PROCEDURE send(p_req   IN OUT utl_http.req,p_parts IN OUT parts) ASv_length     NUMBER := 0;v_length_bo  NUMBER := length(v_boundary);v_length_nl  NUMBER := length(v_newline);v_length_end NUMBER := length(v_end);v_step  PLS_INTEGER := 12000;v_count PLS_INTEGER := 0;BEGIN-- calculate the content-lengthv_length := v_length + v_length_end + v_length_bo + v_length_nl;FOR i IN p_parts.first .. p_parts.last LOOPv_length := v_length + length(p_parts(i).ds_header);IF (p_parts(i).ds_blob IS NOT NULL) THENv_length := v_length + dbms_lob.getlength(p_parts(i).ds_blob);ELSEv_length := v_length + length(p_parts(i).ds_value);END IF;v_length := v_length + v_length_nl;v_length := v_length + v_length_end + v_length_bo;IF (i != p_parts.last) THENv_length := v_length + v_length_nl;END IF;END LOOP;v_length := v_length + v_length_end + v_length_nl;utl_http.set_header(p_req,'Content-Type','multipart/form-data; boundary=' || v_boundary);utl_http.set_header(p_req,'Content-Length',v_length);//用write_raw才不会有乱码,试了很多次才确定write_raw可以utl_http.write_raw(p_req,utl_raw.cast_to_raw(v_end));utl_http.write_raw(p_req,utl_raw.cast_to_raw(v_boundary));utl_http.write_raw(p_req,utl_raw.cast_to_raw(v_newline));-- write partsFOR i IN p_parts.first .. p_parts.last LOOPutl_http.write_raw(p_req,utl_raw.cast_to_raw(p_parts(i).ds_header));IF (p_parts(i).ds_blob IS NOT NULL) THENdbms_lob.open(p_parts(i).ds_blob,dbms_lob.lob_readonly);v_count := trunc((dbms_lob.getlength(p_parts(i).ds_blob) - 1) / v_step);FOR j IN 0 .. v_count LOOPutl_http.write_raw(p_req,dbms_lob.substr(p_parts(i).ds_blob,v_step,j * v_step + 1));END LOOP;dbms_lob.close(p_parts(i).ds_blob);ELSEutl_http.write_raw(p_req,utl_raw.cast_to_raw(p_parts(i).ds_value));END IF;utl_http.write_raw(p_req,utl_raw.cast_to_raw(v_newline));utl_http.write_raw(p_req,utl_raw.cast_to_raw(v_end));utl_http.write_raw(p_req,utl_raw.cast_to_raw(v_boundary));IF (i != p_parts.last) THENutl_http.write_raw(p_req,utl_raw.cast_to_raw(v_newline));END IF;END LOOP;utl_http.write_raw(p_req,utl_raw.cast_to_raw(v_end));utl_http.write_raw(p_req,utl_raw.cast_to_raw(v_newline));END send;                     

说明

调用add_file和send两个存储过程可以准备好附件上传http请求,其余部分和调用普通REST API代码一样。

这篇关于PL/SQL调用REST API上传附件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1112247

相关文章

Mysql中的用户管理实践

《Mysql中的用户管理实践》:本文主要介绍Mysql中的用户管理实践,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录13. 用户管理13.1 用户 13.1.1 用户信息 13.1.2 创建用户 13.1.3 删除用户 13.1.4 修改用户

MySQL查看表的最后一个ID的常见方法

《MySQL查看表的最后一个ID的常见方法》在使用MySQL数据库时,我们经常会遇到需要查看表中最后一个id值的场景,无论是为了调试、数据分析还是其他用途,了解如何快速获取最后一个id都是非常实用的技... 目录背景介绍方法一:使用MAX()函数示例代码解释适用场景方法二:按id降序排序并取第一条示例代码解

Python+PyQt5实现MySQL数据库备份神器

《Python+PyQt5实现MySQL数据库备份神器》在数据库管理工作中,定期备份是确保数据安全的重要措施,本文将介绍如何使用Python+PyQt5开发一个高颜值,多功能的MySQL数据库备份工具... 目录概述功能特性核心功能矩阵特色功能界面展示主界面设计动态效果演示使用教程环境准备操作流程代码深度解

如何清理MySQL中的binlog问题

《如何清理MySQL中的binlog问题》:本文主要介绍清理MySQL中的binlog问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目http://www.chinasem.cn录清理mysql中的binlog1.查看binlog过期时间2. 修改binlog过期

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

查看MySql主从同步的偏移量方式

《查看MySql主从同步的偏移量方式》:本文主要介绍查看MySql主从同步的偏移量方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 1.mysql的主从同步方案mysqlphp为了在实现读写分离,主库写,从库读mysql的同步方案主要是通过从库读取主库的binl

GitLab文件的上传与下载方式

《GitLab文件的上传与下载方式》:本文主要介绍GitLab文件的上传与下载方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录GitLab 项目拉取到本地GitLab 项目上传方法方法 1:本地项目未初始化Git方法 2:本地项目已初始化GitGitLab 上

MySQL表空间结构详解表空间到段页操作

《MySQL表空间结构详解表空间到段页操作》在MySQL架构和存储引擎专题中介绍了使用不同存储引擎创建表时生成的表空间数据文件,在本章节主要介绍使用InnoDB存储引擎创建表时生成的表空间数据文件,对... 目录️‍一、什么是表空间结构1.1 表空间与表空间文件的关系是什么?️‍二、用户数据在表空间中是怎么

Java JSQLParser解析SQL的使用指南

《JavaJSQLParser解析SQL的使用指南》JSQLParser是一个Java语言的SQL语句解析工具,可以将SQL语句解析成为Java类的层次结构,还支持改写SQL,下面我们就来看看它的具... 目录一、引言二、jsQLParser常见类2.1 Class Diagram2.2 Statement

mysql中的group by高级用法详解

《mysql中的groupby高级用法详解》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,本文给大家介绍mysql中的groupby... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使