Oracle, вызывая проблемы PL / SQL из файла SQL-Plus x.sql, говорит, что my_function "не может быть функцией" - PullRequest
3 голосов
/ 08 мая 2009

так просто, если я создаю свою функцию как CREATE OR REPLACE FUNCTION MD5_ENCODE, она будет работать без сбоев, но если она останется анонимно в блоке SQL-Plus, так как PL / SQL -> «может не быть функцией».

Что это за «функция» 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 ]

5 голосов
/ 11 мая 2009

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

Есть несколько вещей, которые могут быть.

Мой кандидат # 1, мы можем использовать только функции в выражениях SQL, которые являются общедоступными, т.е. объявлены в спецификации пакета. Это относится даже к операторам SQL, выполняемым в одном и том же теле пакета. Резонанс состоит в том, что операторы SQL выполняются другим механизмом, который может видеть только публично объявленные функции.


Краткая история , функция должна быть определена в пакете, , например, CREATE ORLACE FUNCTION MD5ENCODE (IN_TEXT IN VARCHAR2) RETURN VARCHAR2 IS ...

4 голосов
/ 08 мая 2009

Чтобы вызвать функцию внутри оператора SQL, она должна существовать как объект функции в базе данных. Оператор SQL анализируется и выполняется отдельно от вашего кода PL / SQL, поэтому он не имеет доступа к локальной функции.

Если вы действительно не хотите создавать объект функции, вы можете использовать курсор для циклического перемещения по строкам таблицы, выполнять функцию в инструкции PL / SQL и обновлять каждую строку по ходу работы. *

0 голосов
/ 30 июня 2015

Как уже упоминалось выше, это может быть полезно.

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;
0 голосов
/ 09 мая 2009

Ваша первая проблема - опечатка.

FUNCTION MD5_ENCODE (CLEARTEXT IN VARCHAR2) ВОЗВРАТ VARCHAR2 IS

против

UPDATE ADDRESSES_T SET STREET = MD5ENCODE (УЛИЦА);

Отсутствует подчеркивание в вызове функции в операторе обновления.

Следующая ошибка, с которой вы столкнетесь:

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

Таким образом, вы можете просто присвоить результаты функции переменной и использовать ее в операторе Update.

...