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

それがあり得ることはたくさんあります。

私の一番の候補は、パブリックである、つまりパッケージ仕様で宣言されているSQLステートメントでのみ関数を使用できるということです。これは、同じパッケージ本体内で実行されるSQLステートメントにも当てはまります。その理由は、SQLステートメントは、公に宣言された関数のみを表示できる別のエンジンによって実行されるということです。


簡単に言うと、関数は、 CREATE OR REPLACE FUNCTION MD5ENCODE(IN_TEXT IN VARCHAR2)RETURN VARCHAR2IS..のようにパッケージで定義する必要があります。

于 2009-05-11T14:26:01.340 に答える
4

SQLステートメント内で関数を呼び出すには、データベース内に関数オブジェクトとして存在する必要があります。SQL文はPL/SQLコードとは別に解析および実行されるため、ローカルで定義された関数にアクセスできません。

本当に関数オブジェクトを作成したくない場合は、カーソルを使用してテーブルの行をループし、PL / SQL文で関数を実行し、各行を更新することができます。

于 2009-05-08T18:12:56.360 に答える
0

最初の問題は、タイプミスがあることです。

FUNCTION MD5_ENCODE(CLEARTEXT IN VARCHAR2)RETURN VARCHAR2 IS

UPDATE ADDRESSES_T SET STREET = MD5ENCODE(STREET);

updateステートメントの関数呼び出しにアンダースコアがありません。

次に発生するエラーは次のとおりです。

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 に答える