将 Oracle 触发器转换为 MySql 触发器

Posted

技术标签:

【中文标题】将 Oracle 触发器转换为 MySql 触发器【英文标题】:Converting Oracle trigger to MySql Trigger 【发布时间】:2017-05-15 19:25:06 【问题描述】:

我需要将下面的触发器从 oracle 语法转换为 mysql 语法...

下面的例子我得到了错误

错误代码:1327。未声明的变量:新

DELIMITER $$

CREATE TRIGGER PRE_INS_LN_CLIENTS
BEFORE INSERT
ON LN_CLIENTS
FOR EACH ROW
BEGIN

  SELECT LN_CLIENTS_REC_ID_SEQ.NEXTVAL INTO new.REC_ID FROM DUAL
  new.SYNC_FLAG := 'I';

END $$

DELIMITER ;

【问题讨论】:

【参考方案1】:

MySQL 不使用冒号,还有一些其他的小变化。我认为这会奏效:

DELIMITER $$

CREATE OR REPLACE TRIGGER PRE_DEL_LN_CLIENTS
BEFORE DELETE ON LN_CLIENTS
FOR EACH ROW
BEGIN
  INSERT INTO LN_CLIENTS_DELETED (REC_ID, LOAN_NUMBER, CLIENT_SEQ_NUM, FIRST_NAME, FATHER_NAME, FAMILY_NAME, MOTHER_NAME, NATIONALITY, SEX, BIRTH_PLACE_CODE, BIRTH_PLACE_TEXT, BIRTH_DATE, REG_PLACE_CODE, REG_PLACE_TEXT, REG_NUM, ADDRESS_CODE, ADDRESS_TEXT, PHONE, EDUCATION_LEVEL_CODE, PROFESSION_CODE, PROFESSION_TEXT, MONTHLY_INCOME, WORK_PLACE, WORK_ADDRESS_TEXT, ID_DOC_TYPE, ID_DOC_NUM1, ID_DOC_NUM2, ID_DOC_DATE, NOTES, OFFICE, CREATED_BY, CREATED_ON, UPDATED_BY, UPDATED_ON, SYNC_FLAG)
      VALUES(OLD.REC_ID, OLD.LOAN_NUMBER, OLD.CLIENT_SEQ_NUM, OLD.FIRST_NAME, OLD.FATHER_NAME, OLD.FAMILY_NAME, OLD.MOTHER_NAME, OLD.NATIONALITY, OLD.SEX, OLD.BIRTH_PLACE_CODE, OLD.BIRTH_PLACE_TEXT, OLD.BIRTH_DATE, OLD.REG_PLACE_CODE, OLD.REG_PLACE_TEXT, OLD.REG_NUM, OLD.ADDRESS_CODE, OLD.ADDRESS_TEXT, OLD.PHONE, OLD.EDUCATION_LEVEL_CODE, OLD.PROFESSION_CODE, OLD.PROFESSION_TEXT, OLD.MONTHLY_INCOME, OLD.WORK_PLACE, OLD.WORK_ADDRESS_TEXT, OLD.ID_DOC_TYPE, OLD.ID_DOC_NUM1, OLD.ID_DOC_NUM2, OLD.ID_DOC_DATE, OLD.NOTES, OLD.OFFICE, OLD.CREATED_BY, OLD.CREATED_ON, OLD.UPDATED_BY, OLD.UPDATED_ON, 'I');
END$$

DELIMITER ;

【讨论】:

嘿,我解决了我只是不知道如何替换 NEXTVAL 以匹配 mysql 语法的所有问题? 错误代码:1327。未声明的变量:新 @sam 。 . .也许我误读了一些东西,但这个答案中没有newnextval 可以使用自动递增的 id 进行处理。

以上是关于将 Oracle 触发器转换为 MySql 触发器的主要内容,如果未能解决你的问题,请参考以下文章

将SQL Server触发器转换为oracle触发器

在 Oracle 触发器中将新行转换为 XML

SQLite - 将 MySQL 触发器转换为在 SQLite 上工作

如何在 oracle 触发器中转换日期类型变量的时区

包含列的 SQL Server 索引 - 转换为 Oracle

MySQL 触发器中的“INSTEAD OF”,从 SQL Server 转换而来