【问题标题】:Oracle equivalent for MySQL code "insert into dummy" to return error messageOracle 等效于 MySQL 代码“插入虚拟”以返回错误消息
【发布时间】:2013-02-11 01:50:28
【问题描述】:

我正在迁移到 Oracle 数据库的 mysql 数据库中有几百个触发器。有一个声明,我看到了很多我无法在 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;

【问题讨论】:

  • 我不相信 oracle 触发器可以返回值。如果它抛出将返回的异常。如果你想创建事务表或类似的东西,你总是可以从触发器内部插入另一个表。
  • Oracle 有适当的异常处理。不必为了“发送”消息而生成错误

标签: mysql sql oracle oracle11g


【解决方案1】:

我认为你需要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 - Raise User-Defined Exception With Custom SQLERRM

Oracle 文档:link

【讨论】:

  • 我来看看例子。
  • @AlejandroBastidas 我添加了一些信息。我不是 Oracle 专家,但那一行应该可以在没有任何声明的情况下工作。
【解决方案2】:

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

Insert into table_name(column_name) VALUES (value);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 2017-12-03
    • 2011-08-28
    相关资源
    最近更新 更多