1

の代わりに使用するために、この例から変更された次のソース コードがあります。NUMBERSVARCHAR2

CREATE OR REPLACE PACKAGE gen_encr
AS
    FUNCTION encrypt (p_PlainText NUMBER) RETURN RAW DETERMINISTIC;
    FUNCTION decrypt (p_Encrypted RAW) RETURN NUMBER DETERMINISTIC;
END;
/


CREATE OR REPLACE PACKAGE BODY gen_encr
AS
EncryptionType PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256
                           + DBMS_CRYPTO.CHAIN_CBC
                           + DBMS_CRYPTO.PAD_PKCS5;

EncryptionKey RAW (32) := UTL_RAW.cast_to_raw('ThisTextIsMyEncryptionKeyForThisPackage');

FUNCTION encrypt (p_PlainText NUMBER) RETURN RAW DETERMINISTIC
    IS
        encrypted_raw      RAW (1024);
    BEGIN
        encrypted_raw := DBMS_CRYPTO.ENCRYPT
        (  src => UTL_RAW.CAST_FROM_NUMBER (p_PlainText),
           typ => EncryptionType,
           key => EncryptionKey
        );
   RETURN encrypted_raw;
END encrypt;

FUNCTION decrypt (p_Encrypted RAW) RETURN NUMBER DETERMINISTIC
    IS
        decrypt_raw      RAW (1024);
    BEGIN
        decrypt_raw := DBMS_CRYPTO.DECRYPT
        (   src => p_Encrypted,
            typ => EncryptionType,
            key => EncryptionKey
        );
    RETURN (UTL_RAW.CAST_TO_NUMBER (decrypt_raw));
END decrypt;
END;
/

ただし、ステートメントSELECT sys.gen_encr.encrypt(sal) FROM empを実行すると、次のエラーが発生します。

ORA-06502: PL/SQL: numeric or value error: raw variable length too long
ORA-06512: at "SYS.GEN_ENCR", line 13

一部の Google 検索では、RAW データ型が 2000 バイトしか受け入れられないことがエラーの可能性があることが示唆されました。

ただし、この場合、エラーが発生する理由がわかりません。どんな助けでも大歓迎です。

4

1 に答える 1

2

これは非常に単純です。キーが長すぎます。RAW(32)変数に入れようとしているのは 37 文字です。32 文字に短縮すると、そのエラーは表示されなくなります。

于 2012-12-09T13:42:49.937 に答える