Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
Oracle Q:使用OCN检测表上的插入/更新/删除并传递;真实身份证;要在回调上发送UTL_HTTP.REQUEST吗?_Oracle - Fatal编程技术网

Oracle Q:使用OCN检测表上的插入/更新/删除并传递;真实身份证;要在回调上发送UTL_HTTP.REQUEST吗?

Oracle Q:使用OCN检测表上的插入/更新/删除并传递;真实身份证;要在回调上发送UTL_HTTP.REQUEST吗?,oracle,Oracle,我正在尝试检测表上的插入、更新或删除。我知道我不能使用QRCN,所以我尝试使用OCN。我想要达到的是。。。当检测到插入/更新时,调用“callback\u iu”,当检测到删除时,调用“callback\u d” DECLARE qosflags NUMBER; reginfo_iu cq_notification$_reg_info; reginfo_d cq_notification$_reg_info; regid_iu NUMBER;

我正在尝试检测表上的插入、更新或删除。我知道我不能使用QRCN,所以我尝试使用OCN。我想要达到的是。。。当检测到插入/更新时,调用“callback\u iu”,当检测到删除时,调用“callback\u d”

DECLARE

  qosflags      NUMBER;
  reginfo_iu    cq_notification$_reg_info;
  reginfo_d     cq_notification$_reg_info;
  regid_iu      NUMBER;
  regid_d       NUMBER;
  v_cursor      SYS_REFCURSOR;  
  opfilter_iu   NUMBER;
  opfilter_d    NUMBER;

BEGIN
   qosflags := DBMS_CQ_NOTIFICATION.QOS_ROWIDS;
   opfilter_iu := DBMS_CQ_NOTIFICATION.INSERTOP + DBMS_CQ_NOTIFICATION.UPDATEOP;
   opfilter_d := DBMS_CQ_NOTIFICATION.DELETEOP;


   reginfo_iu := cq_notification$_reg_info('callback_iu', qosflags,0, opfilter_iu, 0);
   regid_iu := DBMS_CQ_NOTIFICATION.NEW_REG_START(reginfo_iu);

        OPEN v_cursor FOR 
           SELECT DBMS_CQ_NOTIFICATION.QOS_ROWIDS, department_id, department_name, manager_id, location_id
           FROM HR.departments
        CLOSE v_cursor;

   DBMS_CQ_NOTIFICATION.REG_END;

   reginfo_d := cq_notification$_reg_info('callback_d', qosflags,0, opfilter_d, 0);
   regid_d := DBMS_CQ_NOTIFICATION.NEW_REG_START(reginfo_d);

        OPEN v_cursor FOR 
           SELECT DBMS_CQ_NOTIFICATION.QOS_ROWIDS, department_id, department_name, manager_id, location_id
           FROM HR.departments
        CLOSE v_cursor;

   DBMS_CQ_NOTIFICATION.REG_END;

END;
我知道我可以像这样使用QRCN获取ROWID和“real\u id”

CREATE OR REPLACE PROCEDURE chnf_callback
  (ntfnds IN CQ_NOTIFICATION$_DESCRIPTOR)
IS

  event_type      NUMBER;
  tbname          VARCHAR2(60);
  numtables       NUMBER;
  operation_type  NUMBER;
  numrows         NUMBER;
  row_id          VARCHAR2(2000);
  numqueries      NUMBER;
  qid             NUMBER;
  real_id         NUMBER;

BEGIN

  event_type := ntfnds.event_type;

  numqueries :=0;
  IF (event_type = DBMS_CQ_NOTIFICATION.EVENT_QUERYCHANGE) THEN
      numqueries := ntfnds.query_desc_array.count;
      FOR i in 1..numqueries LOOP

         qid := ntfnds.QUERY_DESC_ARRAY(i).queryid;
         numtables := 0;
         numtables := ntfnds.QUERY_DESC_ARRAY(i).table_desc_array.count;
         FOR j IN 1..numtables LOOP
           tbname := ntfnds.QUERY_DESC_ARRAY(i).table_desc_array(j).table_name;
           operation_type := ntfnds.QUERY_DESC_ARRAY(i).table_desc_array(j).Opflags;

           IF (bitand(operation_type, DBMS_CQ_NOTIFICATION.ALL_ROWS) = 0)
           THEN
             numrows := ntfnds.query_desc_array(i).table_desc_array(j).numrows;
           ELSE
             numrows :=0;   /* ROWID INFO NOT AVAILABLE */
           END IF;

            /* The body of the loop is not executed when numrows is ZERO */
            FOR k IN 1..numrows LOOP
               Row_id := ntfnds.query_desc_array(i).table_desc_array(j).row_desc_array(k).row_id;

               select department_id into real_id from hr.departments where rowid = Row_id;
               -->INSERT IN NFROWCHANGES<--
               INSERT INTO nfrowchanges VALUES(qid, tbname, Row_id, real_id);

            END LOOP;  /* loop over rows */
         END LOOP;     /* loop over tables */
       END LOOP;        /* loop over queries */
  END IF;
  COMMIT;
END;

我仍然不知道如何使用OCN,在这个解决方案中,我使用的是QRCN。由于删除一行时我无法获取行id,因此我没有删除该行,而是创建了一个名为“Active”的新列,因此当我要“删除”一行时,我将“Active”从“Yes”更改为“No”

下面是使用UTL_HTTP从插入/更新/删除行发送“real_id”的解决方案

匿名块:

DECLARE

   l_reginfo CQ_NOTIFICATION$_REG_INFO;
   l_cursor  SYS_REFCURSOR;
   l_regid   NUMBER;
   qosflags  NUMBER;

BEGIN

    qosflags := DBMS_CQ_NOTIFICATION.QOS_QUERY + DBMS_CQ_NOTIFICATION.QOS_ROWIDS;
    l_reginfo := cq_notification$_reg_info ('query_callback', qosflags, 0, 0, 0);

    l_regid := dbms_cq_notification.new_reg_start(l_reginfo);

    OPEN l_cursor FOR
        SELECT
            id,
            city_name,
            country_name,
            votes,
            active
        FROM hr.jsao_super_cities
        WHERE active = 'YES';
    CLOSE l_cursor;

    dbms_cq_notification.reg_end;

END;
/
回拨:

CREATE OR REPLACE PROCEDURE query_callback
  (ntfnds IN CQ_NOTIFICATION$_DESCRIPTOR)
IS

  event_type      NUMBER;
  numtables       NUMBER;
  operation_type  NUMBER;
  numrows         NUMBER;
  row_id          VARCHAR2(2000);
  is_active       VARCHAR2(20);
  numqueries      NUMBER;
  real_id         NUMBER;
  l_req  UTL_HTTP.REQ;
  l_resp UTL_HTTP.RESP;

BEGIN 

  event_type := ntfnds.event_type;

  numqueries :=0;
  IF (event_type = DBMS_CQ_NOTIFICATION.EVENT_QUERYCHANGE) THEN
      numqueries := ntfnds.query_desc_array.count;
      FOR i in 1..numqueries LOOP

         numtables := 0;
         numtables := ntfnds.QUERY_DESC_ARRAY(i).table_desc_array.count;
         FOR j IN 1..numtables LOOP

           operation_type := ntfnds.QUERY_DESC_ARRAY(i).table_desc_array(j).Opflags;

           IF (bitand(operation_type, DBMS_CQ_NOTIFICATION.ALL_ROWS) = 0)
           THEN
             numrows := ntfnds.query_desc_array(i).table_desc_array(j).numrows;
           ELSE
             numrows :=0;
           END IF;


            FOR k IN 1..numrows LOOP

               Row_id := ntfnds.query_desc_array(i).table_desc_array(j).row_desc_array(k).row_id;

               --getting "real_id"
               select id into real_id from hr.jsao_super_cities where rowid = Row_id;

                -- 2 = insert
                IF(operation_type = 2) THEN
                    l_req := utl_http.begin_request(
                        url    => 'localhost:3000/city/'||real_id,
                        method => 'GET'
                    );

                    l_resp := utl_http.get_response(r => l_req);

                    utl_http.end_response(r => l_resp);

                -- 4 = update
                ELSIF (operation_type = 4) THEN

                    select active into is_active from hr.jsao_super_cities where id = real_id;

                    IF (is_active = 'YES') THEN

                        l_req := utl_http.begin_request(
                            url    => 'localhost:3000/city/'||real_id,
                            method => 'GET'
                        );

                        l_resp := utl_http.get_response(r => l_req);

                        utl_http.end_response(r => l_resp);

                    ELSIF (is_active = 'NO') THEN

                        l_req := utl_http.begin_request(
                            url    => 'localhost:3000/delete/'||real_id,
                            method => 'GET'
                        );

                        l_resp := utl_http.get_response(r => l_req);

                        utl_http.end_response(r => l_resp);

                    END IF;
                END IF;
            END LOOP;  /* loop over rows */
         END LOOP;     /* loop over tables */
       END LOOP;        /* loop over queries */
  END IF;



END query_callback;
/

我希望这能帮助其他人。

非常有帮助!我还试图了解如何在回调中获得实时性
CREATE OR REPLACE PROCEDURE query_callback
  (ntfnds IN CQ_NOTIFICATION$_DESCRIPTOR)
IS

  event_type      NUMBER;
  numtables       NUMBER;
  operation_type  NUMBER;
  numrows         NUMBER;
  row_id          VARCHAR2(2000);
  is_active       VARCHAR2(20);
  numqueries      NUMBER;
  real_id         NUMBER;
  l_req  UTL_HTTP.REQ;
  l_resp UTL_HTTP.RESP;

BEGIN 

  event_type := ntfnds.event_type;

  numqueries :=0;
  IF (event_type = DBMS_CQ_NOTIFICATION.EVENT_QUERYCHANGE) THEN
      numqueries := ntfnds.query_desc_array.count;
      FOR i in 1..numqueries LOOP

         numtables := 0;
         numtables := ntfnds.QUERY_DESC_ARRAY(i).table_desc_array.count;
         FOR j IN 1..numtables LOOP

           operation_type := ntfnds.QUERY_DESC_ARRAY(i).table_desc_array(j).Opflags;

           IF (bitand(operation_type, DBMS_CQ_NOTIFICATION.ALL_ROWS) = 0)
           THEN
             numrows := ntfnds.query_desc_array(i).table_desc_array(j).numrows;
           ELSE
             numrows :=0;
           END IF;


            FOR k IN 1..numrows LOOP

               Row_id := ntfnds.query_desc_array(i).table_desc_array(j).row_desc_array(k).row_id;

               --getting "real_id"
               select id into real_id from hr.jsao_super_cities where rowid = Row_id;

                -- 2 = insert
                IF(operation_type = 2) THEN
                    l_req := utl_http.begin_request(
                        url    => 'localhost:3000/city/'||real_id,
                        method => 'GET'
                    );

                    l_resp := utl_http.get_response(r => l_req);

                    utl_http.end_response(r => l_resp);

                -- 4 = update
                ELSIF (operation_type = 4) THEN

                    select active into is_active from hr.jsao_super_cities where id = real_id;

                    IF (is_active = 'YES') THEN

                        l_req := utl_http.begin_request(
                            url    => 'localhost:3000/city/'||real_id,
                            method => 'GET'
                        );

                        l_resp := utl_http.get_response(r => l_req);

                        utl_http.end_response(r => l_resp);

                    ELSIF (is_active = 'NO') THEN

                        l_req := utl_http.begin_request(
                            url    => 'localhost:3000/delete/'||real_id,
                            method => 'GET'
                        );

                        l_resp := utl_http.get_response(r => l_req);

                        utl_http.end_response(r => l_resp);

                    END IF;
                END IF;
            END LOOP;  /* loop over rows */
         END LOOP;     /* loop over tables */
       END LOOP;        /* loop over queries */
  END IF;



END query_callback;
/