Oracle,从 SQL-Plus 文件 x.sql 中调用 PL/SQL 问题说 my_function "may not be a function"

标签 oracle function plsql sqlplus

如此简单,如果我将函数创建为CREATE OR REPLACE FUNCTION MD5_ENCODE,它将顺利运行,但如果它像 PL/SQL 那样匿名地保留在 SQL-Plus block 中 -->“可能不会是一个函数”错误。

这个 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   

最佳答案

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 ...

关于Oracle,从 SQL-Plus 文件 x.sql 中调用 PL/SQL 问题说 my_function "may not be a function",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/841003/

相关文章:

oracle - Docker上的Oracle数据库非常低

oracle - PL/SQL中OUT参数必须赋值是真的吗?

javascript - jquery - 从函数返回一个值

r - 当 R 中的卡方检验生成警告时,如何执行 Fisher 精确检验 `fisher.test()`?

sql - 我需要什么才能在查询中执行查询?

sql - Oracle 中依赖于字段值的约束

c - C中二叉树遍历没有输出

html - 按钮在 Internet Explorer 7 中呈现不正确 - 需要 IE7 特定的 CSS 修复

java - 使用JAVA从Oracle数据库读取网络文件

sql - "local collection types not allowed"PL/SQL 错误 ORA-06550