当前位置: 首页 > 面试题库 >

在Java存储过程中创建java.sql.blob实例

乌璞瑜
2023-03-14
问题内容

这是我第一次发布问题,我需要编写一个Java存储过程来创建一个excel文件并返回一个包含字节数据的blob。

我的pl / sql函数的格式如下

function test_create_excel(i_username IN varchar2) return BLOB
   AS LANGUAGE JAVA NAME 'NTO.Excel.ExcelFunctions.PushToExcel( java.lang.String ) return java.sql.Blob';

我的Java方法如下

public static java.sql.Blob TestPushToExcel(String username) throws IOException, SQLException{
        //create excel file, read content to byte array and set to a blob
    }

我的问题是我找不到任何方法来创建java.sql.Blob的实例,因此我可以使用blob.setBinaryStream(..)方法写入文件数据字节数组

我尝试使用 SerialBlob 实现,但导致以下oracle错误

ORA-00932:数据类型不一致:预期的返回值是用户定义的Java类的实例,该实例可以转换为Oracle类型,但返回的对象无法转换

有没有人遇到过这个问题,如果可以的话,您可以分享如何解决这个问题。

先感谢您。

编辑JAVA

public static oracle.sql.BLOB getBlob(byte[] data) throws SQLException, IOException{
        oracle.jdbc.OracleConnection conn = (oracle.jdbc.OracleConnection)new OracleDriver().defaultConnection();

        oracle.sql.BLOB retBlob = oracle.sql.BLOB.createTemporary(conn, true, oracle.sql.BLOB.DURATION_SESSION);

        java.io.OutputStream outStr = retBlob.setBinaryStream(0);
        outStr.write(data);
        outStr.flush();

        return retBlob;
  }


public static ExcelFileStore PushToExcel(String userId) throws IOException, SQLException{

        ExcelFileStore fileStore = new ExcelFileStore();        
        fileStore.NU_USERID = userId;
        fileStore.CreatedTime = new java.sql.Date(new Date().getTime());
        fileStore.Last_Updated = new java.sql.Date(new Date().getTime());        
        fileStore.FileSize = fileData.length;
        fileStore.FileData = getBlob(fileData);        
        return fileStore;
    }

PL / SQL

 function test_create_excel(i_username IN varchar2) return EXCELFILESTORE    AS LANGUAGE JAVA NAME 'NTO.Excel.ExcelFunctions.PushToExcel( java.lang.String, ) return OracleObjects.ExcelFileStore';

OracleObject.ExcelfileStore 是一个实现java.sql.SqlData的类,而 EXCELFILESTORE
是oracle中的UDT。

我使用’ sys.dbms_java.loadjava ‘加载了参考jar和为我的代码创建的jar 。

我希望您能理解我的问题,因为我对PL / SQL编程还很陌生


问题答案:

我错了。它 可以 完成。花了我一段时间才能使其正常工作,但是最后,这是一个有效的示例:

Java类

import oracle.jdbc.driver.*;

public class TestBlob {
  public static oracle.sql.BLOB getBlob(String username) throws Exception {
    oracle.jdbc.OracleConnection conn = 
      (oracle.jdbc.OracleConnection)new OracleDriver().defaultConnection();

    oracle.sql.BLOB retBlob =
      oracle.sql.BLOB.createTemporary(conn,
                                      true,
                                      oracle.sql.BLOB.DURATION_SESSION);

    java.io.OutputStream outStr = retBlob.setBinaryStream(0);
    outStr.write(username.getBytes());
    outStr.flush();

    return retBlob;
  }
}

如您所见,我已将用作oracle.sql.BLOB结果。我使用类的静态createTemporary方法创建它,并BLOB指定应在会话期间(oracle.sql.BLOB.DURATION_SESSION参数)创建它。

然后,我获得OutputStream并写入数据。需要冲洗。

数据库方面

create or replace FUNCTION getBlobWrp (username IN VARCHAR2) RETURN BLOB
  AS LANGUAGE JAVA NAME
              'TestBlob.getBlob(java.lang.String) return oracle.sql.BLOB';

测试:

DECLARE
  l_blob BLOB;
BEGIN
  l_blob := getBlobWrp('test');

  dbms_output.put_line(UTL_RAW.CAST_TO_VARCHAR2(l_blob));
END;

输出:

测试

(先前的答案)

我认为您应该IN OUT BLOBtest_create_excel函数中有一个参数(将其更改为过程),并在Java存储方法中对该参数进行操作。我曾经见过这种方法。

在调用之前test_create_excel,您应该创建一个BLOB对象:

DECLARE
  l_blob BLOB;
BEGIN
  DBMS_LOB.createtemporary(l_blob, TRUE);
  test_create_excel('username', l_blob);
END;

编辑

我认为您要尝试做的事是不可能的。但是,您可以将上面的代码包装在另一个函数中。有点混乱,但是您将拥有一个返回blob的函数:

CREATE OR REPLACE FUNCTION get_excel_blob(p_username VARCHAR2) RETURN BLOB
AS
  l_blob BLOB;
BEGIN
  DBMS_LOB.createtemporary(l_blob, TRUE);
  test_create_excel(p_username, l_blob);
  RETURN l_blob;
END;


 类似资料:
  • MySQL 存储过程是一些 SQL 语句的集合,比如有时候我们可能需要一大串的 SQL 语句,或者说在编写 SQL 语句的过程中需要设置一些变量的值,这个时候我们就完全有必要编写一个存储过程。 编写存储过程并不是件简单的事情,但是使用存储过程可以简化操作,且减少冗余的操作步骤,同时,还可以减少操作过程中的失误,提高效率,因此应该尽可能的学会使用存储过程。 下面主要介绍如何创建存储过程。 可以使用

  • 在Teradata16上创建存储过程时sql出错,请问这个查询有什么问题? 替换过程tutorial_db.banks(out test Varchar(20))BEGIN select name from tutorial_db.banks end;

  • 问题内容: 我正在从PHP中读取一个TEXT文件,并试图从中执行命令,例如创建一个DB及其具有的所有表和过程。我的代码创建表,但不创建文件中给定的存储过程。 PDO没有创建SP,那么将如何完成此任务?我尝试一起执行所有代码部分并逐行执行,但没有任何效果。 我正在尝试制作数据库安装程序脚本。 问题答案: 好吧,PMA帮助我回答了我自己的问题。 为了克服这个问题,您需要删除过程的定界符部分,以便查询变

  • 为了解决MySql中的问题,即某些语句只允许在我试图创建的存储过程中运行,然后在JdbcTem板提交的sql中删除存储过程。一个简单的例子是(这恰好是在Spring引导中): cript.sql在哪里 在mySql workbench中运行它可以很好地工作,但是由JdbcTemplate提交时会出现错误 据我所知,这是因为JdbcTemplate不允许使用那些

  • 问题内容: 我想检查是否存在存储过程列表。我希望所有这些都在1个脚本中一个接一个地完成。到目前为止,我有这种格式: 等等。但是,出现以下错误: 关键字“过程”附近的语法不正确。 为什么我的工作不正常? 问题答案: 必须是批处理中的第一个语句。我通常会这样: (不要忘记授予声明,因为如果您重新创建proc,它们将会丢失) 部署存储过程时要考虑的另一件事是,删除可以成功而创建失败。出现问题时,我总是使

  • 我试图写一个存储过程。通过SQL浏览器创建它很顺利,但是当我把它保存在SQL文件中并通过SQLTool加载它时,它失败了 我收到以下错误 调用SqlTool。objectMain(sqlToolParams); 在哪里 我需要帮助纠正语法。 我试图从他那里得到线索http://hsqldb.org/doc/2.0/util-guide/sqltool-chapt.html#sqltool_raw-