关于使用Orcale数据库的一点心得

写在前面

在这次的任务中,不仅用到的多数据源,还用到了Orcale数据库,第一次用Oracle数据库,总体的感觉就是比mysql麻烦些,然后就是全靠百度。。

遇到的问题

  • Java 连接 Orcale数据库的配置文件
dbyc.driver=oracle.jdbc.driver.OracleDriver     //加载orcale驱动    
dbyc.url=jdbc:oracle:thin:@192.168.3.220:1521:orcl  //orcale数据库url
dbyc.username=sys as sysdba
dbyc.password=123456
<dependency>  
    <groupId>com.oracle</groupId>  
    <artifactId>ojdbc14</artifactId>  
    <version>10.2.0.1.0</version>  
</dependency> 
  • Group by

SELECT
    d.pointvalue currentGasVolum,
    d.pointtime recvTime,
    d.meterCode
FROM
    (
        SELECT
            z.pointvalue,
            z.pointtime,
            w.id,
            CONCAT(w.gjbh,w.bh) meterCode
        FROM
            zdscadadata z
        LEFT JOIN
            b_watchvariableinfo w ON z.pointname = w.variable
        WHERE
            CONCAT(w.gjbh,w.bh) in
            <foreach collection="meterCodeList" open="(" close=")" separator="," item="item">
                #{item.meterCode}
            </foreach>
        ORDER BY
            z.pointtime DESC
    )   d
GROUP BY
    d.id

这句sql大概的意思就是根据pointtime 字段排序,然后使用group by 取出最大值,在mysql环境下是完全可以正常使用的,但是在orcale环境下就报错了,错误是:ORA-00979 不是 GROUP BY 表达式,但是orcale又的确有group by 这个方法,经过查阅资料,结果发现,orcale中的group by 后面的字段必须包括所有你select出来的,代码如下:


SELECT
    d.pointvalue currentGasVolum,
    d.pointtime recvTime,
    d.meterCode,
    d.id
FROM
    (
        SELECT
            z.pointvalue,
            z.pointtime,
            w.id,
            CONCAT(w.gjbh,w.bh) meterCode
        FROM
            zdscadadata z
        LEFT JOIN
            b_watchvariableinfo w ON z.pointname = w.variable
        WHERE
            CONCAT(w.gjbh,w.bh) in
            <foreach collection="meterCodeList" open="(" close=")" separator="," item="item">
                #{item.meterCode}
            </foreach>
        ORDER BY
            z.pointtime DESC
    )   d
GROUP BY
    d.id,d.pointvalue,d.pointtime,d.meterCode  <!-- 加上所有的字段 -->

不理解为什么要加上无关的字段,但是它就是这么规定的,组长的意思是使用group by 相当于没有任何意义了,因此让我换一种写法,使用max()函数试一下,于是代码变成了这样:

  • MAX()函数
SELECT
    MAX(z.pointtime) recvTime,
    z.pointvalue currentGasVolum,
    CONCAT(w.gjbh,w.bh) meterCode
FROM
    zdscadadata z
LEFT JOIN
    b_watchvariableinfo w ON z.pointname = w.variable
WHERE
    CONCAT(w.gjbh,w.bh) = #{meterCode}  AND w.variable = 'VGR';

执行后,发现也报错了:ORA-00937: not a single-group group function,没有深究这是什么错,尝试了一下只查询MAX(z.pointtime) recvTime,删除z.pointvalue currentGasVolum和CONCAT(w.gjbh,w.bh) meterCode,发现是可以的,也就是说,orcale的max()函数只支持查询一个字段?于是,我们又换了一种方法,继续使用order by ,然后取第一条数据,代码是这样的:

  • Rownum
SELECT 
    * 
FROM
    (
        SELECT
            z.pointvalue currentGasVolum,
            z.pointtime recvTime,
            CONCAT(w.gjbh,w.bh) meterCode
        FROM
            zdscadadata z
        LEFT JOIN
            b_watchvariableinfo w ON z.pointname = w.variable
        WHERE
            CONCAT(w.gjbh,w.bh) = #{meterCode}  AND w.variable = 'VGR'
        ORDER BY
            z.POINTTIME DESC
    ) d
WHERE
    ROWNUM = 1
  • Orcale获取当前日期:

select to_char(sysdate,’YYYY-mm-dd hh24:mi:ss’) from dual;

  • Orcale获取前一天的日期:

select to_char(sysdate-1,’YYYY-mm-dd hh24:mi:ss’) from dual;

  • Orcale查询在昨天跟今天之间的数据:

SELECT * FROM SCADADTA WHERE POINTTIME BETWEEN sysdate-1 AND sysdate ;

终于,成功了。经过这次任务,也算是对Orcale有了一个小小的了解,记载下来以防自己忘记,毕竟好记性比如烂笔头=。=

参考资料

在Qt框架中连接和使用Oracle数据库,需要进行一系列的配置和设置,以确保Qt应用程序能够正确识别并使用Oracle数据库驱动。以下是详细的配置方法和使用指南: ### 配置Oracle数据库驱动 1. **安装Oracle Instant Client** 在连接Oracle数据库之前,必须安装Oracle Instant Client Basic Package。这个包提供了连接Oracle数据库所需的库文件(如`oci.dll`或`libclntsh.so`)。下载并解压后,需要将这些库文件的路径添加到系统的`PATH`环境变量中,以便Qt能够找到它们[^1]。 2. **配置tnsnames.ora文件** Oracle数据库连接通常依赖于`tnsnames.ora`文件,该文件定义了数据库的连接字符串。需要将该文件放置在Oracle Instant Client的目录下,或者通过环境变量`TNS_ADMIN`指定其路径。确保该文件中包含正确的数据库连接描述,例如: ``` ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = your_host)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = your_service_name) ) ) ``` 3. **编译或安装Qt的Oracle驱动** Qt本身并不自带Oracle数据库驱动,因此需要手动编译或安装。如果使用的是预编译的Qt版本,可能需要从源代码编译Qt的Oracle驱动。可以使用`qmake`工具来编译`qoci`插件,具体命令如下: ```bash cd $QT_DIR/src/plugins/sqldrivers/oracle qmake make ``` 编译完成后,生成的驱动文件(如`libqoci.so`或`qoci.dll`)应放置在Qt的`sqldrivers`插件目录下,例如`$QT_DIR/plugins/sqldrivers/`。 4. **验证驱动是否加载成功** 在Qt程序中,可以通过以下代码验证Oracle驱动是否可用: ```cpp #include <QSqlDatabase> #include <QDebug> int main() { QStringList drivers = QSqlDatabase::drivers(); qDebug() << "Available drivers:" << drivers; return 0; } ``` 如果输出中包含`QOCI`,则表示Oracle驱动已成功加载。 ### 连接Oracle数据库 1. **创建数据库连接对象** 使用`QSqlDatabase::addDatabase()`函数创建一个Oracle数据库连接对象。通常使用`QOCI`作为参数,表示使用Oracle驱动。示例代码如下: ```cpp #include <QSqlDatabase> #include <QSqlQuery> #include <QDebug> int main() { QSqlDatabase db = QSqlDatabase::addDatabase("QOCI"); db.setConnectOptions(); // 可选参数设置 db.setHostName("ORCL"); // tnsnames.ora中的服务名 db.setDatabaseName("your_database_name"); db.setUserName("your_username"); db.setPassword("your_password"); if (!db.open()) { qDebug() << "Error: Unable to open database"; return 1; } // 执行SQL查询 QSqlQuery query; if (query.exec("SELECT * FROM your_table")) { while (query.next()) { qDebug() << query.value(0).toString(); } } else { qDebug() << "Query error:" << query.lastError().text(); } db.close(); return 0; } ``` 2. **处理连接错误** 在调用`db.open()`时,如果返回`false`,表示连接失败。可以通过`query.lastError().text()`获取具体的错误信息,并进行相应的调试。 3. **执行SQL查询和结果处理** 使用`QSqlQuery`类可以执行SQL语句,并通过`next()`方法遍历查询结果。对于更新操作(如`INSERT`、`UPDATE`、`DELETE`),可以直接调用`exec()`方法,并检查返回值以确认操作是否成功。 ### 性能优化与安全最佳实践 1. **使用事务处理** 对于需要多次修改数据库的操作,建议使用事务处理来提高性能和数据一致性。可以通过`db.transaction()`开始事务,`db.commit()`提交事务,`db.rollback()`回滚事务。 2. **预编译语句** 为了防止SQL注入攻击并提高性能,建议使用预编译语句。例如: ```cpp QSqlQuery query; query.prepare("INSERT INTO users (name, age) VALUES (?, ?)"); query.addBindValue("Alice"); query.addBindValue(30); query.exec(); ``` 3. **连接池管理** 如果应用程序需要频繁连接数据库,建议使用连接池技术。可以通过`QSqlDatabase::cloneDatabase()`创建多个连接实例,避免重复打开和关闭连接带来的开销。 ### Qt Designer集成 1. **将Oracle数据库数据绑定到GUI** 在Qt Designer中,可以使用`QSqlTableModel`或`QSqlRelationalTableModel`将数据库表与`QTableView`等控件绑定。例如: ```cpp QSqlTableModel *model = new QSqlTableModel(nullptr, db); model->setTable("your_table"); model->select(); QTableView *view = new QTableView; view->setModel(model); view->show(); ``` 2. **使用UI设计器** 在Qt Designer中,可以通过拖放方式添加`QTableView`控件,并通过代码将其与模型绑定,从而实现数据库数据的可视化展示。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值