PLSQL入门与精通(第24章,SQL中使用函数的前提)

上次,我们看到了存储函数可以像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调用函数的好处还有很多。

下次想简单地介绍一下这些优点。

猜你喜欢

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