【问题标题】:How to select spool's filename from table in sqlplus如何从 sqlplus 中的表中选择 spool 的文件名
【发布时间】:2011-06-28 16:07:51
【问题描述】:

如何从 sqlplus 的表中选择我的假脱机文件名?

我有类似的东西:

SPOOL ON
SPOOL XXXXXXXXX.bkp
SELECT * FROM my_table WHERE field1='value';
SPOOL OFF

并希望 XXXXXXXXX.bkp 具有来自同一个表的字段的值。

问候, 费尔南多

【问题讨论】:

  • 这个例子中XXXXXXXXX 的值是多少?
  • 这是一个来自 my_table 的 varchar2 字段
  • 是来自表的value,还是字段本身的name
  • 对不起,这是一个字段的值......我想要的是“按字段值对备份行进行分组,将其设置为文件名”。

标签: sql oracle sqlplus spool


【解决方案1】:

我不能 100% 确定您要做什么,但如果您想在假脱机文件中使用变量文件名,您可以这样做:

col dat1 NEW_VALUE v_start_time

select to_char(sysdate,'YYYY-MM-DD_HH24MISS') dat1 from dual;

spool test_script_&v_start_time..txt

/*
other stuff...
*/
spool off

这是一个从我的脚本中提取的示例,该脚本在文件名中添加了时间戳,以使多个输出文件更易于管理。注意spool [filename] 命令中的..

既然你说你想在文件名中有一个实际的字段名,你必须将我的查询更改为查询存储所有字段名的 Oracle 表的东西(我现在不记得它的名字了),但是这应该很容易。

【讨论】:

    【解决方案2】:

    您可以使用 SQLPLUS 的“new_value”功能将列值保存到 sqlplus 变量中,然后如下所示进行假脱机。

    SQL> create table spool_file (
      2       id number,
      3       file_name varchar2(200)
      4  );
    
    Table created.
    
    SQL> insert into spool_file values (1, 'test_spool_123.txt');
    
    1 row created.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> column file_name new_value file_name;
    SQL> select file_name from spool_file
      2    where id = 1;
    
    FILE_NAME
    --------------------------------------------------------------------------------
    test_spool_123.txt
    
    SQL> spool '&file_name';
    SQL> select object_id from dba_objects
      2  where rownum < 10;
    
     OBJECT_ID
    ----------
            28
            49
            11
             6
             3
            52
            40
            19
            59
    
    9 rows selected.
    
    SQL> spool off;
    

    这是我的假脱机文件中的内容。

    SQL> select object_id from dba_objects
      2  where rownum < 10;
    
     OBJECT_ID                                                                      
    ----------                                                                      
            28                                                                      
            49                                                                      
            11                                                                      
             6                                                                      
             3                                                                      
            52                                                                      
            40                                                                      
            19                                                                      
            59                                                                      
    
    9 rows selected.
    
    SQL> spool off;
    

    如果您需要更好地控制对文件的写入,您可能还想查看UTL_FILE 包及其子程序。

    【讨论】:

    • 谢谢!这种方法的唯一问题是我必须查询一次,然后在游标上与下一个查询交互...我正在查看的是保存“在字段中具有值 X 的每一行都保存为 X .bkp,那些在 Y.bkp 中有 Y 的,等等”。有办法吗?
    • 在使用 sqlplus 之前没有这样做过。我相信您可以使用 UTL_FILE 来做到这一点,并将与列相关的所有行写入相应的文件中。看看tkyte.blogspot.com/2009/10/httpasktomoraclecomtkyteflat.html,看看这些方法是否对您有帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-12-09
    • 2021-05-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    相关资源
    最近更新 更多