【问题标题】:'No Rows Selected' when running query on sqlplus using CMD使用 CMD 在 sqlplus 上运行查询时“未选择行”
【发布时间】:2020-10-23 02:40:32
【问题描述】:

您好,我正在尝试在 cmd 上使用 sqlplus 运行名为 query.sql 的文件,但在 csv 中出现“未选择行”,而在 Oracle SQL Developer 上运行时,相同的查询会给出结果

我在 cmd 上运行了以下命令

sqlplus <username>/<password>@sid @query.sql > output.csv

query.sql里面的查询是

SELECT
   SR.SOID,
   EL.SOID,
   EO.EPTNUMBER,
   EO.SLELABEL,
   EL.LOGTEXT,
   utl_raw.cast_to_varchar2(dbms_lob.substr(SR.SODATA, 3000, 1)) AS NAC_DATA 
FROM
   SORECORD SR,
   SOAPPKEY SK,
   EPTORDER EO,
   EPTLOG EL 
WHERE
   SK.APPKEYNAME = 'MSISDN' 
   AND SK.appkeyvalue = '<ctn here>' 
   AND SK.SOID = SR.SOID 
   AND SR.SOTYPE = 'NAC' 
   AND SR.Receipttimestamp LIKE '07-JAN-20' 
   AND SR.SOID = EO.SOID 
   AND EO.EPTNUMBER = EL.EPTNUMBER 
   AND EL.SOID LIKE TO_CHAR((
   Select
      SUBSTR(TO_CHAR(SR.SOID), 1, LENGTH(SR.SOID) - 1) 
   FROM
      SORECORD SR, SOAPPKEY SK 
   WHERE
      SK.APPKEYNAME = 'MSISDN' 
      AND SK.appkeyvalue = '<ctn here>' 
      AND SK.SOID = SR.SOID 
      AND SR.SOTYPE = 'NAC' 
      AND SR.Receipttimestamp LIKE '07-JAN-20')) || '%' 
      AND EL.SOID > TO_NUMBER((
      Select
         SUBSTR(TO_CHAR(SR.SOID), 1, LENGTH(SR.SOID) - 1) 
      FROM
         SORECORD SR, SOAPPKEY SK 
      WHERE
         SK.APPKEYNAME = 'MSISDN' 
         AND SK.appkeyvalue = '<ctn here>' 
         AND SK.SOID = SR.SOID 
         AND SR.SOTYPE = 'NAC' 
         AND SR.Receipttimestamp LIKE '07-JAN-20') || '0');

我尝试了其他查询来生成 csv,它们运行良好。当同一查询在 Oracle SQL Developer 中获取结果时,我不知道为什么这个查询会为 sqlplus cmd 提供“未选择行”。

谁能帮我指出问题?

【问题讨论】:

    标签: oracle cmd oracle-sqldeveloper sqlplus sql-plus-dot-net


    【解决方案1】:

    如果SR.Receipttimestamp 列的数据类型是DATE,为什么要将它与字符串进行比较? '07-JAN-20' 一个字符串,而不是日期。您依靠 Oracle 的功能将该字符串隐式转换为有效的日期值,但是 - 这并不总是有效。我想这就是困扰您的问题的原因。

    我建议你重写它;一个简单的选择——只是看看它是否有帮助——是

    where trunc(SR.Receipttimestamp) = date '2020-01-07'
    

    • 使用trunc,“删除”时间组件(它将将该列的值设置为 00:00 小时)
    • 将其与始终采用date 'yyyy-mm-dd' 格式的日期文字进行比较

    【讨论】:

    • 谢谢,使查询中的这种更改适用于 SQLPLUS,但我现在面临一个新问题。请参考下面的答案
    【解决方案2】:

    @Littlefoot,我进行了上述更改并且它有效,但现在在 csv 文件中遇到了一些问题

    我使用了以下假脱机代码:

    set pagesize 0
    set feed off
    set term off
    spool '<my path here>'
    
    SELECT
       SR.SOID,
       EL.SOID,
       EO.EPTNUMBER,
       EO.SLELABEL,
       EL.LOGTEXT,
       utl_raw.cast_to_varchar2(dbms_lob.substr(SR.SODATA, 3000, 1)) AS NAC_DATA 
    FROM
       SORECORD SR,
       SOAPPKEY SK,
       EPTORDER EO,
       EPTLOG EL 
    WHERE
       SK.APPKEYNAME = 'MSISDN' 
       AND SK.appkeyvalue = '07996703863' 
       AND SK.SOID = SR.SOID 
       AND SR.SOTYPE = 'NAC' 
       AND trunc(SR.Receipttimestamp) = date '2020-01-07' 
       AND SR.SOID = EO.SOID 
       AND EO.EPTNUMBER = EL.EPTNUMBER 
       AND EL.SOID LIKE TO_CHAR((
       Select
          SUBSTR(TO_CHAR(SR.SOID), 1, LENGTH(SR.SOID) - 1) 
       FROM
          SORECORD SR, SOAPPKEY SK 
       WHERE
          SK.APPKEYNAME = 'MSISDN' 
          AND SK.appkeyvalue = '07996703863' 
          AND SK.SOID = SR.SOID 
          AND SR.SOTYPE = 'NAC' 
          AND trunc(SR.Receipttimestamp) = date '2020-01-07')) || '%' 
          AND EL.SOID > TO_NUMBER((
          Select
             SUBSTR(TO_CHAR(SR.SOID), 1, LENGTH(SR.SOID) - 1) 
          FROM
             SORECORD SR, SOAPPKEY SK 
          WHERE
             SK.APPKEYNAME = 'MSISDN' 
             AND SK.appkeyvalue = '07996703863' 
             AND SK.SOID = SR.SOID 
             AND SR.SOTYPE = 'NAC' 
             AND trunc(SR.Receipttimestamp) = date '2020-01-07') || '0');
    
    spool off
    

    并使用 CMD

    sqlplus <username>/<password>@sid @<path of spool txt>
    

    现在我得到如下 csv 数据

    5764377,5764371,1,EEVMS,                                                        
    Tue Jan 07 08:29:49:887 2020SOAP MESSAGE SENT:                                  
    <S:Envel                                                                        
                                                                                    
    5764377,5764375,1,EEVMS,                                                        
    Tue Jan 07 08:30:49:900 2020SOAP MESSAGE SENT:                                  
    <S:Envel                                                                        
                                                                                    
    5764377,5764376,1,EEVMS,                                                        
    Tue Jan 07 08:31:50:003 2020SOAP MESSAGE SENT:                                  
    <S:Envel            
    

    现在我面临两个问题:

    1. 我从 EL.LOGTEXT 获取部分数据,其数据类型为 CLOB
    2. utl_raw.cast_to_varchar2(dbms_lob.substr(SR.SODATA, 3000, 1)) AS NAC_DATA 的数据列全部从 csv 中丢失

    这是 SQL Developer 上查询数据的快照。我实际上想要在我的 CSV 中以这种表格格式的数据:

    【讨论】:

      猜你喜欢
      • 2014-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-25
      • 2015-04-05
      • 1970-01-01
      相关资源
      最近更新 更多