3

如此简单,如果我创建我的函数,因为CREATE OR REPLACE FUNCTION MD5_ENCODE它会顺利运行,但如果它以 PL/SQL 的形式匿名地留在 SQL-Plus 块中——>“可能不是函数”错误。

这个 Oracle 的“特性”又是什么?

DECLARE

FUNCTION MD5_ENCODE(CLEARTEXT IN VARCHAR2) RETURN VARCHAR2 IS    
    CHK VARCHAR2(16);   
    HEX VARCHAR2(32);  
    I   INTEGER;  
    C   INTEGER;  
    H   INTEGER;  
BEGIN
    IF CLEARTEXT IS NULL THEN
        RETURN '';
    ELSE
        CHK := DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING
=> CLEARTEXT);
        FOR I IN 1 .. 16 LOOP
            C := ASCII(SUBSTR(CHK, I, 1));
            H := TRUNC(C / 16);
            IF H >= 10 THEN
                HEX := HEX || CHR(H + 55);
            ELSE
                HEX := HEX || CHR(H + 48);
            END IF;
            H := MOD(C, 16);
            IF H >= 10 THEN
                HEX := HEX || CHR(H + 55);
            ELSE
                HEX := HEX || CHR(H + 48);
            END IF;
        END LOOP;  
        RETURN HEX;  
    END IF;  

END;  

BEGIN  
    UPDATE ADDRESSES_T SET STREET = MD5ENCODE(STREET) ;  

-- etc...  
END   
4

4 回答 4

5

http://forums.oracle.com/forums/thread.jspa?threadID=245112

它可能有很多事情。

我的#1 候选人是,我们只能在公共的 SQL 语句中使用函数,即在包规范中声明。即使是在同一个包体中执行的 SQL 语句也是如此。原因是 SQL 语句由不同的引擎执行,该引擎只能看到公开声明的函数。


长话短说必须在包中定义函数,例如 CREATE OR REPLACE FUNCTION MD5ENCODE(IN_TEXT IN VARCHAR2) RETURN VARCHAR2 IS ...

于 2009-05-11T14:26:01.340 回答
4

为了在 SQL 语句中调用函数,它需要作为函数对象存在于数据库中。SQL 语句与您的 PL/SQL 代码分开解析和执行,因此它无法访问本地定义的函数。

如果你真的不想创建函数对象,你可以使用游标来遍历表中的行,在 PL/SQL 语句中执行函数,并随时更新每一行。

于 2009-05-08T18:12:56.360 回答
0

你的第一个问题是你有一个错字。

函数 MD5_ENCODE(VARCHAR2 中的明文)返回 VARCHAR2 是

相对

UPDATE ADDRESSES_T SET STREET = MD5ENCODE(STREET) ;

您在更新语句的函数调用中缺少下划线。

您将遇到的下一个错误是:

PLS-00231: function 'MD5_ENCODE' may not be used in SQL

因此,您可以简单地将函数结果分配给一个变量并在 Update 语句中使用它。

于 2009-05-08T22:04:53.310 回答
0

正如上面评论中提到的,这可能很有用。

DECLARE
  V NUMBER := 0;
  FUNCTION GET_SQ(A NUMBER) RETURN NUMBER AS
  BEGIN
    RETURN A * A;
  END;
BEGIN
  V := GET_SQ(5);
  --DBMS_OUTPUT.PUT_LINE(V);
  UPDATE MYTABLE A SET A.XCOL = V;
END;
于 2015-06-30T06:51:53.727 回答