需求:
公司一系统升级,要维护的数据库表中已有数据,该表没有序列、触发器等。此表要直接插入一些数据,插入的数据为了和以前的数据兼容(就是一样)。该表主键的生成以前是在代码中分两步进行的,即查询、更新(现在要直接插入数据,不用服务端JAVA代码,不能用这个)。
做法:
本人很懒,希望一条SQL完成上面的插入并更新。而本人oracle数据库(应该说所有数据库)很菜,不会啊,于是找度娘,发现如下两篇资料对我有用(PS:找得好辛苦!):
1、http://www.byywee.com/page/M0/S262/262303.html2、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语句为何还成功了?
是不是函数调用限制说的有问题?