【问题标题】:Using PL/SQL how do you I get a file's contents in to a blob?使用 PL/SQL 如何将文件的内容放入 blob?
【发布时间】:2010-09-12 11:34:04
【问题描述】:

我有一个文件。我想将其内容放入我的 oracle 数据库中的 blob 列或放入我的 PL/SQL 程序中的 blob 变量中。最好的方法是什么?

【问题讨论】:

    标签: oracle file-io plsql blob


    【解决方案1】:

    要完全在 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;
    /
    

    【讨论】:

    • 您能帮我如何从报表服务器(超链接)读取文件并将其添加到此处的 BLOB 对象中吗? stackoverflow.com/questions/26881146/…
    • 您好,可以不用将文件添加到表格中吗?
    • 我并不是要劫持线程,但我想知道为什么在变量名前加一个小写的“l?”如此普遍
    【解决方案2】:

    取决于您的环境。在 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();
    

    但这真的取决于您使用的环境/工具。需要更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      相关资源
      最近更新 更多