【问题标题】:How do you escape oracle reserved keywords when using Doctrine DBAL to execute queries on an Oracle database?使用 Doctrine DBAL 在 Oracle 数据库上执行查询时,如何转义 oracle 保留关键字?
【发布时间】:2014-01-24 11:23:51
【问题描述】:

我正在尝试使用 Doctrine DBAL 在 Oracle 数据库上执行以下查询。我之前执行过其他查询,所以这不是连接问题。问题源于试图转义保留字Number。我需要选择一列作为Number 以供以后的逻辑使用。查询的简化工作版本如下:

SELECT instructor.SecNum AS "Number"
      FROM (
           SELECT dbA.ID,
                  dbA.ClsNumber as SecNum,
                  dbA.CrsCatlgNbr,
                  ROW_Number() OVER (PARTITION BY dbA.ClsNumber ORDER BY dbA.CrsCatlgNbr) AS rn
           FROM dbA
           WHERE (dbA.SubCd = '5')
           AND (dbA.ID IS NOT NULL)
           ) instructor,
           (
            SELECT dbB.SecNum
            FROM dbB
            WHERE (dbB.SubCd = '5')
           ) student
      WHERE (instructor.rn = 1)
      AND (instructor.SecNum = student.SecNum);

PHP代码如下

// set up connection stuff and relevant variables
$sectionTable = array();
$dss1prdDatabase->executeQuery(
"SELECT instructor.SecNum AS \"Number\"
      FROM (
           SELECT dbA.ID
                 dbA.ClsNumber as SecNum
                 dbA.CrsCatlgNbr
                 ROW_Number() OVER (PARTITION BY dbA.ClsNumber ORDER BY dbA   CrsCatlgNbr) AS rn
           FROM dbA
           WHERE (dbA.SubCd = '5')
           AND (dbA.ID IS NOT NULL)
           ) instructor,
           (
            SELECT dbB.SecNum
            FROM dbB
            WHERE (dbB.SubCd = '5')
           ) student
      WHERE (instructor.rn = 1)
      AND (instructor.SecNum = student.SecNum);", $sectionTable);

当我这样做时,我得到一个ORA-00911: invalid character 错误。

我也尝试过先准备语句,然后将转义的列名绑定到查询:

// ...
$ESCAPEDNUMBER = '\"Number\"';
$sql = "SELECT instructor.SecNum AS ?
      FROM (
           SELECT dbA.ID
                 dbA.ClsNumber as SecNum
                 dbA.CrsCatlgNbr
                 ROW_Number() OVER (PARTITION BY dbA.ClsNumber ORDER BY dbA   CrsCatlgNbr) AS rn
           FROM dbA
           WHERE (dbA.SubCd = '5')
           AND (dbA.ID IS NOT NULL)
           ) instructor,
           (
            SELECT dbB.SecNum
            FROM dbB
            WHERE (dbB.SubCd = '5')
           ) student
      WHERE (instructor.rn = 1)
      AND (instructor.SecNum = student.SecNum);"
$stmt = $dbalDatabaseConnection->prepare($sql);
$stmt->bindvalue(1, $ESCAPEDNUMBER);
$stmt->execute($sectionTable);

但这给了我一个不同的错误:ORA-00923: FROM keyword not found where expected.

当我说$ESCAPEDNUMBER = addslashes('"Number"');时也发现ORA-00923错误

我不知道问题是什么。有什么想法吗?

我的问题再次是如何使用 Doctrine DBAL 在 php 查询中正确转义 oracle 保留字。我使用引号是因为在 Oracle 中,查询中需要引号,否则您将得到 ORA-00923: FROM keyword not found where expected" error.

可以在here找到关于 DBAL 的相关文档 还有

【问题讨论】:

  • 这是一个 MySQL 的东西,我不知道它是否会转换为 Oracle,但是您是否尝试在列名周围添加 `?例如`dbA.ClsNumber` 编辑:看起来像 Oracle approach would be to use double quotes
  • 是的 Oracle 使用双引号,这就是为什么我一直在转义引号等。
  • 这看起来不像是有效的 SQL - 第二个选择列表缺少逗号。
  • 这是有效的 SQL。第二个选择列表不需要逗号,因为我没有选择多个东西......
  • ...dbA.ID dbA.ClsNumber as SecNum dbA.CrsCatlgNbr... - 里面应该有逗号。

标签: php sql oracle doctrine-orm dbal


【解决方案1】:

知道了。问题是查询末尾的分号。这在控制台中运行良好,但在使用 DBAL 运行时显然会给出ORA-00911: invalid character。去图...

固定查询:

// set up connection stuff and relevant variables
$sectionTable = array();
$dss1prdDatabase->executeQuery(
"SELECT instructor.SecNum AS \"Number\"
      FROM (
           SELECT dbA.ID
                 dbA.ClsNumber as SecNum
                 dbA.CrsCatlgNbr
                 ROW_Number() OVER (PARTITION BY dbA.ClsNumber ORDER BY dbA   CrsCatlgNbr) AS rn
           FROM dbA
           WHERE (dbA.SubCd = '5')
           AND (dbA.ID IS NOT NULL)
           ) instructor,
           (
            SELECT dbB.SecNum
            FROM dbB
            WHERE (dbB.SubCd = '5')
           ) student
      WHERE (instructor.rn = 1)
      AND (instructor.SecNum = student.SecNum)", $sectionTable);

【讨论】:

    猜你喜欢
    • 2013-04-03
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    相关资源
    最近更新 更多