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;
質問する
3913 次
1 に答える
3
できますが、 a を句のselect
内部で使用したり、 for each 句のvalues
代わりに使用したりすることはできません。値または単一のサブクエリを使用できます。(構文図を参照してください)。select fromの代わりにサブクエリとしてselect from を使用するのではなく、カーソルを使用している理由もわかりません。values
into
layer
dual
ただし、単一の挿入でこれを行うことができ、同時に明示カーソルをスキップできます。プロシージャ内 (何も返す必要がなく、関数は通常、データを更新できる場合は使用されないため、関数ではなく) 必要に応じて:
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 に答える