2
CREATE OR REPLACE FUNCTION layer2layerAttribute RETURN VARCHAR2 AS
/**
 * This function properly joins all layers to their appropriate fields
 */
  cursor PLACES is select * from layer l where l.layer_name like '%place%';
BEGIN
  FOR place IN PLACES
  LOOP
     Insert all
      into LAYER_JOIN_LAYER_ATTRIBUTE (ID_LAYER, ID_LAYER_ATTRIBUTE) 
        values (place.id_layer, select id_layer_attribute from layer_attribute where name_attribute = 'filter.street')
      into LAYER_JOIN_LAYER_ATTRIBUTE (ID_LAYER, ID_LAYER_ATTRIBUTE) 
        values (place.id_layer, select id_layer_attribute from layer_attribute where name_attribute = 'filter.city')
      into LAYER_JOIN_LAYER_ATTRIBUTE (ID_LAYER, ID_LAYER_ATTRIBUTE) 
        values (place.id_layer, select id_layer_attribute from layer_attribute where name_attribute = 'filter.state')
      into LAYER_JOIN_LAYER_ATTRIBUTE (ID_LAYER, ID_LAYER_ATTRIBUTE) 
        values (place.id_layer, select id_layer_attribute from layer_attribute where name_attribute = 'filter.zip')
      into LAYER_JOIN_LAYER_ATTRIBUTE (ID_LAYER, ID_LAYER_ATTRIBUTE) 
        values (place.id_layer, select id_layer_attribute from layer_attribute where name_attribute = 'filter.country')
      select * from dual;
  END LOOP;
  RETURN null;
END layer2layerAttribute;
4

1 に答える 1

3

できますが、 a を句のselect内部で使用したり、 for each 句のvalues代わりに使用したりすることはできません。値または単一のサブクエリを使用できます。(構文図を参照してください)。select fromの代わりにサブクエリとしてselect from を使用するのではなく、カーソルを使用している理由もわかりません。valuesintolayerdual

ただし、単一の挿入でこれを行うことができ、同時に明示カーソルをスキップできます。プロシージャ内 (何も返す必要がなく、関数は通常、データを更新できる場合は使用されないため、関数ではなく) 必要に応じて:

CREATE OR REPLACE PROCEDURE layer2layerAttribute AS
BEGIN
    insert into layer_join_layer_attribute (id_layer, id_layer_attribute)
    select l.id_layer, la.id_layer_attribute
    from layer l
    cross join layer_attribute la
    where l.layer_name like '%place%'
    and la.name_attribute in ('filter.street', 'filter.city', 'filter.state',
        'filter.zip', 'filter.country');
END layer2layerAttribute;

これは、新しいテーブルにデータを入力する 1 回限りのタスクのように見えますが、単純な SQL ステートメントとして実行できる場合があります。1 回限りではない場合は、チェックして除外しない限り、2 回目の実行で重複が発生します。

于 2012-06-14T17:56:45.580 に答える