2012年4月10日火曜日

ETLロジックの定義


Oracle Warehouse Builderでデータ・オブジェクトの定義を作成およびインポートした後は、データをソースからターゲットに移動する抽出、変換およびロード(ETL)の各操作を設計できます。Oracle Warehouse Builderでは、マッピングを使用してこれらの操作を設計します。

この項では、マッピングの作成、編集および使用方法に関する次のトピックについて説明します。

マッピングおよび演算子について

マッピングとはデータをソースから抽出し、変換してターゲットにロードする一連の操作を表します。これによりデータ・フローおよびデータで実行される操作がビジュアル表示されます。マッピングをOracle Warehouse Builderで設計する場合は、マッピング・エディタ・インタフェースを使用します。

マッピングの基本となる設計要素は演算子です。演算子を使用して、データ・フローでソースおよびターゲットを表現します。また、演算子を使用して、ソースからターゲットへのデータの変換方法を定義することもできます。ソースとして選択する演算子は、マッピングの設計方法に影響を与えます。Oracle Warehouse Builderでは、選択された演算子に基づいて、次のいずれかのマッピング生成言語にマッピングが割り当てられます。

各コード言語では、マッピングを設計する際、特定のルールに従う必要があります。

このガイドでは、PL/SQLマッピングを定義する方法を説明します。他のタイプのマッピングを定義するには、『Oracle Warehouse Builderユーザーズ・ガイド』を参照してください。PL/SQLマッピングを定義する基本ルールは、PL/SQLマッピングには、フラット・ファイル演算子またはSAP/R3ソース以外のすべてのタイプのソース演算子を含めることができることです。

マッピングを定義する手順

マッピングを定義する場合に参照する項
  1. マッピングの作成
  2. 演算子の追加
  3. 演算子の編集
  4. 演算子の接続
  5. マッピング・プロパティの設定
  6. 演算子、グループおよび属性プロパティの設定
  7. Oracle Warehouse Builderのオンライン・ヘルプマッピング構成のリファレンス
  8. マッピング・デザインに問題がない場合、ツールバーの「生成」アイコンを選択してコードを生成します。
後続の手順

マッピングを設計してマッピングのコードを生成した後、プロセス・フローを作成するか、直接配布を続行して実行できます。

プロセス・フローを使用して、マッピングを相互に関連付けます。たとえば、あるマッピングが完了すると電子メール通知がトリガーされて別のマッピングが起動するように、プロセス・フローを設計できます。

マッピングおよび作成した関連するプロセス・フローを配布し、マッピングを実行します。

マッピングの作成

マッピングを作成する手順
  1. プロジェクト・エクスプローラの「マッピング」ノードにナビゲートします。このノードは、ウェアハウス・ターゲット・モジュールの下、「データベース」フォルダの下の「Oracle」フォルダにあります。

    図5-1「プロジェクト・エクスプローラの「マッピング」ノード」に、MAP1というマップが格納されている「マッピング」ノードを示します。この例では、ウェアハウス・ターゲットの名前はORCL_MODです。

    図5-1    プロジェクト・エクスプローラの「マッピング」ノード


    画像の説明

  2. 「マッピング」を右クリックして「新規」を選択します。

    「マッピングの作成」ダイアログ・ボックスが表示されます。

  3. 新しいマッピングの名前と説明(オプション)を入力します。

    マッピング名の指定と説明の記述に関するルールを表示するには、「ヘルプ」を選択します。

  4. 「OK」をクリックします。

    マッピングの定義が保存され、その名前がプロジェクト・エクスプローラ内に挿入されます。また、そのマッピングのマッピング・エディタが表示され、タイトル・バーにマッピングの名前が表示されます。

以前に作成したマッピングを開く手順
  1. プロジェクト・エクスプローラでウェアハウス・ターゲット・モジュールを「データベース」フォルダに指定して、次に「Oracleデータベース」フォルダに指定します。
  2. 「マッピング」ノードを開きます。
  3. 次のいずれかの方法で、マッピング・エディタを開きます。
    • マッピングをダブルクリックします。
    • マッピングを選択し、「編集」メニューから「エディタを開く」を選択します。
    • マッピングを選択し、[Ctrl]キーを押しながら[O]キーを押します。
    • マッピングを右クリックし、「エディタを開く」を選択します。

    Oracle Warehouse Builderによって、マッピング・エディタが表示されます。

演算子のタイプ

マッピングを設計するときは、マッピング・エディタ・パレットから演算子を選択し、キャンバスにドラッグできます。


鉛筆は何ですか?
  • Oracleソース/ターゲット演算子: これらの演算子を使用して、Oracle表、ビュー、マテリアライズド・ビューなどのOracle Databaseオブジェクトを示します。
  • リモートおよびOracle以外のソース演算子とターゲット演算子: これらの演算子の使用には、特別な要件があります。
  • データ・フロー演算子: データ・フロー演算子を使用して、データを変換します。
  • 事前/事後処理演算子: マッピングの実行前または後に処理を実行するには、事前/事後処理演算子を使用します。マッピングに対する値を指定するには、マッピング・パラメータ演算子を使用します。
  • プラッガブル・マッピング演算子: プラッガブル・マッピング演算子は、マッピング演算子の再利用可能なグループで、単一の演算子として機能します。

演算子の追加

演算子をマッピングに追加する手順は、選択する演算子のタイプによって異なります。これは、一部の演算子はワークスペース・オブジェクトにバインドされ、その他の演算子はバインドされないためです。一般的に、データ・ソースまたはターゲット演算子を追加すると、Oracle Warehouse Builderによって、Oracle Warehouse Builderワークスペースのそのオブジェクトのバージョンと、マッピング・エディタ用の個別のバージョンが維持されます。たとえば、表演算子をマッピングに追加した場合は、Oracle Warehouse Builderによってその表のコピーがワークスペースで維持されます。個々のバージョンは、1つにバインドされます。つまり、マッピングのバージョンがワークスペースのバージョンにバインドされます。

2つのバージョンを区別するために、この項では、ワークスペース内のオブジェクトを総称的にワークスペース・オブジェクトと呼び、具体的には、ワークスペース表、ワークスペース・ビューのように表現します。また、マッピングの演算子は表演算子、ビュー演算子のように表現します。したがって、ディメンションをマッピングに追加する場合、マッピングのディメンションはディメンション演算子、ワークスペースのディメンションはワークスペース・ディメンションと表されます。

Oracle Warehouse Builderでは、ユーザーがこれらのオブジェクトの変更定義を同期化できるように、一部の演算子に個別のワークスペース・オブジェクトが保持されます。たとえば、ワークスペース表の新規メタデータ定義を再インポートした場合は、これらの変更内容をマッピングの表演算子に伝播する必要があります。反対に、マッピングの表演算子を変更した場合は、これらの変更内容を関連するワークスペース表に伝播する必要があります。これらのタスクは、同期化と呼ばれるプロセスによって実現します。Oracle Warehouse Builderでは、自動的に同期化またはマッピング・エディタから手動で同期化できます。

演算子をマッピングに追加する手順
  1. マッピング・エディタを開きます。
  2. 「マッピング」メニューから「追加」を選択し、演算子を選択します。または、ツールボックスからマッピング・エディタのキャンバスに演算子のアイコンをドラッグ・アンド・ドロップします。

    ワークスペース・オブジェクトにバインドできる演算子を選択すると、マッピング・エディタに「マッピング<演算子名>の追加」ダイアログ・ボックスが表示されます。このダイアログ・ボックスの使用方法の詳細は、「ヘルプ」を選択してください。

    ワークスペース・オブジェクトにバインドできない演算子を選択した場合は、演算子を作成するためのウィザードまたはダイアログ・ボックスが表示されます。

  3. Oracle Warehouse Builderに表示される指示に従い、「OK」をクリックします。

    マッピング・エディタでは、キャンバスに最大化された演算子が表示されます。左上の隅に演算子名が表示されます。各属性名およびデータ型を表示できます。

    演算子を最小化するには、右上隅の矢印をクリックします。マッピング・エディタのキャンバスに演算子がアイコンとして表示されます。

    図5-2    マッピング・エディタに表示された表演算子のソース


    画像の説明

ワークスペース・オブジェクトにバインドする演算子の追加

ワークスペース・オブジェクトにバインドできる演算子を追加すると、マッピング・エディタに「マッピング<演算子名>の追加」ダイアログ・ボックスが表示されます。次のオプションから1つ選択します。

バインドされていない演算子を属性なしで作成

このオプションは、マッピング・エディタを使用して、新規ステージング領域表や新規ターゲット表など、新しいワークスペース・オブジェクトを定義する場合に使用します。

「バインドされていない演算子を属性なしで作成」を選択した後、新しいオブジェクトの名前を入力します。属性のない演算子がキャンバスに表示されます。

これで、演算子の属性を追加および定義できるようになりました(「演算子の編集」を参照)。次に、ターゲット・モジュールに新規ワークスペース・オブジェクトを作成するために、演算子を右クリックして「作成とバインド」を選択します。

このオプションをマッピング設計で使用する方法の例は、「例: マッピング・エディタによるステージング領域表の作成」を参照してください。

既存のワークスペース・オブジェクトから選択してバインド

このオプションは、ワークスペース内の定義済またはインポート済のオブジェクトに基づいて、演算子を追加する場合に使用します。

接頭辞を入力してオブジェクトを検索するか、選択したモジュール内のオブジェクトの表示リストからオブジェクトを選択します。

複数のアイテムを選択するには、[Ctrl]キーを押しながら各アイテムをクリックします。連続したアイテムのグループを選択するには、選択範囲の最初のオブジェクトをクリックし、[Shift]キーを押しながら最後のオブジェクトをクリックします。


滝タルサ

演算子は、マッピングと同じモジュール内のワークスペース・オブジェクトまたは別のモジュールのワークスペース・オブジェクトに基づいて追加できます。別のモジュールのワークスペース・オブジェクトを選択すると、マッピング・エディタによってコネクタが作成されます(コネクタが存在していない場合)。このコネクタによって、マッピングのロケーションとワークスペース・オブジェクトのロケーション間のデータの移動パスが確立されます。

演算子の編集

各演算子には、エディタが関連付けられています。その演算子エディタを使用して、演算子、グループおよび属性に関する一般的な情報と構造的な情報を指定します。演算子エディタでは、グループおよび属性を追加または削除したり、名前を変更できます。演算子の名前も変更できます。

演算子の編集は、ロード・プロパティや条件付き動作の割当てとは異なります。ロード・プロパティや条件付き動作を指定するには、プロパティ・ウィンドウ(「演算子、グループおよび属性プロパティの設定」を参照)を使用します。

演算子、グループまたは属性を編集する手順
  1. マッピング・エディタのキャンバスから演算子を選択します。

    あるいは、演算子内のグループまたは属性を選択します。

  2. 選択したアイテムを右クリックし、「詳細をオープン」を選択します。

    マッピング・エディタに演算子エディタが表示され、「名前」タブ、「グループ」タブ、および各タイプの演算子のグループの「入力/出力」タブが表示されます。

    いくつかの演算子には追加のタブが含まれます。たとえば、Match Merge演算子には一致ルールおよびマージ・ルールを定義するタブが含まれます。

  3. 各タブに表示されるプロンプトに従い、「OK」をクリックして終了します。

    タブの実行方法については、「ヘルプ」を参照してください。

演算子の接続

マッピング・ソース演算子、データを変換する演算子およびターゲット演算子を選択した後は、これらの演算子を接続できます。データ・フローの接続により、ソースから演算子を通過してターゲットに至るデータ・フローの様子が視覚的に表されます。

演算子は、次のいずれかの方法で接続できます。

  • 属性の接続: 1度に個々の演算子属性を相互に接続します。
  • グループの接続: 2つのグループ間ですべての属性を接続するための条件を定義します。
  • 演算子ウィザードの使用: ピボット演算子、Name and Address演算子などの演算子は、ウィザードを使用してデータ・フロー接続を定義できます。

属性の接続

一方の演算子の単一の出力属性から、他方の演算子の単一の入力属性に線を引きます。

属性を接続する手順
  1. マウス・ボタンをクリックしたまま、ポインタを出力属性の上に置きます。
  2. 出力属性からデータのフロー先となる入力属性にマウスをドラッグします。

    マウスをドラッグするとき、接続を示す行がマッピング・エディタ・キャンバスに表示されます。

  3. 入力属性の上でマウス・ボタンを放します。
  4. ステップ1から3を繰り返し、必要なデータ・フロー接続をすべて作成します。

    図5-3に、属性が接続されたマッピングを示します。

    図5-3    マッピングで接続した演算子


    画像の説明

属性を接続するときは、次のルールに留意します。

  • 同じ入力属性には2度接続できません。
  • 同じ演算子内の属性には接続できません。
  • 入力専用の属性から接続することも、出力専用の属性に接続することもできません。
  • 確立されているカーディナリティに矛盾する方法では演算子を接続できません。かわりに、ジョイナ演算子を使用します。

グループの接続

グループを接続すると、属性が自動的にコピーされるか、詳細情報を入力するように指示されます。

演算子グループを既存の属性を持たないターゲット・グループに接続すると、属性が自動的にコピーされ、各属性が接続されます。これは、「例: マッピング・エディタによるステージング領域表の作成」に示すようなマッピングを設計する場合に便利です。

例: マッピング・エディタによるステージング領域表の作成

マッピング・エディタでバインドされていない表演算子を使用すると、ステージング領域表をすばやく作成できます。

次の手順は、既存のソース表に基づいてステージング表を作成する方法を示しています。この手順は、ビュー、マテリアライズド・ビュー、フラット・ファイルおよび変換の作成にも使用できます。

ソース表をステージング表にマップする手順
  1. マッピング・エディタで、ソース表を追加します。

    メニュー・バーから「マッピング」「追加」「データ・ソース/ターゲット」の順に選択します。「データ・ソース/ターゲット」メニューで、「表演算子」を選択します。

  2. 「表演算子の追加」ダイアログ・ボックスを使用して、マッピング内のソース表の演算子を選択およびバインドします。「表演算子の追加」ダイアログ・ボックスから、「バインドされていない演算子を属性なしで作成」を選択します。

    マッピングは、図5-4と類似していて、1つのソース表と属性のない1つのステージング領域表があります。

    図5-4    バインドされていないステージング表(属性なし)とソース表


    画像の説明


    なぜニュースに注意を払う必要があります
  3. ソース演算子のグループにマウス・ポインタを置き、マウス・ボタンを押したままにします。
  4. ステージング領域表グループまでマウスをドラッグします。

    Oracle Warehouse Builderによって、ソース属性がステージング領域表にコピーされ、2つの演算子が接続されます。

  5. マッピング・エディタでは、マッピングに追加したバインドされていない表を選択します。右クリックして「作成とバインド」を選択します。

    図5-5に示すダイアログ・ボックスが表示されます。

    図5-5    「作成とバインド」ダイアログ・ボックス


    画像の説明

  6. 「作成場所」に、表を作成するターゲット・モジュールを指定します。

    Oracle Warehouse Builderによって、指定したターゲット・モジュールに新しい表が作成されます。

マッピング・プロパティの設定

マッピング・キャンバスで空白を選択すると、エディタの左側にある「プロパティ・インスペクタ」にマッピング・プロパティが表示されます。マッピングについて次のプロパティを設定できます。

ターゲット・ロード順序

マッピングに1つのターゲットのみが含まれている場合、あるいはマッピングがSQL*LoaderまたはABAPマッピングの場合は、ターゲット・ロード順序が適用されません。デフォルトの設定を受け入れてマッピングの設計を続行してください。

複数のターゲットがあるPL/SQLマッピングを設計すると、Oracle Warehouse Builderにより、ターゲットをロードするデフォルトの順序が計算されます。ターゲット間に外部キー関連を定義すると、Oracle Warehouse Builderにより、親の次に子をロードするデフォルトの順序が作成されます。外部キー関係を作成しない場合、またはターゲット表に再帰的な関連がある場合は、Oracle Warehouse Builderにより、無作為な順序がデフォルトとして割り当てられます。

デフォルトのロード順序は、「ターゲット・ロード順序」プロパティを設定することで上書きできます。ターゲットの順序を変更する際に間違った変更を実行した場合は、「デフォルトにリセット」オプションを選択することで、デフォルトの順序に戻ります。

複数のターゲットのロード順序を指定する手順
  1. マッピング・キャンバスの空白をクリックすると、プロパティ・ウィンドウの右上隅にマッピング・プロパティが表示されます。
  2. 「ターゲットのロード順序のマップ」プロパティに進み、右側にある省略記号ボタンをクリックします。

    図5-6に示すように、Oracle Warehouse Builderによって、「ターゲット・ロード順序」ダイアログ・ボックスが表示されます。このダイアログ・ボックスでは、TARGET2ロードがTARGET1の前に表示されています。

    図5-6    「ターゲット・ロード順序」ダイアログ・ボックス


    画像の説明

  3. ロード順序を変更するには、ターゲットを選択し、右側のシャトル・ボタンを使用してリスト内でターゲットを上または下に移動します。

デフォルトにリセット

「デフォルトにリセット」ボタンは、ターゲット・ロード順序を再計算する場合に使用します。ターゲットの順序変更を誤った場合、または順序を割り当てた後に当初の順序が無効になるようなマッピングの設計変更があった場合は、再計算が必要になります。

演算子、グループおよび属性プロパティの設定

キャンバスでオブジェクトを選択すると、エディタの左側にあるプロパティ・インスペクタに、関連するプロパティが表示されます。

図5-7に、表演算子のプロパティ・インスペクタを示します。

図5-7    表演算子のプロパティ・インスペクタ


画像の説明

次のタイプのプロパティを表示および設定できます。

  • 演算子のプロパティ: 演算子全体に影響を与えるプロパティです。設定できるプロパティは演算子のタイプに依存します。
  • グループのプロパティ: これは属性のグループに影響を与えるプロパティです。ほとんどの演算子には、グループのプロパティが設定されていません。グループ・プロパティが設定される演算子の例としては、スプリッタ演算子やデュプリケータ解除演算子があります。
  • 属性のプロパティ: これはソース演算子とターゲット演算子の属性に関するプロパティです。属性のプロパティの例としては、データ型、精度、スケールがあります。

演算子とワークスペース・オブジェクトの同期化

マッピングに使用する多くの演算子に対応する定義は、Oracle Warehouse Builderワークスペースにあります。このことは、表演算子やビュー演算子など、ソース演算子とターゲット演算子に当てはまります。また、順序演算子や変換演算子など、定義が複数のマッピングにまたがって使用される他の演算子にも当てはまります。このような演算子を変更するときは、変更内容をワークスペース・オブジェクトに伝播する必要があります。

変更の伝播方向は、次の選択肢から決定できます。

ワークスペース・オブジェクトから演算子への同期化:本番環境でマッピングの使用を開始した後、ソースまたはターゲットに対してETL設計に影響する変更が行われる場合があります。通常、このような変更を管理する最善の方法は、Oracle Warehouse Builderのオンライン・ヘルプで説明されているように、Oracle Warehouse Builderの依存性マネージャを使用することです。依存性マネージャを使用すると、変更による影響が自動的に評価され、影響を受けるすべてのマッピングがまとめて同期化されます。また、「ワークスペース・オブジェクトから演算子への同期化」で説明されているように、マッピング・エディタで、オブジェクトを手動で同期化することもできます。


演算子からワークスペース・オブジェクトへの同期化: マッピングの演算子を変更する場合は、変更内容を対応するワークスペース定義に伝播させます。たとえば、インポートしてマッピングに使用したソースの場合、属性に複合物理名が付いている場合があります。

同期化がリフレッシュとは異なることに注意してください。リフレッシュ・コマンドでは、マルチユーザー環境で他のユーザーが行った変更にあわせて、確実に最新の状態が保たれます。同期化では、対応するワークスペース・オブジェクトと演算子が照合されます。

演算子の同期化

同期化する場合は、演算子を1つ選択し、指定したワークスペース・オブジェクトの定義とその演算子を同期化します。

演算子を同期化する手順
  1. マッピング・エディタのキャンバスで演算子を選択します。
  2. 「編集」メニューから、「同期化」を選択するか、演算子のヘッダーを右クリックして「同期化」を選択します。

    図5-8に示す「演算子の同期化」ダイアログ・ボックスが表示されます。

    図5-8    演算子の同期化


    画像の説明

  3. デフォルトでは、Oracle Warehouse Builderにより、選択した演算子とワークスペース内の関連するオブジェクトを同期化するためのオプションが選択されます。デフォルトを受け入れるか、リスト・ボックスから別のワークスペース・オブジェクトを選択します。

    この手順では、「ワークスペース・オブジェクトから演算子に同期」、または「演算子からワークスペース・オブジェクトに同期」のいずれかも選択します。

  4. (オプション)「拡張」をクリックして「一致方針」を設定します。

    「一致方針」の使用方法を参照するには、「ヘルプ」を選択します。

  5. 「OK」をクリックします。

ワークスペース・オブジェクトから演算子への同期化

マッピング・エディタでは、次のような理由により、ワークスペース・オブジェクトから演算子への同期化を実行できます。

ワークスペース・オブジェクトに基づく演算子の同期化

表5-1に、演算子および同期化できるワークスペース・オブジェクトのタイプを示します。

表5-1    ワークスペース・オブジェクトと同期化される演算子 
同期対象: 演算子  同期基準: ワークスペース・オブジェクトのタイプ 

キューブ演算子 

表、ビュー、マテリアライズド・ビュー、フラット・ファイル、ディメンションおよびキューブ 

ディメンション演算子 

表、外部表、ビュー、マテリアライズド・ビュー、フラット・ファイル、ディメンションおよびキューブ 

外部表演算子 

表、外部表、ビュー、マテリアライズド・ビュー、フラット・ファイル、ディメンションおよびキューブ 

フラット・ファイル演算子 

表、外部表、ビュー、マテリアライズド・ビュー、フラット・ファイル、ディメンションおよびキューブ 

キー参照演算子 

表のみ 

マテリアライズド・ビュー演算子 

表、外部表、ビュー、マテリアライズド・ビュー、ファイル、ディメンションおよびキューブ 

マッピング後プロセス演算子 

変換のみ 

マッピング前プロセス演算子 

変換のみ 

順序演算子 

順序のみ 

表演算子 

表、外部表、ビュー、マテリアライズド・ビュー、フラット・ファイル、ディメンションおよびキューブ 

変換演算子 

変換のみ 

ビュー演算子 

表、外部表、ビュー、マテリアライズド・ビュー、ファイル、ディメンションおよびキューブ 

外部表演算子から同期化するとき、Oracle Warehouse Builderは、関連付けられたフラット・ファイルではなく、ワークスペース外部表のみに基づいて演算子を更新することに注意してください。

演算子からワークスペース・オブジェクトへの同期化

マッピングの演算子を変更した場合は、それらの変更をワークスペース・オブジェクトに伝播する必要があります。同期化によって、表、ビュー、マテリアライズド・ビュー、変換およびフラット・ファイルの各演算子の変更を伝播できます。

次のような理由により、演算子からワークスペース・オブジェクトへの同期化を実行します。


  • 変更の伝播: 演算子の変更を関連するワークスペース・オブジェクトに伝播します。演算子または属性のビジネス名を変更すると、Oracle Warehouse Builderによってそのビジネス名の最初の30文字がバウンド名として伝播されます。
  • ワークスペース・オブジェクトの置換: 同期化により、既存のワークスペース・オブジェクトを置換します。

演算子からの同期化は、他の演算子とワークスペース・オブジェクトとの依存関係には影響を与えません。



These are our most popular posts:

建築 外部空間設計におけるバリア・フリー・デザイン

バリア・フリー・デザインの最も重要な課題の一つは、障害者が自由に出入りしその施設 を利用できるような建築物を設計することにある。建築物の各設計段階 ... またT字交差 する場所にすれちがうためのスペースを確保するのも一方法である。 車いすやその他の ... read more

A Design Method by Space Blocks#2

スペースブロックを立体化した人間環境系に焦点を当てた設計方法として展開するため に、その設計プロセスの簡易版が行えるベーシックスペースブロックと呼ぶ規格化した 積み木を提案する。 その有効性を探るため、学生を対象としたワークショップを開催し ... read more

インテリアコーディネーターとプランナーの違い : インテリアプランナーへの ...

インテリアスペースを設計する時、設計者は図面を描きますが、この図面には基本設計 と実施設計の2種類の設計方法があります。 まず基本設計とは、主に顧客に対して インテリア設計の内容を説明するために描かれるもので、空間の機能を決めたりする 設計 ... read more

スペースブロックハノイモデル [2] 空気の質を設計する/スペースブロック ...

... アップリンク: トップ 私の建築手法 小嶋一浩 - 場所/スピード: スペースブロック ハノイモデル [2] 空気の質を設計する/スペースブロックという方法 ... 実際につくった スペースブロックハノイモデルでは、コンピュータで空気の動きを解析して形を決めました 。 read more

0 件のコメント:

コメントを投稿