关于上次存储函数基本语法构造进行了说明,也说明了呼出的的方法。
要点是,函数是要返回某个值,函数可以在调用的时候作为值在某个语句中直接可以使用。
譬如,可以在代入句(:=)的右边使用向变量代入值
(例)
变量:=函数(P1);
或者,调用函数作为存储过程的参数
(例)
存储过程(函数(P1));
等等,有各种各样的使用方式。
还有,函数也可以直接在SQL文中作为值使用。那是这次的主题。
作为条件使用,和在SELECT语句和DML语句中(UPDATE、DELETE、INSERT)中还是有不同的地方。
请看下面的例子:
首先是可以正常的例子。
例如,上一次,我们制作了一个功能FUNK_顺序号码,该功能返回了一个包含顺序表值的值,但是我想用这个功能直接放到在订单表的INSERT处理中,作为订单号码的值来记述这个功能。
例如,在顺序表中,订单ID的号码现在最大是3号。
SQL>SELECT * FROM 顺序 WHERE 发号单位 = “订购ID”;
发号单位编号
订单ID 3
那么,在这种情况下,如果呼出FUNK_顺序号码(‘订购ID’)的话,将上述号码加1并返回4。
如果订单表中INSERT语句直接使用将该函数。
例子如下:
<<在INSERT语句中调用函数>>
SQL>INSERT INTO 订购 VALUES(FUNK_顺序号码(“订购ID”),“无线电”,1);
创建了一行。
这样一来,订单ID4的订单应该登记在订单表上了
我马上确认一下。
SQL>SELECT * FROM 订购 ORDER BY 订购ID;
订购ID 产品名 订购数
1 电视 3
2 收音机 4
3 电视 2
4 无线电 1 ←追加的行
订单ID4的行被登记了!
那么这个范例能用在SELECT文的SELECT句里吗?
如果是普通的SQL函数的话,可以在SELECT语句中使用。
(例)普通SQL函数可用于SELECT语句
SQL> SELECT TO_DATE(‘2012-01-01’) FROM DUAL;
TO_DATE(
12-01-01
但是,这个FUNK_顺序号码函数,在INSERT语句中可以直接使用,但是在SELECT语句中也不能使用。
如下所示是错误。
SQL>SELECT FUNK_顺序号('订购ID’) FROM DUAL;
SELECT FUNK_顺序号(‘订购ID’)FROM DUAL
*
行1发生错误。:
ORA-14551:无法在查询中执行DML操作。
ORA-06512: "SCOTT.FUNC_顺序编号“,行9
请不要误会,用户定义的函数并非总是在SELECT语句中无法使用,只要满足一定条件就可以使用。
那么,那个条件是?
根据上面的错误信息我想一半能明白,下次详细说明。
这次就到这里。请期待下次。