【问题标题】:Dynamically create folder in plsql procedure in server在服务器的plsql过程中动态创建文件夹
【发布时间】:2016-09-15 16:14:03
【问题描述】:

我已经写了一个 pl/sql 程序:

PROCEDURE xx_WriteBLOBToFILE (myfilename IN VARCHAR2,L_PERSON_ID IN NUMBER) IS 

  v_blob         BLOB;
  blob_length    INTEGER;
    out_file utl_file.file_type;
  v_buffer       RAW(32767);
  chunk_size     BINARY_INTEGER := 32767;
  Blob_Position  Integer := 1;
   G_Zipped_Blob Blob;
B_Dl_File1 Blob;
BEGIN

  -- Retrieve the BLOB for reading
  Select Image Into V_Blob From Per_Images 
  Where Parent_Id =L_PERSON_ID;

  -- Retrieve the SIZE of the BLOB
  blob_length:=DBMS_LOB.GETLENGTH(v_blob);

  -- Open a handle to the location where you are going to write the BLOB to file
  -- NOTE: The 'wb' parameter means "write in byte mode" and is only availabe
  --       in the UTL_FILE package with Oracle 10g or later
  Out_File := Utl_File.Fopen ('**INT_DIR_IMG_BLOB**', Myfilename, 'wb', Chunk_Size);

  -- Write the BLOB to file in chunks 
  WHILE blob_position <= blob_length LOOP
    IF blob_position + chunk_size - 1 > blob_length THEN
      chunk_size := blob_length - blob_position + 1;
    End If;

    DBMS_LOB.READ(v_blob, chunk_size, blob_position, v_buffer);
    UTL_FILE.PUT_RAW(out_file, v_buffer, TRUE);
    blob_position := blob_position + chunk_size;
  END LOOP;

  -- Close the file handle
  Utl_File.Fclose (Out_File);
End;

我想在 /Blobfile 的某个位置动态创建文件夹,然后动态创建类似 INT_DIR_IMG_BLOB 的目录。

如何在 plsql 中创建服务器中的文件夹

【问题讨论】:

    标签: plsql oracle-sqldeveloper plsqldeveloper


    【解决方案1】:

    如果操作系统目录尚不存在,您可能无法直接在 PL/SQL 中创建它。您可以创建一个 Java 存储过程(如果您的数据库在 Windows 上运行,则为 .Net 存储过程)来创建操作系统目录并从 PL/SQL 调用它。您还可以创建一个 dbms_scheduler 作业,调用操作系统来创建目录并从 PL/SQL 调用它。

    一旦操作系统目录存在,您就可以使用动态 SQL 创建 Oracle 目录对象。您可能还需要动态地将对该目录对象的权限授予用户。

    execute immediate 'create directory ' || directory_name_you_want ||
                      ' as ''' || directory_path || '''';
    execute immediate 'grant read on ' || directory_name_you_want ||
                      ' to some_role';
    

    然后您可以在代码中使用新创建的目录。

    虽然你可以这样做,但我通常建议你不要走这条路。在运行时动态创建对象通常不是一个好主意,它会使您的代码更加复杂并且难以支持。它还为事情以新颖有趣的方式出错创造了很多机会。

    【讨论】:

    • 这意味着我无法在 plsql 的目录中创建新文件夹?
    • @sreekembose - 纯 PL/SQL 无法在操作系统级别创建新的子目录,不。 PL/SQL 可以调用 Java 或 .Net 或操作系统来执行此操作。
    【解决方案2】:

    您可以使用 DBMS_SCHEDULER 在操作系统中创建文件夹。 1. 创建凭据。 2. 编写外部作业执行的调度器。

    BEGIN
       DBMS_CREDENTIAL.CREATE_CREDENTIAL(
          credential_name  =>  'credintial',   ----- credintial name give by u
          username         =>  'dons',          ----- os username
          password         =>  'password');    ----- os password
    END;
    /
    
    
    CREATE OR REPLACE PROCEDURE PROC_MAKEFOLDER AS 
    BEGIN
    DBMS_SCHEDULER.CREATE_JOB 
    (JOB_NAME=>'folder_maker',       --- job name 
    JOB_ACTION=>'mkdir /home/anil/new_folder',    --- executable file with path 
    JOB_TYPE=>'executable',        -----   job type
    NUMBER_OF_ARGUMENTS=>0,  --  parameters in numbers 
    ENABLED=>false,                   
    AUTO_DROP =>true,
    CREDENTIAL_NAME=>'credintial',   -- give credentials name which you have created before "credintial"
    COMMENTS=> 'folder or os directory creation');
    DBMS_SCHEDULER.RUN_JOB('folder_maker');
    END ;
    
    EXEC PROC_MAKEFOLDER;
    

    【讨论】:

      猜你喜欢
      • 2020-03-13
      • 2016-09-26
      • 1970-01-01
      • 2018-04-26
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 2022-07-08
      • 1970-01-01
      相关资源
      最近更新 更多