我正在尝试从“systriggers / systrigbody”informix系统表中查询触发器。当datakey列为'A'和'D'时,我需要systrigbody表的数据列,并且应该忽略其余的。这是我的代码:
SELECT tr.tabid, tr.trigid, tr.trigname, tr.owner, tb.data
FROM systriggers tr, systrigbody tb
WHERE tr.tabid = ?
AND tr.trigid = tb.trigid
AND tb.datakey != 'B' AND tb.datakey != 'H'AND tb.datakey !='S'
ORDER BY tb.datakey DESC
我遇到的问题是它只返回'A'datakey值的数据列,或仅返回'D'(取决于ORDER BY是DESC还是ASC)。我需要他们两个。有什么指针吗?
答案 0 :(得分:0)
我稍微修改了你的查询,以便(a)在选择列表中包含tb.datakey
,以及(b)省略tabid
上的条件(因此它会选择任何表的任何触发器):< / p>
SELECT tr.tabid, tr.trigid, tr.trigname, tr.owner, tb.datakey, tb.data
FROM systriggers tr, systrigbody tb
WHERE {tr.tabid = ?}
{AND} tr.trigid = tb.trigid
AND tb.datakey != 'B' AND tb.datakey != 'H'AND tb.datakey !='S'
ORDER BY tb.datakey DESC;
我在装满触发器的数据库上运行它,部分输出是:
124|49|u_timerecord|wtsdba|D|create trigger "wtsdba".u_timerecord update on "wtsdba".timerecord
124|50|d_timerecord|wtsdba|D|create trigger "wtsdba".d_timerecord delete on "wtsdba".timerecord
125|51|u_wi_buglist|wtsdba|D|create trigger "wtsdba".u_wi_buglist update on "wtsdba".wi_buglist
127|52|u_wi_problem|wtsdba|D|create trigger "wtsdba".u_wi_problem update on "wtsdba".wi_problem
128|53|u_wi_task|wtsdba|D|create trigger "wtsdba".u_wi_task update on "wtsdba".wi_task
106|15|d_workstate|wtsdba|A| before\ (\ execute procedure "jleffler".wtsdba_del('WorkState' ));
106|14|u_workstate|wtsdba|A| before\ (\ execute procedure "jleffler".wtsdba_upd('WorkState' ));
114|29|u_sec_action|wtsdba|A| before\ (\ execute procedure "jleffler".wtsdba_upd('SEC_Action' ));
107|16|d_workitem|wtsdba|A| before\ (\ execute procedure "jleffler".wtsdba_del('WorkItem' ));
115|30|u_wts_menu|wtsdba|A| before\ (\ execute procedure "jleffler".wtsdba_upd('WTS_Menu' ));
我输出了输出,以便用一个空白替换多个空白。共有110条线路;我只是从列表中间选择了一些数据键从'D'
更改为'A'
的内容。
这是在DB-Access工作(有点)中运行的;
,你会得到与DB-Access基本相同的结果,但格式化会更加冗长。由此我推断出你的查询基本上是合理的。我并不反对你看到奇怪的结果。因此,您需要生成一个最小的测试用例 - 一个简单的Java和JDBC程序,它执行显示的查询或原始查询,并演示问题(换句话说,一个SSCCE - Short, Self-Contained, Correct Example),以显示你怎么看问题。然后我们可以希望重现这个问题。请包含带有触发器的简单表的架构,以便我们使用“相同”的目录数据。
找到您正在使用的Informix版本也会有所帮助。你应该可以使用:
SELECT DBINFO('version', 'full') FROM SysTables WHERE TabID = 1;
如果由于不支持而失败,则Informix很长时间不受支持。我得到了输出:
IBM Informix Dynamic Server Version 11.70.FC6
我在使用Mac OS X 10.7.5的Mac上运行。