ORACLE:SELECT语句里调用函数使用DML语句进行UPDATE/INSERT/DELETE操作

需求:

公司一系统升级,要维护的数据库表中已有数据,该表没有序列、触发器等。此表要直接插入一些数据,插入的数据为了和以前的数据兼容(就是一样)。该表主键的生成以前是在代码中分两步进行的,即查询、更新(现在要直接插入数据,不用服务端JAVA代码,不能用这个)。

做法:

本人很懒,希望一条SQL完成上面的插入并更新。而本人oracle数据库(应该说所有数据库)很菜,不会啊,于是找度娘,发现如下两篇资料对我有用(PS:找得好辛苦!):

1、http://www.byywee.com/page/M0/S262/262303.html
2、http://www.cnblogs.com/wuyisky/archive/2010/05/11/oracle_function.html
其中第2篇资料有如下内容:
函数调用限制
1、SQL语句中只能调用存储函数(服务器端),而不能调用客户端的函数
2、SQL只能调用带有输入参数,不能带有输出,输入输出函数
3、SQL不能使用PL/SQL的特有数据类型(boolean,table,record等)
4、SQL语句中调用的函数不能包含INSERT,UPDATE和DELETE语句

附1我的函数:

CREATE OR REPLACE FUNCTION GETPREPAYID
   RETURN INTEGER
IS
   PRAGMA AUTONOMOUS_TRANSACTION;
   PREPAY_ID   INTEGER;
BEGIN
       SELECT s.max_value
         INTO PREPAY_ID
         FROM sys_bill_maxvalue s
        WHERE s.account_type = 'const' AND s.bill_type = '预缴费记录'
   FOR UPDATE OF s.max_value;

   UPDATE sys_bill_maxvalue sb
      SET sb.max_value = PREPAY_ID + 1
    WHERE sb.account_type = 'const' AND sb.bill_type = '预缴费记录';

   COMMIT;

   RETURN (PREPAY_ID);
END GETPREPAYID;

附2我的SQL:


INSERT INTO vehicle_prepay_record vpr (vpr.PREPAY_ID,
                                       vpr.VEHICLE_ID,
                                       vpr.PREPAY_DATE,
                                       vpr.PAY_MONEY,
                                       vpr.DISINFECTIONBAL,
                                       vpr.STATUS_FLAG,
                                       vpr.CREATOR,
                                       vpr.CREATE_DATE,
                                       vpr.DATASTATUS,
                                       vpr.VEHICLE_REMAIN_MONEY,
                                       vpr.DISINFECTIONBAL_REAIN)
   SELECT GETPREPAYID,
          V.VEHICLE_ID,
          SYSDATE,
          -v.DISINFECTIONBAL_REMAIN,
          v.DISINFECTIONBAL_REMAIN,
          'YA',
          '管理员',
          SYSDATE,
          '1',
          V.PAY_MONEY_REMAIN,
          V.DISINFECTIONBAL_REMAIN
     FROM DUAL, vehicle v;

目前我有疑问:
按函数调用限制第4条,我的SQL语句有DML语句为何还成功了?
是不是函数调用限制说的有问题?

猜你喜欢

转载自blog.csdn.net/damoluomu/article/details/18402645