简单的 Oracle 查询返回 OracleCommand.CommandText 无效

Posted

技术标签:

【中文标题】简单的 Oracle 查询返回 OracleCommand.CommandText 无效【英文标题】:Simple Oracle query returns OracleCommand.CommandText is invalid 【发布时间】:2021-12-29 17:54:21 【问题描述】:

我有一条 SQL 语句,我尝试在 C# 和 Oracle 中运行,但出现 OracleCommand.CommandText 错误。 我的代码创建了一个外部表,其中从 .tsv 文件加载数据并将其插入到我的表 CI_FT 中。最后它删除了外部表。

我看不出有什么原因会显示 OracleCommand.CommandText。

查询如下:

CREATE TABLE STGMUAG.CI_FT_EXT
   (FT_ID CHAR(12) DEFAULT ' ' NOT NULL ENABLE, 
    SIBLING_ID CHAR(12) DEFAULT ' ' NOT NULL ENABLE
   )
ORGANIZATION EXTERNAL
( 
    DEFAULT DIRECTORY FLAT_FILES
    ACCESS PARAMETERS
    ( 
        records delimited by '\\r\\n'
        skip 1
        fields terminated by '\\t'
    )
    LOCATION('STGMUAG_CI_FT.tsv')  
);

INSERT INTO STGMUAG.CI_FT (
    FT_ID,
    SIBLING_ID
)
SELECT 
 FT_ID,
 SIBLING_ID
FROM STGMUAG.CI_FT_EXT;

DROP TABLE STGMUAG.CI_FT_EXT;

这是我的 C# 脚本

public void ExecNonQuery(string sqlStmt, OracleConnection con, ref string currentSql)
        
            try
            
                var sqlArr = sqlStmt.Split(';');
                foreach (string sql in sqlArr)
                
                    currentSql = sql;
                    OracleCommand cmd = new OracleCommand(sql, con);
                    cmd.CommandType = CommandType.Text;
                    cmd.ExecuteNonQuery();

                    bool fireAgain = false;
                    Dts.Events.FireInformation(0, "PSRM Execute SQL", string.Format("SQL command 0 executed successfully.", sql), "", 0, ref fireAgain);
                
            
            catch (Exception e)
            
                Dts.Events.FireError(0, "PSRM Execute SQL", "SQL command failed. "+ e.Message, null,0);
                throw;
            
        

【问题讨论】:

您的代码将您的脚本分成 3 个语句。这三个语句中的哪一个是失败的?我不知道你为什么每次都要创建和删除表——通常你只需要做一次。 @CaiusJard 我应该在哪里添加 RemoveEmptyEntries?我想检查添加是否可以修复它。可能是第 4 条语句,即空字符串,可能导致它。 我很难确定是哪个 sql 导致了错误。 在日志中说:currentSql = "" 【参考方案1】:

您可以执行以下操作之一:

删除 SQL 字符串末尾的最后一个分号 致电sqlStmt.Trim().Split(new[]';', StringSplitOptions.RemoveEmptyEntries)if(string.IsNullOrWhiteSpace(sql)) continue;放在循环的第一行

后 2 个代码有点多,但如果您有一天不小心在字符串中输入了 ;;,它们将阻止此错误再次出现。只有第三个选项可以防止输入错误 ; ;

我很难确定是哪个 sql 导致了错误

小贴士,也可以考虑这样的事情,也许:

Dts.Events.FireError(0, "PSRM Execute SQL", "SQL command failed. "+ e.Message+
  " the faulting SQL was:" + currentSql, null, 0);

【讨论】:

删除分号就可以了。谢谢! 好地方。 Oracle SQL 没有; 字符。

以上是关于简单的 Oracle 查询返回 OracleCommand.CommandText 无效的主要内容,如果未能解决你的问题,请参考以下文章

oracle 存储过程,数据处理并返回结果集问题

linux系统笑着玩Oracle数据库多表查询

ORACLE SQL 查询从其他表中的行字符串匹配的行返回值

oracle 如何返回多条记录

Oracle sql 查询(几乎)永远运行

oracle中的存储过程如何返回查询到的多个值?