Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在使用DBAL对oracle数据库执行查询时,如何转义oracle保留关键字?_Php_Sql_Oracle_Doctrine Orm_Dbal - Fatal编程技术网

Php 在使用DBAL对oracle数据库执行查询时,如何转义oracle保留关键字?

Php 在使用DBAL对oracle数据库执行查询时,如何转义oracle保留关键字?,php,sql,oracle,doctrine-orm,dbal,Php,Sql,Oracle,Doctrine Orm,Dbal,我试图使用DBAL在Oracle数据库上执行以下查询。我以前执行过其他查询,所以这不是连接问题。问题源于试图转义保留字Number。我需要选择一列作为Number,以便以后进行逻辑分析。查询的简化工作版本如下: SELECT instructor.SecNum AS "Number" FROM ( SELECT dbA.ID, dbA.ClsNumber as SecNum, dbA.Crs

我试图使用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:无效字符
错误

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

// ...
$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关键字未在预期位置找到。

当我说
$ESCAPEDNUMBER=addslashes('Number')时,还发现了
ORA-00923
错误

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

我的问题是如何使用DBAL在php查询中正确转义oracle保留字。我使用引号是因为在Oracle中,查询中需要引号,否则您将得到一个
ORA-00923:FROM关键字not found where expected”错误。

可以找到有关DBAL的相关文档
而且

也明白了。问题是查询末尾的分号。这在控制台中可以正常工作,但在使用DBAL运行时,显然给出了
ORA-00911:无效字符。
。如图所示

固定查询:

// 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);

这是一个MySQL的东西,我不知道它是否会转换为Oracle,但是您是否尝试在列名周围添加
`
?例如
`dbA.ClsNumber`
编辑:看起来是的Oracle使用了双引号,这就是我一直在转义引号之类的原因。这看起来不像是有效的SQL-第二个选择列表缺少逗号。它是valid SQL。第二个选择列表不需要逗号,因为我没有选择多个东西…
…dbA.ID dbA.ClsNumber作为SecNum dbA.CrsCatlgNbr…
-其中应该有逗号。