如何使用 SQL 开发人员将任何文件从本地机器上传到数据库服务器文件系统

Posted

技术标签:

【中文标题】如何使用 SQL 开发人员将任何文件从本地机器上传到数据库服务器文件系统【英文标题】:how to upload any file from local machine to database server file system using SQL developer 【发布时间】:2016-09-01 07:50:56 【问题描述】:

这是我的代码:

我需要从本地机器上传一个文件到文件系统 另外,打开oracle应用程序(ORA-01403: no data found中附加的文件时出现错误


FRM-40735:WHEN-BUTTON-PRESSED 触发器引发未处理的异常 ORA-01403。)

CREATE OR REPLACE DIRECTORY in_file_loc AS '/oracle/TEST';



CREATE TABLE test_files  (p_id NUMBER,
                          pl_name VARCHAR2(100),
                          pl_pict BLOB);



DECLARE
    x_blob                BLOB;
    fils                  BFILE   := BFILENAME ('IN_FILE_LOC', 'aa.pdf');
    blob_length           INTEGER;
BEGIN
-- Obtain the size of the blob file
   DBMS_LOB.fileopen (fils, DBMS_LOB.file_readonly);
   blob_length := DBMS_LOB.getlength (fils);
   DBMS_LOB.fileclose (fils);

-- Insert a new record into the table containing the
-- filename you have specified and a LOB LOCATOR.
-- Return the LOB LOCATOR and assign it to x_blob.
    INSERT INTO test_files (p_id,pl_name,pl_pict)
    VALUES (7, 'aa.pdf', EMPTY_BLOB ())
 RETURNING pl_pict
      INTO x_blob;

-- Load the file into the database as a BLOB
   DBMS_LOB.OPEN (fils, DBMS_LOB.lob_readonly);
   DBMS_LOB.OPEN (x_blob, DBMS_LOB.lob_readwrite);
   DBMS_LOB.loadfromfile (x_blob, fils, blob_length);
-- Close handles to blob and file
   DBMS_LOB.CLOSE (x_blob);
   DBMS_LOB.CLOSE (fils);
COMMIT;
-- Confirm insert by querying the database
-- for LOB length information and output results
   blob_length := 0;

SELECT DBMS_LOB.getlength (pl_pict)
 INTO blob_length
 FROM test_files
WHERE pl_name = 'aa.pdf';

DBMS_OUTPUT.put_line ('Successfully inserted BLOB ''' ||'aa.pdf' || ''' of size ' || blob_length || ' bytes.');
END; 


DECLARE
TYPE result_set_type IS REF CURSOR;

l_name              VARCHAR2 (100);
l_doc_size          NUMBER;
l_result_set_curr   result_set_type;
x_access_id         NUMBER;
x_file_id           NUMBER;
p_file_name         VARCHAR2 (100)  := 'aa.pdf';

PROCEDURE load_file_details (p_name IN VARCHAR2, result_set_curr OUT result_set_type)
AS
  l_error   VARCHAR2 (2000);
BEGIN
  INSERT INTO fnd_lobs_document
              (NAME, mime_type, doc_size, content_type, blob_content)
     SELECT pl_name, 'application/pdf', DBMS_LOB.getlength (pl_pict), 'BINARY', '(BLOB)'
       FROM test_files
      WHERE pl_name = 'aa.pdf';

  OPEN result_set_curr FOR
     SELECT blob_content
       FROM fnd_lobs_document
      WHERE NAME = p_name;

EXCEPTION
  WHEN OTHERS
  THEN
     NULL;
     l_error := 'LOAD_FILE_DETAILS - OTHERS' || SUBSTR (SQLERRM, 2000);
     DBMS_OUTPUT.put_line (l_error);

END load_file_details;

PROCEDURE upload_file (v_filename IN VARCHAR2, x_access_id OUT NUMBER, x_file_id OUT NUMBER)
AS
  v_access_id   NUMBER;
  v_file_id     NUMBER;
  x_errbuf      VARCHAR2 (200);
BEGIN
  v_access_id := fnd_gfm.authorize (NULL);
  x_access_id := v_access_id;
  DBMS_OUTPUT.put_line ('Access id :' || v_access_id);
  -- The function fnd_gfm.confirm_upload return the file id
  v_file_id :=
     fnd_gfm.confirm_upload (access_id            => v_access_id
                           , file_name            => v_filename
                           , program_name         => 'TEST'
                           , program_tag          => 'TEST'
                           , expiration_date      => NULL
                           , LANGUAGE             => 'US'
                           , wakeup               => TRUE
                            );
  x_file_id := v_file_id;
  DBMS_OUTPUT.put_line ('File id :' || x_file_id);
EXCEPTION
  WHEN OTHERS
  THEN
     x_errbuf := 'Procedure upload_file errored out with the following error : ' || SQLERRM;
     DBMS_OUTPUT.put_line (x_errbuf);
END upload_file;
BEGIN
fnd_global.apps_initialize (0, 20634, 401);
load_file_details (p_name => p_file_name, result_set_curr => l_result_set_curr);
upload_file (v_filename => p_file_name, x_access_id => x_access_id, x_file_id => x_file_id);
COMMIT;
END;


DECLARE
TYPE result_set_type IS REF CURSOR;

l_name              VARCHAR2 (100);
l_doc_size          NUMBER;
l_result_set_curr   result_set_type;
x_access_id         NUMBER;
x_file_id           NUMBER;
p_file_name         VARCHAR2 (100)  := 'aa.pdf';

PROCEDURE attach_file (p_access_id IN NUMBER, p_file_Id in number, p_filename IN VARCHAR2)
IS
BEGIN
      fnd_webattch.add_attachment (seq_num                  => 900
                                 ,category_id               => 1
                                 ,document_description      => 'Test1'
                                 ,datatype_id               => 5
                                 ,text                      => NULL
                                 ,file_name                 => p_filename
                                 ,url                       => NULL
                                 ,function_name             => 'INVIDITM'
                                 ,entity_name               => 'MTL_SYSTEM_ITEMS'
                                 ,pk1_value                 => 85 --organization_id
                                 ,pk2_value                 => 10 --Inventory_item_Id
                                 ,pk3_value                 => NULL
                                 ,pk4_value                 => NULL
                                 ,pk5_value                 => NULL
                                 ,media_id                  => p_file_id
                                 ,user_id                   => 0
                                 ,usage_type                => 'O'
                                 );  
  DBMS_OUTPUT.put_line ('File Attached!');
EXCEPTION
  WHEN OTHERS
  THEN
     DBMS_OUTPUT.put_line ('error in loading the attachement');
END attach_file;
BEGIN
fnd_global.apps_initialize (0, 20634, 401);
attach_file (p_access_id => x_access_id, p_file_id=>x_file_id,p_filename => p_file_name);
COMMIT;
END;

【问题讨论】:

【参考方案1】:

我相信我们在这里混合了上下文。我假设这里的本地机器是指您构建 PL/SQL 的机器——这里唯一的问题是当您在服务器上下文中运行它时。所以我要么将文件通过 FTP 传输到服务器,要么以不同的方式将文件内容加载到 oracle 表中。

【讨论】:

以上是关于如何使用 SQL 开发人员将任何文件从本地机器上传到数据库服务器文件系统的主要内容,如果未能解决你的问题,请参考以下文章

asp.net:如何使用 ssl 证书

远程桌面登录后如何拷贝文件到本地机器?

linux上很方便的上传下载文件工具rz和sz使用介绍

如何通过使用 Selenium Grid 将文件从本地计算机传输到远程 Web 服务器来上传文件

如何将 React Native 应用程序上的本地图像文件上传到 Rails api?

从外部托管的Jupyter笔记本导出数据