簡體   English   中英

Oracle Continuos 查詢通知 ORA-29979

[英]Oracle Continuos query notification ORA-29979

我正在嘗試使用 Oracle JDBC 從 Oracle 表 (19c) 注冊更改通知。 由於查詢包含一個 JOIN 我正在使用 BEST 努力模式。 我的用戶已被“授予”更改通知權限。

在這一點上,我只是想讓通知者接受任何查詢。 這不是最終版本,但我知道我們需要一個涉及兩個表的查詢。 將查詢更改為更簡單的查詢,如SELECT * from SCDAT.SECURITIES WHERE SCDAT.SECURITIES.INSTYPE = 28給出相同的 output。

測試代碼

log.info("init changelistener");

    log.info("Get datasource from Spring application context");
    oracleDataSource = context.getBean("dataSource", OracleDataSource.class);

    log.info("Cet Oracle connection from datasource");
    oracle.jdbc.OracleConnection connection = (OracleConnection) oracleDataSource.getConnection();

    Properties properties = new Properties();
    properties.setProperty(OracleConnection.DCN_NOTIFY_ROWIDS, "true");
    properties.setProperty(OracleConnection.DCN_QUERY_CHANGE_NOTIFICATION, "true");
    properties.setProperty(OracleConnection.DCN_BEST_EFFORT, "true");
    log.info("DCN property settings: {}", properties);

    log.info("Register change notification to connection");
    dcr = connection.registerDatabaseChangeNotification(properties);

    //create statement
    Statement stmt = connection.createStatement();

    // associate the statement with the registration:
    ((OracleStatement) stmt).setDatabaseChangeRegistration(dcr);

    log.info("Executing query {}", query);
    ResultSet rs = stmt.executeQuery(query);

    while (rs.next()) {
        // Do Nothing
    }

    log.info("attach listener to the processor");
    dcr.addListener(this);

    String[] tableNames = dcr.getTables();
    for (int i = 0; i < tableNames.length; i++)
        log.info(tableNames[i] + " is part of the registration.");

日志 output

2021-03-30 12:56:15.983  INFO 5180 --- [main] c.c.dbnotifier.OracleChangeListener      : init changelistener
2021-03-30 12:56:15.983  INFO 5180 --- [main] c.c.dbnotifier.OracleChangeListener      : Get datasource from Spring application context
2021-03-30 12:56:15.983  INFO 5180 --- [main] c.c.dbnotifier.OracleChangeListener      : Cet Oracle connection from datasource
2021-03-30 12:56:16.061  INFO 5180 --- [main] c.c.dbnotifier.OracleChangeListener      : DCN property settings: {DCN_QUERY_CHANGE_NOTIFICATION=true, DCN_BEST_EFFORT=true, DCN_NOTIFY_ROWIDS=true}
2021-03-30 12:56:16.061  INFO 5180 --- [main] c.c.dbnotifier.OracleChangeListener      : Register change notification to connection
2021-03-30 12:56:16.077  INFO 5180 --- [main] c.c.dbnotifier.OracleChangeListener      : Executing query SELECT SCDAT.TRANSMAIN.TRANSEX from SCDAT.TRANSMAIN,SCDAT.SECURITIES WHERE SCDAT.TRANSMAIN.SECIK = SCDAT.SECURITIES.SECIK AND SCDAT.SECURITIES.INSTYPE = 28
2021-03-30 12:56:16.295  WARN 5180 --- [main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'oracleChangeListener': Invocation of init method failed; nested exception is java.sql.SQLException: ORA-29979: ikke støttet radstørrelse for endringsvarsling for spørringsresultat

這里解釋了錯誤 ORA-29979 https://www.oraexcel.com/database-oracle-11gR2-ORA-29979但根據 dbadmin,數據庫上的 COMPATIBLE 設置為 19.0.0。

我應該補充一點,使用同一用戶在 sqldeveloper 中運行查詢可以正常工作。

關於如何進行的任何建議或想法?

/卡特琳娜

您將不得不切換到“表更改通知”,因為您的表有太多列以支持“查詢更改通知”。 刪除此行或將其注釋掉:

// properties.setProperty(OracleConnection.DCN_QUERY_CHANGE_NOTIFICATION, "true");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM