あなたが定義されているあなたのレコードタイプ:エラーを取得し
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
を使用できないことを意味します(変更された値を暗黙的に列データ型に戻すことができない限り)。
[コードとエラーを画像ではなくテキストとして投稿してください](https://meta.stackoverflow.com/questions/285551/why-not-upload-images-of-code-on-so-when-asking- a質問/ 285557#285557)。また、あなたの質問にテーブル定義を含めて、データタイプやサンプルデータを見ることができます。 –