2

type の col を選択するループの「in」句に select があるが、varchar(10)それらの値を col に挿入するループを作成するにはどうすればよいvarchar(9)でしょうか。基本的に、ある精度から別の精度に「型キャスト」しようとしています。例:

FOR V_TEN IN (SELECT THIS_IS_VARCHAR_TEN FROM TABLE WHERE SOMETHING=’VALUE’)
LOOP
                INSERT INTO OTHER_TABLE
                (THIS_IS_VARCHAR_NINE)
                VALUES
                (V_TEN);
END LOOP;

エラーは、列の型が同じではないことです。to_char()andを見てみましcast()たが、どちらも私が欲しいものではないようです。ここで精度が失われていることに気付きましたが、varchar(10)列の値が常に 9 文字になることを実際に知っているので、それで問題ありません。

4

3 に答える 3

10

SUBSTR関数を探しています。

また、これには PL/SQL を使用しないでください。単純な SQL で十分であり、高速です。

 INSERT INTO OTHER_TABLE
   SELECT OTHER_COLUMN, SUBSTR(THIS_IS_VARCHAR_TEN,1,9) 
   FROM TABLE WHERE SOMETHING=’VALUE’;

また、実際に 9 文字を超える値がない場合は、substr 関数を呼び出す必要さえありません (自動的に変換され、長すぎる場合はエラーが発生します)。

于 2010-02-01T02:50:02.613 に答える
4

varchar(10)列の値は常に9文字になることを実際に知っているからです。

それが本当なら、他の人が示唆しているように、SUBSTRを使用する必要さえありません。

エラーが発生する理由は、V_TENの値を挿入しようとしているためだと思います。のような構造を使用するとFOR x IN (SELECT ...) LOOPxレコードタイプとして暗黙的に宣言されます。あなたの場合、それはフィールドが1つしかないレコードですが、それでもスカラー型として直接使用することはできません。

挿入物の名前でレコードのフィールドを参照する必要があります。

FOR V_TEN IN (SELECT THIS_IS_VARCHAR_TEN FROM TABLE WHERE SOMETHING=’VALUE’)
LOOP
                INSERT INTO OTHER_TABLE
                (THIS_IS_VARCHAR_NINE)
                VALUES
                (V_TEN.THIS_IS_VARCHAR_TEN);
END LOOP;

いずれにせよ、Thiloが指摘したように、明示的なループでこれを行う理由はまったくありません。単一のINSERT...SELECTとして記述してください。

于 2010-02-01T13:48:15.420 に答える
1

使用する:

FOR V_TEN IN (SELECT SUBSTR(t.this_is_varchar_ten, 1, 9)
                FROM TABLE t
               WHERE t.something = 'VALUE')
LOOP

  INSERT INTO OTHER_TABLE
    (THIS_IS_VARCHAR_NINE)
  VALUES
    (V_TEN);

END LOOP;

SUBSTR関数を使用して VARCHAR(10) データをサブストリング化し、VARCHAR(9) として返されるようにします。

于 2010-02-01T02:49:35.357 に答える