AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 17347
Accepted
René Nyffenegger
René Nyffenegger
Asked: 2012-05-02 22:10:14 +0800 CST2012-05-02 22:10:14 +0800 CST 2012-05-02 22:10:14 +0800 CST

SQL*Plus、@ 和相对路径

  • 772

不知何故,似乎 SQL*Plus(至少在 Windows 上)在使用相对路径调用@@以及路径以单点或双点开头时无法找到具有相对路径的脚本。

例如,在x:\some\where我有以下目录结构:

script.sql
main-dir\main-sub-dir
              call-script.sql
              script.sql

即:两个script.sql但在不同的位置。

script.sql刚刚下的内容x:\some\where简直了

prompt SCRIPT root

而对方script.sql的内容是

prompt SCRIPT main-dir/main-subdir

call-script.sql读

@@script.sql
@ script.sql

预期产出

如果我从启动 SQL*Plusx:\some\where然后执行

@main-dir/main-sub-dir/call-scripts

输出将是

SCRIPT main-dir/main-subdir
SCRIPT root 

这是意料之中的,因为单曲@应该搜索 SQL*Plus 启动@@的路径,并且应该搜索包含脚本目录的路径。

意外输出

现在,如果我call-scripts.sql这样改变:

@@./script.sql
@ ./script.sql

double@@似乎改变了它的行为,因为它搜索 SQL*Plus 启动的路径,现在输出将是

SCRIPT root
SCRIPT root

这不是我所期望的。


这种行为是否记录在某处,更重要的是,我必须如何更改call-scripts.sql才能正确调用相对路径(@@../../other-dir/other-sub-dir/script)?

oracle sqlplus
  • 1 1 个回答
  • 20994 Views

1 个回答

  • Voted
  1. Best Answer
    Connor McDonald
    2017-03-25T23:25:42+08:002017-03-25T23:25:42+08:00

    是的,这是已经存在很长时间的错误 2391334,并且可能在不久的将来不会修复。

    解决此问题的一种方法是“知道”脚本的路径,而无需实际对该路径进行硬编码。在 SQLPlus 中执行此操作需要一个技巧 - 如果您尝试运行一个不存在的文件,那么您将收到一条包含路径名的错误消息。

    所以这里有一个实际的演示。为了模仿你的场景,我有:

    c:\temp\demo
       script.sql
       maindir
          subdir
             call_script.sql
             script.sql
    

    我们可以做的是在 call_script.sql 的前面添加一些命令来获取路径。它看起来有点奇怪,但您不需要更改它 - 它只是您粘贴的固定内容

    set termout off
    spool _path_finder.sql
    @@_nonexistent_script.sql
    spool off;
    
    var path varchar2(100);
    set serverout on
    declare
      output varchar2(1000) := regexp_replace(replace(q'{
    @_path_finder.sql
    }',chr(10)),'.*"(.*)".*','\1');
    begin 
      :path:=substr(output,1,length(output)-24);
    end;
    /
    col path new_val path
    select :path path from dual;
    set termout on
    

    这里发生了什么,我们正在运行一个不存在的脚本,它返回:

    "SP2-0310: 无法打开文件 "path\_nonexistent_script.sql"

    因此,使用一点正则表达式,我们可以提取路径,将其存储在 SQLPlus 变量中,然后从那时起使用。

    所以你的 call_script.sql 的最终版本看起来像这样

    set termout off
    spool _path_finder.sql
    @@_nonexistent_script.sql
    spool off;
    
    var path varchar2(100);
    set serverout on
    declare
      output varchar2(1000) := regexp_replace(replace(q'{
    @_path_finder.sql
    }',chr(10)),'.*"(.*)".*','\1');
    begin 
      :path:=substr(output,1,length(output)-24);
    end;
    /
    col path new_val path
    select :path path from dual;
    set termout on
    prompt path was &path      
    
    @@&path\script.sql
    @&path\script.sql
    

    当我们运行它时,我们得到以下信息

    SQL> @maindir\mainsubdir\call_script
    path was maindir\mainsubdir
    script in subdir
    script in subdir
    

    你去吧:-)

    • 8

相关问题

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve