ORA-02070:数据库[MySQL]在这种情况下不支持子查询。-甲骨文

我有以下表格:

MySQL表:member_interact

CREATE TABLE `member_interact` (
  `INT_MEMBER_ID` int(11) NOT NULL,
  `INT_ID` int(11) NOT NULL AUTO_INCREMENT,
  `INT_SOURCE` varchar(1) NOT NULL,
  `INT_DATE` datetime DEFAULT NULL,
  `INT_TYPE` varchar(30) NOT NULL,
  `COPY_TO_STG` varchar(12) NOT NULL DEFAULT 'NO',
  `NEW_STG_SEQ` int(11) DEFAULT NULL,
  `COPY_TO_STG_DATE` datetime DEFAULT NULL,
  PRIMARY KEY (`INT_ID`),
  UNIQUE KEY `INT_ID_UNIQUE` (`INT_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=31246 DEFAULT CHARSET=utf8$$

Oracle表:MEMBER_INTERACT_MYSQL_STG

  CREATE TABLE "JTI_HTP"."MEMBER_INTERACT_MYSQL_STG" 
   (    "INT_MEMBER_ID" NUMBER(10,0) NOT NULL ENABLE, 
    "INT_ID" NUMBER(10,0), 
    "INT_SOURCE" NVARCHAR2(1) NOT NULL ENABLE, 
    "INT_DATE" DATE, 
    "INT_TYPE" NVARCHAR2(30) NOT NULL ENABLE, 
    "INSERTING_DATE" DATE, 
    "MYSQL_ID" NUMBER(12,0)
   ) SEGMENT CREATION DEFERRED 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  TABLESPACE "USERS" ;

基本上,我需要通过添加新列member_interact复制member_interact_mysql_stg,如下所示:

  1. MEMBER_INTERACT_MYSQL_STG.STG_INT_ID = NEW_SEQ
  2. MEMBER_INTERACT_MYSQL_STG.MYSQL_INT_ID = MEMBER_INTERACT.INT_ID
  3. 复制操作完成后,MEMBER_INTERACT.COPY_TO_STG ='YES'。
  4. MEMBER_INTERACT.NEW_STG_SEQ = MEMBER_INTERACT_MYSQL_STG.STG_INT_ID

我创建了以下过程:

create or replace PROCEDURE COPY_MYSQL_MOB_INT_TO_STG(
    P_BATCH_NO IN NUMBER)
IS
  CURSOR src
  IS
    SELECT *
    FROM "jtipartn_mydb"."MEMBER_INTERACT"@"JTIPARTNER_HTP"
    WHERE "NEW_STG_SEQ" IS NULL
    AND "INT_ID" <= 7000;

    STG_INT_ID NUMBER;
BEGIN
  FOR des IN src
  LOOP
    STG_INT_ID := STG_SEQ.NEXTVAL;
    INSERT
    INTO MEMBER_INTERACT_MYSQL_STG VALUES
      (
        DES.INT_MEMBER_ID,
        STG_INT_ID,
        des.int_source,
        des.int_date,
        des.int_type,
        NULL,
        DES.INT_ID
      );
      UPDATE_COPIED_MEMBER_INTERACT(STG_INT_ID, DES.INT_ID);
           COMMIT;
  END LOOP;

END;

create or replace PROCEDURE UPDATE_COPIED_MEMBER_INTERACT( STG_INT_ID IN NUMBER, MYSQL_INT_ID IN NUMBER)
IS
BEGIN
    UPDATE "jtipartn_mydb"."MEMBER_INTERACT"@"JTIPARTNER_HTP"
    SET "COPY_TO_STG"     = 'YES',
        "NEW_STG_SEQ"       = STG_INT_ID
    WHERE "INT_ID" = MYSQL_INT_ID;
END;

实际上,有一个过程可以更新两个表,但是由于我收到的错误,我发现将过程分为两部分可能会更容易消除错误。我得到的错误是:

ORA-02047:无法加入正在进行的分布式事务ORA-06512:在第19行的“ JTI_HTP.UPDATE_COPIED_MEMBER_INTERACT”上ORA-06512:在第28行的“ JTI_HTP.COPY_MYSQL_MOB_INT_TO_STG”上ORA-06512:在第6行

第19行是调用第二个过程的地方。我怀疑这与MySQL表更新有关。

更新

我已经根据@Maheswaran Ravisankar的答案更新了我的脚本,如下所示:

CREATE OR REPLACE PROCEDURE COPY_MYSQL_MOB_INT_TO_STG_V3(
    P_BATCH_NO IN NUMBER)
IS
BEGIN
    INSERT INTO MEMBER_INTERACT_MYSQL_STG
    SELECT "INT_MEMBER_ID",
      STG_SEQ.NEXTVAL,
      "INT_SOURCE",
      "INT_DATE",
      "INT_TYPE",
      CURRENT_DATE,
      "INT_ID"
    FROM "jtipartn_mydb"."MEMBER_INTERACT"@"JTIPARTNER_HTP" des
    WHERE "NEW_STG_SEQ" IS NULL; 

    UPDATE "jtipartn_mydb"."MEMBER_INTERACT"@"JTIPARTNER_HTP" A
    SET "COPY_TO_STG" = 'YES',
      "NEW_STG_SEQ"   =
      (SELECT STG_INT_ID 
      FROM MEMBER_INTERACT_MYSQL_STG B 
       WHERE A."INT_ID" = B.STG_INT_ID
      );
END;

但是,我收到错误ORA-02070:在这种情况下,数据库JTIPARTNER_HTP不支持子查询

Maheswaran Ravisankar
    INSERT
    INTO MEMBER_INTERACT_MYSQL_STG
      SELECt
        DES.INT_MEMBER_ID,
        STG_SEQ.NEXTVAL,
        des.int_source,
        des.int_date,
        des.int_type,
        NULL,
        DES.INT_ID
     FROM "jtipartn_mydb"."MEMBER_INTERACT"@"JTIPARTNER_HTP" des
     WHERE "NEW_STG_SEQ" IS NULL
  /*  RETURNING STG_INT_ID BULK COLLECT INTO SOME RECORD; --Needed if only processed in array!*/

然后像下面这样更新

UPDATE "jtipartn_mydb"."MEMBER_INTERACT"@"JTIPARTNER_HTP" A
SET "COPY_TO_STG"     = 'YES',
    "NEW_STG_SEQ"     = (SELECT STG_INT_ID FROM MEMBER_INTERACT_MYSQL_STG B
                         WHERE A.INT_ID = B.INT_ID);

(或者)

FOR REC IN (SELECT  STG_INT_ID,INT_ID FROM MEMBER_INTERACT_MYSQL_STG)
LOOP
    UPDATE "jtipartn_mydb"."MEMBER_INTERACT"@"JTIPARTNER_HTP" A
    SET "COPY_TO_STG"     = 'YES',
        "NEW_STG_SEQ"     = REC.STG_INT_ID
    WHERE A.INT_ID = REC.INT_ID;
END LOOP;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ORA-02070:数据库[MySQL]在这种情况下不支持子查询。-甲骨文

来自分类Dev

甲骨文查询

来自分类Dev

CONTAINS(甲骨文)vs.MATCH(MySql)

来自分类Dev

CONTAINS(甲骨文)vs.MATCH(MySql)

来自分类Dev

甲骨文上的JPA @Query select抛出ORA-01722:字符串上的数字无效

来自分类Dev

导致ORA-00913的ROW_NUM函数:值太多错误?甲骨文

来自分类Dev

第 10 行:错误:ORA-00907 缺少右括号 | 甲骨文 11g

来自分类Dev

甲骨文APEX - 修改与数据库列项的会话状态

来自分类Dev

ORA-01843:不是有效的月份-但是什么月份格式?甲骨文11g

来自分类Dev

甲骨文,从右子字符串然后填充左,奇怪的行为

来自分类Dev

甲骨文添加一列?会影响数据吗?

来自分类Dev

如何选择最后一个数据?甲骨文

来自分类Dev

甲骨文sql。比较两个表以查找缺失数据

来自分类Dev

甲骨文

来自分类Dev

甲骨文每月

来自分类Dev

甲骨文的时差

来自分类Dev

甲骨文:Listagg

来自分类Dev

是否有任何功能喜欢'Lpad | Rpad”,但支持正则表达式吗?在甲骨文

来自分类Dev

oracle sql语句以获取数据透视,分组依据或窗口化?甲骨文11g

来自分类Dev

甲骨文使用等级

来自分类Dev

甲骨文-CHAR(39)

来自分类Dev

甲骨文不喜欢

来自分类Dev

甲骨文不喜欢

来自分类Dev

依靠甲骨文的案例

来自分类Dev

甲骨文半场比赛

来自分类Dev

检索工资表中的所有数据并使用存储过程计算总工资(Basic+HRA+DA+CA+Medical)?在甲骨文

来自分类Dev

甲骨文每月停机数分钟

来自分类Dev

甲骨文CTXCAT索引和异议

来自分类Dev

甲骨文移动平均线