微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使Oracle保持标识符在查询中的大小写?

如何解决如何使Oracle保持标识符在查询中的大小写?

我想使用使用PDO的PHP库。我想将它与Oracle数据库一起使用。

问题是该库的作者在查询中使用了未引用的标识符,例如:

$statement = $pdo->prepare('SELECT * from some_table where some_column = :some_column');
$statement->execute(['some_column' => 'some value']);
$result = $statement->fetch(\PDO:FETCH_ASSOC);
return $result['some_other_column'];

在这种情况下,Oracle将标识符的大小写转换为UPPER,但是作者认为大小写较小,因此发生undefined index PHP错误

我该如何绕过?

UPD。我在创建数据库对象时尝试使用小写字母,例如:

CREATE TABLE "some_table"
(
    "some_column"       VARCHAR(10),"some_other_column" VARCHAR(10)
);

-,但是在这种情况下,Oracle在执行上面的SELECT语句时会引发错误,因为其中的标识符转换为大写,而对象名称为小写。

UPD 2。

我不应该编辑第三方库的源代码-必须以某种方式配置我的环境和连接:Oracle,PHP,PDO。

解决方法

由于Your Common Sense的评论,我找到了解决方案。

初始化库时,我向它传递了一个PDO对象-通过以下代码,我将其配置为始终使用小写字母:

$options = [
    PDO::ATTR_CASE => PDO::CASE_LOWER,];
$connection = new PDO($dsn,$username,$password,$options);
init3rdPartyLibrary($connection);

因此,$result返回的$statement->fetch()变量的键现在是小写字母,因此该库按其作者的预期工作。

,

如果您要使用小写字母标识符,那么就像您在问题中所写的那样,您需要在Oracle中双引号:

CREATE TABLE "some_table"
(
    "some_column"       VARCHAR(10),"some_other_column" VARCHAR(10)
);

如果您使用了区分大小写的标识符,则每次使用它们时,始终都需要引用它们。因此,您在PHP中的SQL语句应为:

$statement = $pdo->prepare('SELECT * from "some_table" where "some_column" = :some_column');

一旦在其中引用了它们,则标识符将与数据库中的值匹配,并且返回的结果集也应具有小写的列标识符。

我该如何绕过?

摘自Oracle Database Object Names and Qualifiers文档:

数据库对象命名规则

每个数据库对象都有一个名称。在SQL语句中,您用带引号的标识符或未带引号的标识符表示对象的名称。

  • 带引号的标识符以双引号(“)开头和结尾。如果使用带引号的标识符命名架构对象,则在引用该对象时必须使用双引号。
  • 未加引号的标识符不包含任何标点符号。

您可以使用带引号或不带引号的标识符来命名任何数据库对象。

...

  1. 未加引号的标识符不区分大小写。 Oracle将它们解释为大写。带引号的标识符区分大小写。

这意味着您不能在Oracle中绕过此操作,因为这是Oracle旨在表现的方式。您可以使用引号(在所有使用位置的标识符)并且可以使用小写的标识符,或者Oracle将隐式将未使用引号的标识符转换为大写。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?