【问题标题】:How do I set a variable in MySQL 5.5 using JDO and DataNucleus?如何使用 JDO 和 DataNucleus 在 MySQL 5.5 中设置变量?
【发布时间】:2014-04-09 16:03:50
【问题描述】:

作为我的审计日志记录过程的一部分,我需要在运行INSERT INTO... 语句之前在我的代码中设置一个变量@user_idINSERT 将启动一个使用@user_idTRIGGER

我尝试了以下查询:

SET @user_id = 5

这不起作用,因为ResultSet 不能是NULL(并且此查询不返回任何内容)

SELECT 51 INTO @user_id

这不起作用,因为 ResultSet 在 Java 中不能是 NULL

SELECT @user_id := 51

这不起作用,因为在使用PersistenceManagerQuery 对象运行查询时,: 字符被转换为参数标记。

那么,使用 DataNucleus,我如何设置一个变量,以便我的 TRIGGER 语句成功并提供用于审计目的的必要信息?

我运行查询的 Java 代码如下:

PersistenceManager pm = getPersistenceManager(); // My own function to get the PersistenceManager
Query q = pm.newQuery("javax.jdo.query.SQL", "QUERY HERE");
q.execute();

如果无法做到这一点,我可以尝试哪些其他选项来达到相同的结果?

编辑:我使用的是 Google App Engine,因此我无法使用存储过程。

【问题讨论】:

  • 定义“JDO 查询”是什么意思? JDOQL、SQL 还是其他? SQL中没有参数解析
  • @NeilStockton 抱歉,如果我不清楚。我将通过澄清更新我的问题,但我的意思是我正在运行来自 PersistenceManager.newQuery("javax.jdo.query.SQL", "SELECT * FROM ...") 的 SQL 查询。

标签: java mysql sql jdo datanucleus


【解决方案1】:

我找不到解决上述问题的方法,所以改用了另一种方法,我将对此进行解释:

我创建了一个名为 transaction_properties 的表,它有两列:user_idconnection_id

在每个事务commit之前,我将INSERT与用户ID(我在这个阶段知道)和MySQL占位符CONNECTION_ID()一起进入transaction_properties表,输出当前连接ID。

在我的触发器中,我使用以下语句来查找此事务的 user_id

DECLARE user_id bigint;

SELECT `userid` INTO user_id FROM `transaction_properties`
WHERE `transaction_id` = CONNECTION_ID() LIMIT 1;

IF user_id IS NULL THEN
  SET user_id = -1;
END IF;

然后我可以将INSERT 中声明的变量user_id 引用到触发器中其他地方的审计表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2014-02-20
    相关资源
    最近更新 更多