Oracle PL/SQL中是否有用于拆分文件和父目录的库函数?

Oracle PL/SQL中是否有用于拆分文件和父目录的库函数?,oracle,plsql,Oracle,Plsql,给定一个文件路径,我试图在Oracle PL/SQL中分离文件名和父目录。我想知道PL/SQL库中是否已经有了一个可用的函数。如果您使用的是10g或更高版本,那么它就需要一些正则表达式精处理,这取决于您的操作系统,可能如下所示: with filepaths as ( select '/home/oracle/somedir/blah.sql' as linux , 'c:\home\oracle\somedir\blah.sql' as windows from du

给定一个文件路径,我试图在Oracle PL/SQL中分离文件名和父目录。我想知道PL/SQL库中是否已经有了一个可用的函数。如果您使用的是10g或更高版本,那么它就需要一些正则表达式精处理,这取决于您的操作系统,可能如下所示:

with filepaths as (
  select '/home/oracle/somedir/blah.sql' as linux
       , 'c:\home\oracle\somedir\blah.sql' as windows
    from dual
         )
select regexp_substr(linux, '[^/]+', 1
                     , regexp_count(linux,'/')) as linux
     , regexp_substr(windows, '[^\]+', 1
                     , regexp_count(windows,'[^\]+')) as windows
  from filepaths
       ;

LINUX    WINDOWS
-------- --------
blah.sql blah.sql
WITH filepaths AS
  (SELECT '/home/oracle/somedir/blah.sql' AS LINUX,
          'c:\home\oracle\somedir\blah.sql' AS WINDOWS
     FROM DUAL)
SELECT LINUX,
       SUBSTR(LINUX, 1, INSTR(LINUX, '/', -1)) AS LINUX_PATH,
       SUBSTR(LINUX, INSTR(LINUX, '/', -1)+1) AS LINUX_FILE,
       WINDOWS,
       SUBSTR(WINDOWS, 1, INSTR(WINDOWS, '\', -1)) AS WINDOWS_PATH,
       SUBSTR(WINDOWS, INSTR(WINDOWS, '\', -1)+1) AS WINDOWS_FILE
FROM filepaths;

LINUX         /home/oracle/somedir/blah.sql
LINUX_PATH    /home/oracle/somedir/
LINUX_FILE    blah.sql
WINDOWS       c:\home\oracle\somedir\blah.sql
WINDOWS_PATH  c:\home\oracle\somedir\
WINDOWS_FILE  blah.sql

如果您使用的是10g或更高版本,那么就没有真正的需要,只需要对正则表达式进行一点微调,这取决于您的操作系统,可能如下所示:

with filepaths as (
  select '/home/oracle/somedir/blah.sql' as linux
       , 'c:\home\oracle\somedir\blah.sql' as windows
    from dual
         )
select regexp_substr(linux, '[^/]+', 1
                     , regexp_count(linux,'/')) as linux
     , regexp_substr(windows, '[^\]+', 1
                     , regexp_count(windows,'[^\]+')) as windows
  from filepaths
       ;

LINUX    WINDOWS
-------- --------
blah.sql blah.sql
WITH filepaths AS
  (SELECT '/home/oracle/somedir/blah.sql' AS LINUX,
          'c:\home\oracle\somedir\blah.sql' AS WINDOWS
     FROM DUAL)
SELECT LINUX,
       SUBSTR(LINUX, 1, INSTR(LINUX, '/', -1)) AS LINUX_PATH,
       SUBSTR(LINUX, INSTR(LINUX, '/', -1)+1) AS LINUX_FILE,
       WINDOWS,
       SUBSTR(WINDOWS, 1, INSTR(WINDOWS, '\', -1)) AS WINDOWS_PATH,
       SUBSTR(WINDOWS, INSTR(WINDOWS, '\', -1)+1) AS WINDOWS_FILE
FROM filepaths;

LINUX         /home/oracle/somedir/blah.sql
LINUX_PATH    /home/oracle/somedir/
LINUX_FILE    blah.sql
WINDOWS       c:\home\oracle\somedir\blah.sql
WINDOWS_PATH  c:\home\oracle\somedir\
WINDOWS_FILE  blah.sql

INSTR和SUBSTR字符串函数可用于执行此操作,如下所示:

with filepaths as (
  select '/home/oracle/somedir/blah.sql' as linux
       , 'c:\home\oracle\somedir\blah.sql' as windows
    from dual
         )
select regexp_substr(linux, '[^/]+', 1
                     , regexp_count(linux,'/')) as linux
     , regexp_substr(windows, '[^\]+', 1
                     , regexp_count(windows,'[^\]+')) as windows
  from filepaths
       ;

LINUX    WINDOWS
-------- --------
blah.sql blah.sql
WITH filepaths AS
  (SELECT '/home/oracle/somedir/blah.sql' AS LINUX,
          'c:\home\oracle\somedir\blah.sql' AS WINDOWS
     FROM DUAL)
SELECT LINUX,
       SUBSTR(LINUX, 1, INSTR(LINUX, '/', -1)) AS LINUX_PATH,
       SUBSTR(LINUX, INSTR(LINUX, '/', -1)+1) AS LINUX_FILE,
       WINDOWS,
       SUBSTR(WINDOWS, 1, INSTR(WINDOWS, '\', -1)) AS WINDOWS_PATH,
       SUBSTR(WINDOWS, INSTR(WINDOWS, '\', -1)+1) AS WINDOWS_FILE
FROM filepaths;

LINUX         /home/oracle/somedir/blah.sql
LINUX_PATH    /home/oracle/somedir/
LINUX_FILE    blah.sql
WINDOWS       c:\home\oracle\somedir\blah.sql
WINDOWS_PATH  c:\home\oracle\somedir\
WINDOWS_FILE  blah.sql

共享和享受。

可以使用INSTR和SUBSTR字符串函数来完成此操作,如下所示:

with filepaths as (
  select '/home/oracle/somedir/blah.sql' as linux
       , 'c:\home\oracle\somedir\blah.sql' as windows
    from dual
         )
select regexp_substr(linux, '[^/]+', 1
                     , regexp_count(linux,'/')) as linux
     , regexp_substr(windows, '[^\]+', 1
                     , regexp_count(windows,'[^\]+')) as windows
  from filepaths
       ;

LINUX    WINDOWS
-------- --------
blah.sql blah.sql
WITH filepaths AS
  (SELECT '/home/oracle/somedir/blah.sql' AS LINUX,
          'c:\home\oracle\somedir\blah.sql' AS WINDOWS
     FROM DUAL)
SELECT LINUX,
       SUBSTR(LINUX, 1, INSTR(LINUX, '/', -1)) AS LINUX_PATH,
       SUBSTR(LINUX, INSTR(LINUX, '/', -1)+1) AS LINUX_FILE,
       WINDOWS,
       SUBSTR(WINDOWS, 1, INSTR(WINDOWS, '\', -1)) AS WINDOWS_PATH,
       SUBSTR(WINDOWS, INSTR(WINDOWS, '\', -1)+1) AS WINDOWS_FILE
FROM filepaths;

LINUX         /home/oracle/somedir/blah.sql
LINUX_PATH    /home/oracle/somedir/
LINUX_FILE    blah.sql
WINDOWS       c:\home\oracle\somedir\blah.sql
WINDOWS_PATH  c:\home\oracle\somedir\
WINDOWS_FILE  blah.sql
分享和享受。

非常相似(如果没有重复)问题:非常相似(如果没有重复)问题: