日期:2014-05-17  浏览次数:20899 次

如何监视程序缺少哪张表或哪个字段。
现有系统是用MVC模式实现的,数据库是oracle,后台java代码中没有用到存储过程。
  比如程序中执行一条SQL , select a,b from aa left join bb on aa.a=bb.b。
  假设BB表不存在或bb字段不存在,还没有创建。那么系统会提示 表或视图不存在或者字段不存在。不能给出明确的表名字,这样还得跟代码找到SQL,并在PL/SQL中查询这个SQL,才能知道到底哪表不存在,这样效率太低下了,有没有一种比较好的处理方式可以明确的提示用户具体哪张表不存在,请高手指点一二。


------解决方案--------------------
oracle好像是报不出来
再说 开发你应该是先设计表格 然后写前台代码
出现这种情况很不应该啊
------解决方案--------------------
如果有这种需求的话,这系统的设计也太差了。MVC算是白用了,当然跟MVC没什么关系。
------解决方案--------------------
一张一张表去查了,就知道什么表不存在了
------解决方案--------------------
那你们系统就更牛了
有的用户需要a表但其他用户就不需要
难道就是传说中的一个用户一套表
应该是
有的业务需要a表但其他业务就不需要
------解决方案--------------------
数据库报错的信息如果缺少字段或表不是会报的很详细吗,


一般都是直接把数据库报的错误描述复制到程序错误中.
------解决方案--------------------
通过触发器记录更详细的信息,如果错误发生,关注ERROR_LOG的sql_text字段
SQL code

--建立一个日志表
create table ERROR_LOG
(
  TIMESTAMP     DATE,
  USERNAME      VARCHAR2(30),
  INSTANCE      NUMBER,
  DATABASE_NAME VARCHAR2(50),
  ERROR_STACK   VARCHAR2(2000),
  SQL_TEXT      VARCHAR2(4000)
);
--建立一个错误触发器,注意sql_text字段值
CREATE OR REPLACE TRIGGER LogErrors
  AFTER ServerError ON TEST.SCHEMA
--这里针对TEST用户,可修改,也可针对所有数据库使用on database
DECLARE
  sql_txt ora_name_list_t;
  v_stmt  VARCHAR2(4000);
  n       BINARY_INTEGER := 0;
BEGIN
  n := ora_sql_txt(sql_txt);
  IF nvl(n, 200) <> 200 THEN
    FOR i IN 1 .. n LOOP
      v_stmt := v_stmt || sql_txt(i);
    END LOOP;
    dbms_output.put_line(v_stmt);
  END IF;
  INSERT INTO error_log
  VALUES
    (SYSDATE,
     sys.Login_user,
     sys.Instance_num,
     sys.DataBase_Name,
     Dbms_Utility.Format_Error_Stack,
     v_stmt);
END LogErrors;

------解决方案--------------------
感觉这些应该是人为的错误,地基没打好,肯定没法盖楼