我目前正在为一个特定的客户端将一个基于Code Igniter的应用程序从MySQL移植到Oracle (11g)。MySQL和Oracle后端必须协同工作(即我们不能丢弃其中一个)。MySQL DB使用大约100个表,其中所有标识符都是小写的。当我使用Oracle的SQL Developer工具将这个数据库迁移到Oracle时,我最终得到了一个“正确”转换的数据库,但是...都是大写的标识符。
现在,对于正常使用,这并不是真正的问题,但是当使用CI活动记录类时,问题就出现了。它生成如下查询: SELECT "somecolumn“FROM "sometable”WHERE "someothercolumn“= somevalue
问题是,当这些标识符使用“引号”时,Oracle会强制以区分大小写的方式解释这些标识符,这在本例中造成了严重破坏。
修补CI和/或应用程序的核心代码以使所有查询都使用不区分大小写的标识符(即删除标识符两边的“引号”),或者将所有标识符动态转换为大写标识符,这是不可取的,因为未来潜在的框架升级会受到影响。将所有MySQL标识符重命名为大写也是一个非常不吸引人的方案,并且对应用程序本身有更大的影响--当然不是一个选项。
相反,我想要实现的是让迁移过程(即使用SQL Developer)只考虑源数据库的情况,并按照到目前为止所做的那样执行转换,除了标识符不会更改为其大写版本之外。
我在网上搜索了一笔公平的交易,以找到实现这一目标的方法,到目前为止,它还没有起到作用。
有没有人知道这是否可以做到,如果可以:如何做到?转换为全大写标识符是否可能是一个全局DB设置?我会认为这是一件微不足道的事情,但到目前为止我还没有弄清楚,我确实遇到了一些相关的参考资料,听起来并不是很有希望……
发布于 2013-11-18 23:18:31
如果可以获得数据库迁移创建的模式脚本,则只需将标识符(表名、视图名、列名等)改为用双引号括起来即可。(我不确定SQL Developer迁移实际上是否有保留大小写的选项)。
如果没有引号,Oracle将假定所有标识符都不区分大小写。但是,这在内部存储为数据字典中的大写字符串。使用引号将强制Oracle对架构对象使用完全相同的大小写。
例如:
create table Customers
(
Name varchar2(100),
CreationDate date not null
);将在数据字典中创建内部客户,您可以编写如下查询:
select name, creationdate from customers;或者:
create table "Customers"
(
"Name" varchar2(100),
"CreationDate" date not null
);将在内部创建“客户”。您只能使用引号和大小写来编写查询:
select "Name", "CreationDate" from "Customers";发布于 2014-04-29 22:33:34
我之前已经实现了这一点,并简单地编辑了oci8_driver.php (../system/database/oci),如下所示:
// The character used for excaping
var $_escape_char = '"';至
// The character used for excaping
var $_escape_char = '';斯图尔特
https://stackoverflow.com/questions/20050949
复制相似问题