Lou025 2016-12-23 01:18 采纳率: 0%
浏览 1105

oracle循环表字段报错的问题

需求:我想下个触发器,在插入和更新时调用这个触发器,用一个循环去循环这个表的所有字段,判断这个字段有没发生变化,如果发生变化,将这个字段名,原来的值,新的值插入到另一张表
目前实现:

CREATE OR REPLACE TRIGGER TR_MEM_MEMBER_LOG
  AFTER UPDATE ON PRD_EXT_ZH
  FOR EACH ROW
DECLARE
  CURSOR CUR_MEM_MEMBER_LOG_DATA IS
    SELECT COLUMN_NAME
      FROM USER_TAB_COLS
     WHERE TABLE_NAME = 'PRD_EXT_ZH';
  V_COLUMN_NAME USER_TAB_COLS.COLUMN_NAME%TYPE;
  V_N_COLUMN_NAME_VALUE VARCHAR2(200);
  V_O_COLUMN_NAME_VALUE VARCHAR2(200);
BEGIN
    OPEN CUR_MEM_MEMBER_LOG_DATA;
    LOOP
      EXECUTE IMMEDIATE 'SELECT :NEW.'|| V_COLUMN_NAME||',:OLD.'||V_COLUMN_NAME||' FROM DUAL'
                   INTO V_N_COLUMN_NAME_VALUE,V_O_COLUMN_NAME_VALUE;
      IF V_N_COLUMN_NAME_VALUE <> V_O_COLUMN_NAME_VALUE THEN
       insert into change_pims(UP_PER_ID,TABLE_NAME,OLD_FIELD,NEW_FIELD,PRD_ID,FIELD_NAME)
        VALUES
          (:new.UP_PER_ID,
           'prd_ext_zh',
            ':OLD.' || V_COLUMN_NAME,
           ':NEW.' || V_COLUMN_NAME,
     :new.prd_id,
           V_COLUMN_NAME);
      END IF;
    END LOOP;
    CLOSE CUR_MEM_MEMBER_LOG_DATA;
END TR_MEM_MEMBER_LOG;


报错:
Caused by: ErrCode: 14101017
Message: SQL语法错误(Could not execute JDBC batch update)
at com.primeton.das.entity.impl.exception.DASExceptionHelper.convert(DASExceptionHelper.java:150)
at com.primeton.das.entity.impl.DASSessionImpl.updateEntity(DASSessionImpl.java:214)
at com.eos.foundation.database.DatabaseUtil.updateEntity(DatabaseUtil.java:282)
... 60 more
Caused by: com.primeton.das.entity.impl.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
at com.primeton.das.entity.impl.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at com.primeton.das.entity.impl.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at com.primeton.das.entity.impl.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:264)
at com.primeton.das.entity.impl.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
at com.primeton.das.entity.impl.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
at com.primeton.das.entity.impl.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at com.primeton.das.entity.impl.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at com.primeton.das.entity.impl.hibernate.impl.SessionImpl.flush(SessionImpl.java:1021)
at com.primeton.das.entity.impl.DASSessionImpl.updateEntity(DASSessionImpl.java:211)
... 61 more
Caused by: java.sql.BatchUpdateException: ORA-00919: 无效函数
ORA-06512: 在 "PIM.TR_MEM_MEMBER_LOG", line 13
ORA-04088: 触发器 'PIM.TR_MEM_MEMBER_LOG' 执行过程中出错

  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2016-12-24 15:58
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败