1

テーブル(ジョブテーブル)からすべての一意の業界を選択し、それをという別のテーブルに挿入するOracle用のPL?SQLステートメントを作成しようとしています。dim_industry

DECLARE
cursor industries is select unique industry from job;
ind varchar2(20);

BEGIN
  open industries;
  for counter in 1..industries%ROWCOUNT
  LOOP
    FETCH industries into ind;
    insert into dim_industry (IndustryName) values(ind);
  END LOOP;
  close industries;
END;
/

select unique industry from job

10行を選択しますが、pl-sqlを実行すると、1行が挿入されたと表示されます。また、私がするとき

select * from dim_industry

クエリでは、テーブルは空のままです。なぜこれが起こるのかについてのアイデアはありますか?

4

4 に答える 4

4

以前の回答はすべて改善であり、BULK COLLECTION は非常に便利なツールです。ただし、通常、PL/SQL を使用してデータをコピーする必要はありません。あなたの場合、 INSERT ... SELECT ステートメントを次のように使用してみてください:-

INSERT INTO dim_industry( IndustryName )
SELECT DISTINCT industry
FROM job

PL/SQL は最後の手段です。ストレートな Oracle SQL で制約解決を実装しました!

于 2013-03-17T17:19:23.927 に答える
1

ENDLOOPEND LOOP
UPDATEと書く必要があり
ますあなたが望むものを達成するために、あなたはこのように進むことができます:

    DECLARE
    cursor industries is select unique industry from job;
    ind varchar2(20);

    BEGIN
      open industries;
      LOOP
        FETCH industries into ind;
        exit when industries %notfound;
        insert into dim_industry (IndustryName) values(ind);
      END LOOP;
      close industries;
      commit;
    END;
/
于 2013-03-16T18:02:27.543 に答える
1

そのステップをスキップします:

DECLARE 
    TYPE T_IND IS TABLE of job.industry%TYPE;
    ind T_IND;
BEGIN
    SELECT UNIQUE industry BULK COLLECT INTO ind FROM job;
    FORALL i IN ind.FIRST..ind.LAST
        INSERT INTO dim_industry (IndustryName) VALUES (ind(i));
    -- don't forget to commit;
END;
/
于 2013-03-16T18:53:07.913 に答える
-1

ちょっと私はあなたがかなり長い他のルートでやっていると思います!!!この男を試してみてください

DECLARE
  CURSOR c1
  iS
    select unique industry from job;
BEGIN
  FOR i IN c1
  LOOP
    INSERT INTO dim_industry (IndustryName) VALUES
      (i.industry
      );
  END LOOP;
  commit;
END;
/

for loopカーソルに使用する場合open and closeは、暗黙的に開いて閉じることに言及する必要はありません。注:カーソルを使用してテーブルの削除操作を更新または挿入する場合は、一括操作でより良いユーザーコレクションを使用すると、これよりもはるかに高速です。

これは同じことを行う 2 番目の方法です。

DECLARE
temp HR.departments.department_name%type;
  CURSOR c1
  iS
    SELECT DISTINCT d.department_name FROM hr.departments d;
BEGIN
  open c1;
  LOOP
  fetch c1  into temp;
    INSERT INTO thiyagu.temp_dep VALUES
      (temp
      );
      dbms_output.put_line(temp);
      exit when c1%notfound;
  END LOOP;
  close c1;
  commit;
END;
/

これは 3 番目の効率的な方法です。

DECLARE

type test_type is  table of job.industry%type;

col test_type;

BEGIN
  select unique industry bulk collect into col from job;
  forall i in col.first..col.last insert into dim_industry values(col(i));
  dbms_output.put_line(sql%rowcount);
  commit;

END;
/
于 2013-03-17T05:53:19.057 に答える