PLSQL入门与精通(第23章:函数在SQL文中的使用)

关于上次存储函数基本语法构造进行了说明,也说明了呼出的的方法。
要点是,函数是要返回某个值,函数可以在调用的时候作为值在某个语句中直接可以使用。

譬如,可以在代入句(:=)的右边使用向变量代入值

(例)
变量:=函数(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语句中无法使用,只要满足一定条件就可以使用。

那么,那个条件是?

根据上面的错误信息我想一半能明白,下次详细说明。

这次就到这里。请期待下次。

猜你喜欢

转载自blog.csdn.net/niusr_1980_01/article/details/114212541