2017-11-22 6 views
0

Oracle PL/SQLレコードでは、フィールドを定義するためにアンカー・データ型(%TYPEおよび%ROWTYPEを含む)を使用できます。Oracleユーザー定義レコード

クエリからレコードを作成するとき、select節で型変換が必要です。 Oracleの組み込み関数または他の方法を使用して可能ですか? maritial_status(shouldn」で

ORA-06502: PL/SQL: numeric or value error: character to number conversion error 
ORA-06512: at line 9 
+0

[コードとエラーを画像ではなくテキストとして投稿してください](https://meta.stackoverflow.com/questions/285551/why-not-upload-images-of-code-on-so-when-asking- a質問/ 285557#285557)。また、あなたの質問にテーブル定義を含めて、データタイプやサンプルデータを見ることができます。 –

答えて

0

あなたが定義されているあなたのレコードタイプ:エラーを取得し

DECLARE 
    TYPE TEST_RECORD IS RECORD(
    FIRST_NAME  EMPLOYEE_MT.FIRST_NAME%TYPE, 
    LAST_NAME  EMPLOYEE_MT.LAST_NAME%TYPE, 
    MARITIAL_STATUS EMPLOYEE_MT.MARITAL_STATUS%TYPE); 
    EMPLOYEE_NAME TEST_RECORD; 
BEGIN 

    SELECT EMP.FIRST_NAME, 
     EMP.LAST_NAME, 
     DECODE(EMP.MARITAL_STATUS, 1, 'MARRIED', 0, 'UN-MARRIED') 
    INTO EMPLOYEE_NAME 
    FROM EMPLOYEE_MT EMP 
    WHERE EMP.EMPLOYEE_ID = 1; 
    DBMS_OUTPUT.put_line(EMPLOYEE_NAME.MARITIAL_STATUS); 

END; 

:私は、変換を実行するために、簡単なデコード機能を使用しています。この例のシナリオでは

tはmarital_status?)フィールドに、テーブルの列と同じデータ型を使用します。あなたのdecodeからは、数値データ型のようです。レコードのフィールド値を文字列に設定しようとすると、そのフィールドに数字が必要なときに、 '結婚'または '結婚しない'のいずれかの文字列が設定されます。明らかにこれらの文字列のいずれも数値に変換できないため、エラーが発生しています。

あなたはレコードが文字列値を格納する場合、あなたはそのように定義する必要があります - 明示的に文字列として、むしろ%TYPEを使用するより:

DECLARE 
    TYPE TEST_RECORD IS RECORD(
    FIRST_NAME  EMPLOYEE_MT.FIRST_NAME%TYPE, 
    LAST_NAME  EMPLOYEE_MT.LAST_NAME%TYPE, 
    MARITAL_STATUS VARCHAR2(10)); 
... 
    DBMS_OUTPUT.put_line(EMPLOYEE_NAME.MARITAL_STATUS); 
... 

あなたが使用して自動的にそれを行うことはできません%TYPEがデータ型として一致しません。フィールドのデータ型を数値にすることをOracleに明示しているので、Oracleはそのフィールドに文字列を代入することはできません。それは組み込みの関数がないということではなく、意味をなさない。

これはまた、データ型を変更している場合は、%ROWTYPEを使用できないことを意味します(変更された値を暗黙的に列データ型に戻すことができない限り)。

関連する問題