上次,我们看到了存储函数可以像SQL函数那样在SQL语句中使用(呼出)。
但是,上一个函数在INSERT语句中是正常使用的,但在SELECT语句中使用时出错了。
像这样,从SQL语句调用用户定义的函数时,其函数定义有很多条件。
这个条件是这次的主题。
详细内容记载在PL/SQL语言的手册中,将简单易懂地说明其精髓。
【条件1】
首先,函数参数的数据类型和RETURN数据类型必须是表列的数据类型。
也就是说,需要NUMBER、VARCHAR2、DATE等非常普通的表列的数据类型。
该函数不能是特殊数据类型:
例如,如果是PL/SQL固有的数据类型,如BOOLEAN型或集合(简单来说就是数组),则不能在SQL中调用。
【条件2】
在该函数中,不能使用COMMIT、ROLLBACK、DDL文(CREATE、DROP等)。
这些句子属于结束(确定或取消)交易的处理。
也就是说,SQL呼出的函数里边,不能有确定或取消交易的处理。
【条件3】
在该函数中,没有访问作为SQL文对象的表。
例如,在对EMP表用SQL语句的时候,进行调用的该函数的时候,不能对EMP表进行DML(INSERT、UPDATE、DELECT)或SELECT等的操作。
(但是也有例外,但很少,这里不做说明)
【条件4】
因此,一般从SQL语句调用函数时,该函数如果是对该SQL对象以外的表进行访问(SELECT或DML)的话,可以从SQL语句调用调用此函数。
但是,如果在该函数中使用DML语句(INSERT、UPDATE、DELETE、MERGE),则该函数不能从SELECT语句中调用。
如果这种时候可以从SELECT语句中调用的话,由于SELECT会发生交易和处理,会发生不整合的事情。
如上所述,是SQL调用函数的条件。
上一次,以FUNK_顺序号这一函数为例,INSERT语句中可以使用,SELECT语句中使用时出错,下面参照上述条件做以下说明。
另外,FUNK_顺序编号函数的定义请参照上一篇文章。
SQL>INSERT INTO 订购 VALUES(FUNK_顺序号码(“订购ID”),“无线电”,1);
创建了一行。
(解说)
这个FUNK_顺序号码函数针对「顺序表」RETURN做新的订购ID的号码,里边有DML(UDPDATE)语句。但是改函数内对「订购表」什么操作也没做,所以像上述例子那样从对「订购表」的DML(INSERT)可以调用。(条件3)
例子2:
SQL>SELECT FUNK_顺序号('订购ID’)FROM DUAL;
SELECT FUNK_顺序号(‘订购ID’)FROM DUAL
行1发生错误。:
ORA-14551:无法在查询中执行DML操作。
ORA-06512: "SCOTT.FUNC_顺序编号“,行9
(解说)
FUNK_顺序号码函数包含DML,因此SELECT语句无法调用。(条件4)
因此,这次解说了SQL可以调用的函数的条件。
另外,如果是不从SQL调用的函数,当然不受这些条件的限制。
但是,如果将函数设置为可以从SQL中调用的函数,那么不用为函数的返回值定义变量,直接在SQL中使用该值,非常方便。
除此之外,从SQL调用函数的好处还有很多。
下次想简单地介绍一下这些优点。