使用PL / SQL,如何将文件内容放入Blob?
时间:2020-03-06 14:37:06 来源:igfitidea点击:
我有一个档案。我想将其内容放入oracle数据库的blob列中,或者PL / SQL程序的blob变量中。最好的方法是什么?
解决方案
取决于环境。在Java中,我们可以执行以下操作...
// Need as OracleConnection in mConnection // Set an EMPTY_BLOB() String update = "UPDATE tablename"+ " SET blob_column = EMPTY_BLOB()"+ " WHERE ID = "+id; CallableStatement stmt = mConnection.prepareCall(update); stmt.executeUpdate(); // Lock the row FOR UPDATE String select = "BEGIN " + " SELECT " + blob_column " INTO ? " + " FROM " + tablename + " WHERE ID = '" + id + "'" + " FOR UPDATE; " + "END;"; stmt = mConnection.prepareCall(select); stmt.registerOutParameter(1, java.sql.Types.BLOB); stmt.executeUpdate(); BLOB blob = (BLOB) stmt.getBlob(1); OutputStream bos = blob.setBinaryStream(0L); FileInputStream fis = new FileInputStream(file); // Code needed here to copy one stream to the other fis.close(); bos.close(); stmt.close(); mConnection.commit();
但这实际上取决于我们使用的环境/工具。需要更多信息。
为了完全在PL / SQL中完成此操作,该文件必须位于服务器上,并且位于我们需要在数据库中定义的目录中。创建以下对象:
CREATE OR REPLACE DIRECTORY BLOB_DIR AS '/oracle/base/lobs' / CREATE OR REPLACE PROCEDURE BLOB_LOAD AS lBlob BLOB; lFile BFILE := BFILENAME('BLOB_DIR', 'filename'); BEGIN INSERT INTO table (id, your_blob) VALUES (xxx, empty_blob()) RETURNING your_blob INTO lBlob; DBMS_LOB.OPEN(lFile, DBMS_LOB.LOB_READONLY); DBMS_LOB.OPEN(lBlob, DBMS_LOB.LOB_READWRITE); DBMS_LOB.LOADFROMFILE(DEST_LOB => lBlob, SRC_LOB => lFile, AMOUNT => DBMS_LOB.GETLENGTH(lFile)); DBMS_LOB.CLOSE(lFile); DBMS_LOB.CLOSE(lBlob); COMMIT; END; /