2

我在 mysql db 中有几百个触发器,我正在迁移到 Oracle db。有一个声明,我看到了很多我无法在 oracle 中找到等效的声明。

INSERT INTO $some_kind_of_message._BD_TRIGG$ (dummy) VALUES (value);

我在程序和函数中也看到了这一点,它似乎向调用程序的应用程序“返回”了一条消息(我认为)。我在两个 RDBMS 中都是新手,但我已经使用 oracle 几个月了。

是否有等效的语句来替换 oracle 中的 mysql 语句?非常感谢。

编辑:

这是许多触发器的示例。这个用于登录验证。我不太确定 oracle 的触发器语法,但现在这不是问题。'case' 部分仍然是 mysql 语法。我无法在 mysql 或 oracle 文档中找到信息。这不是一个正常的插入,它是 mysql 使用的某种返回消息(这就是我的猜测),我在函数和过程中也看到了它。¿我如何替换它以供 oracle 执行相同的任务?

CREATE OR REPLACE TRIGGER adduser 
BEFORE INSERT
ON tbl_users
FOR EACH ROW

  DECLARE flag INTEGER;

  begin
  flag := 1;

  /* validate login */
  IF(LENGTH(TRIM(:NEW.login)) < 4) THEN
    flag := -1;
  END IF;

  /* valido clave */
  IF(flag = 1) THEN
    IF(LENGTH(:NEW.clave) < 3) THEN
      flag := -2;
    END IF;
  END IF;
    CASE flag
        WHEN -1 THEN INSERT INTO $login_less_then_4_characters._BD_TRIGG$ (dummy) VALUES ('error');
        WHEN -2 THEN INSERT INTO $pass_less_then_5_characters._BD_TRIGG$ (dummy) VALUES ('error');
        ELSE flag := 0;
    END CASE;
END;
4

2 回答 2

2

我认为您需要RAISE_APPLICATION_ERROR()功能/程序。

句法:

raise_application_error(error code, your error message);

例子:

raise_application_error(-20001, 'Login must have 4 characters or more');

在 Oracle 自定义应用程序中,错误代码介于-20000和之间-20999

更多信息在这里:

Oracle PL/SQL - 使用自定义 SQLERRM 引发用户定义的异常

Oracle 文档:链接

于 2013-02-25T22:29:07.077 回答
0

我不熟悉 MySQL 语法,但在 Oracle 中它翻译为

Insert into table_name(column_name) VALUES (value);

其中 dummy 是某个表中的列或传递给函数的参数。您不能在 Oracle 的 Insert 语句中使用过程、触发器。您可以在 DML 语句中使用 Function(),例如 SELECT your_function(dummy)..., INSERT your_function(dummy)... 众所周知,函数返回一个值。

于 2013-02-25T21:02:16.933 回答