【问题标题】:Calling a function with escaping a single quote使用转义单引号调用函数
【发布时间】:2018-12-27 20:08:37
【问题描述】:

我在将字符串传递给将在 IN 子句中使用该字符串的函数时遇到问题。

字符串如下所示:

OracleParameter p = new OracleParameter("'ABC','EEE','DDD','FFF'", val, OracleDbType.VarChar2, ParameterDirection.Input);

PL/SQL 函数中的IN 子句是这样的:

sqlString := 'WHERE SomeCd IN (' || in_Codes || ')'

所以当函数执行时,你会得到这个子句:

WHERE someCd IN ('ABC','EEE','DDD','FFF')

问题是,我无法在我的 IDE 中真正测试它,因为为了传递它,我必须使用转义序列来转义单引号。这导致字符串看起来像这样:

  1. '''ABC'',''EEE'',''DDD'',''FFF'''

    被解析为''ABC'',''EEE'',''DDD'',''FFF''

  2. q'['ABC','EEE','DDD','FFF']'

    作为q'['ABC','EEE','DDD','FFF']' 发送给函数。

这些都不能正常工作,因为字符串的格式现在是错误的。

如何以正确的格式将此列表传递给函数?我必须使用 varray 还是什么?

编辑:

一般的问题是:当我在转义的一对单引号 '''' 中转义单引号 '' 时,转义的单引号 '' 也被传递给函数。

【问题讨论】:

  • 首先不要将 SQL 查询构造为字符串。这是非常不安全的。
  • @Servy 它不是在 C# 端构造为 string。刚刚作为VARCHAR2 传递给PL/SQL 函数。
  • 它们会以这种方式出现在 Run PL/SQL 窗口中,但它显示的是 SQL*Developer 动态创建的包装器代码。您的实际功能将收到正确的值。我在 SQL*Developer 17.4 上对此进行了测试。如果您没有得到相同的结果,我建议您更新您的问题,并提供更多详细信息,可能还包括屏幕截图。

标签: c# oracle plsql odp.net


【解决方案1】:

试试 OracleParameter p = new OracleParameter(@"'ABC','EEE','DDD','FFF'", val, OracleDbType.VarChar2, ParameterDirection.Input);

这应该在不改变字符串本身的情况下按字面意思解释字符串。

请注意,我添加了 @ 符号。

【讨论】:

  • 我本来打算这样做,但您不需要在 C# 中转义单引号,对吗?那么逐字字符(@)应该不是必需的吗?
  • 就我个人而言,我已经看到单引号在我自己的一些项目中导致问题,但我很确定他的问题是转义字符作为命令的一部分被发送到他的 SQL 函数中。所以我建议使用@,因为它不应该改变传递的字符串。希望
猜你喜欢
  • 1970-01-01
  • 2019-11-29
  • 2015-01-10
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 2018-04-05
相关资源
最近更新 更多