2017-08-30 44 views
0

如何解决此问题? :DB2 FUNCTION TEST ERROR

CREATE OR REPLACE FUNCTION "BADIL_PROD"."FCT_UPDATE_POINTAGE" (id_projet in NUMBER) 
return NUMBER 
is 

    Results NUMBER; 
    CURSOR cur_update IS 
      SELECT distinct t.ID_TACHE,t.id_collaborateur,t.id_ref_rubrique_activite 
      FROM TACHES t 
      where t.ID_PROJET =id_projet ; 


begin 

dbms_output.enable(200000); 
    FOR cur in cur_update 
    LOOP 
    BEGIN 

dbms_output.put_line(cur.ID_TACHE || '--' || cur.ID_COLLABORATEUR || '--' || cur.ID_REF_RUBRIQUE_ACTIVITE); 
UPDATE POINTAGES p SET p.ID_TACHE_INCIDENT = cur.ID_TACHE 
where p.id_projet_tma=id_projet 
and p.ID_COLLABORATEUR = cur.ID_COLLABORATEUR 
AND p.ID_REF_RUBRIQUE_ACTIVITE = cur.ID_REF_RUBRIQUE_ACTIVITE; 

    END; 
END LOOP; 

    results:=0; 
    return(results); 

end fct_update_pointage; 

所以,当我想测试这个功能我得到这个错误的数据演播室:

(具体名称“FCT_UPDATE_POINTAGE”)试图修改数据,但被 没有定义为修改SQL数据.. SQLCODE = -577,

+0

你似乎在为你的函数使用PL/SQL;您是否在数据库中启用了Oracle兼容性? – mustaccio

+0

是的,我做了...... –

回答

0

这为我工作与DB2 V11在Linux上:

db2set DB2_COMPATIBILITY_VECTOR=830 
db2stop 
db2start 
db2 create database mydb 
db2 connect to mydb 
db2 "create table taches(....)" 
db2 "create table pointages(...)" 
db2 -tvf FCT_UPDATE_POINTAGE.sql 

(其中FCT_UPDATE_POINTAGE.sql包含你的函数定义)

但是,请注意文档中的记录限制“编译SQL函数(包括PL/SQL函数)修改SQL数据只能作为对的唯一元素在复合SQL(编译)语句中的赋值语句的右侧“。

在定义PL/SQL用户定义函数时,DB2 V9.7允许使用“修改sql数据”子句,但IBM在DB2 V10.1及更高版本中移除了该能力。也许你需要转换成一个sproc。

+0

我创建函数时没有问题,但是当我想在选择查询中执行它时: 从SYSIBM.SYSDUMMY1中选择FCT_UPDATE_POINTAGE(arg); 我收到此错误: (特定名称“FCT_UPDATE_POINTAGE”)试图修改数据,但未定义为MODIFIES SQL DATA .. SQLCODE = -577, –