{2。

时间:2018-08-02 21:32:23

标签: db2 db2-400

我正在使用v6r1m0和Windows 7x64上的Navigator v7r1m0的旧AS / 400 DB2系统进行工作。

今天,我在此系统上创建了我的第一个UDF,但很快意识到有些东西没有按预期工作。如果删除该函数,请进行更改,然后再次创建...返回的值不会更改。好像有已编译的代码被缓存/镜像/保存在某处...即使被丢弃。

在拖放/更改/创建之后,如果我进入导航器中的模式树并生成该函数的SQL,我会执行来查看新的更改。但是该函数返回的值是来自SQL的上一个版本。

请考虑以下几行SQL,所有这些行均在Navigator SQL窗口中创建和运行。运行此命令时,将打开两个结果选项卡,但两个窗口中返回的值是相同。两个结果均为“ Y”; “ N”永远不会出现。

这是怎么回事?这个服务器/ db / connection / etc是否有问题,或者(更有可能)我是否不知道某些基本原理在起作用??

CREATE FUNCTION CERTODB.TESTME 
    () 
    RETURNS VARCHAR(1)

    LANGUAGE SQL 
    DETERMINISTIC 
    NO EXTERNAL ACTION 
    CALLED ON NULL INPUT 

    BEGIN  

    RETURN 'Y'  ;  -- CHANGES BELOW

    END  ;

SELECT CERTODB.TESTME() FROM SYSIBM.SYSDUMMY1 ; -- RETURNS 'Y'

DROP FUNCTION CERTODB.TESTME ;

CREATE FUNCTION CERTODB.TESTME 
    () 
    RETURNS VARCHAR(1)

    LANGUAGE SQL 
    DETERMINISTIC 
    NO EXTERNAL ACTION 
    CALLED ON NULL INPUT 

    BEGIN  

    RETURN 'N'  ;  -- VALUE HAS BEEN CHANGED  

    END  ;

SELECT CERTODB.TESTME() FROM SYSIBM.SYSDUMMY1 ; -- STILL RETURNS 'Y'..!!

1 个答案:

答案 0 :(得分:0)

对我来说很好...但是我正在运行v7.2 ...

我不记得使用6.1版UDF的任何问题...

IBM i是基于对象的,因此您的两个函数被视为两个单独的对象,每个对象都有唯一的地址。它确实支持“使用时替换”,但是通常在用REPLACE(* YES)编译的HLL程序中可以看到。

您可以尝试在通话之间断开连接并重新连接。