1

これが私のシナリオです: 私は、1 つの属性 (給与) だけを考慮する必要があるテーブル Employees を持っています。他のすべての属性は、演習を行うために必要ありません。別のテーブル (least_earners) を作成し、このテーブル内に (ユーザーから入力された) 従業員の最後の n 人を挿入する必要があります。

私はこれを行いましたが、大丈夫かどうか、または間違いを犯したかどうかを知りたいです (私は Oracle DB と PL/SQL を使用しています)。オブジェクトの前に作成せずにテーブルを作成することは可能ですか? SQL での通常の作成と同じように機能しますか?

DECLARE
 bottom_n_salaries 
   NUMBER := &bottom_salaries;
 CURSOR emp_cursor IS
   SELECT DISTINCT salary 
   FROM employees
   ORDER BY salary ASC;
 CREATE TYPE least_earners_obj 
   AS OBJECT (salary NUMBER(8));
 CREATE TYPE least_earners 
   AS TABLE OF least_earners_obj;
BEGIN
 OPEN emp_cursor;
   LOOP
     INSERT INTO least_earners 
     VALUE(FETCH emp_cursor);
   EXIT WHEN emp_cursor%ROWCOUNT >bottom_n_salaries
   OR emp_cursor%NOTFOUND;
   END LOOP;
 CLOSE emp_cursor;
END;
4

1 に答える 1

0

これを行うために PL/SQL は必要ありませんが、使用することはできます。使用できますCREATE table AS ...

CREATE TABLE least_earners AS
  SELECT sal FROM (
    SELECT sal
    FROM employees
    ORDER BY sal)
  WHERE ROWNUM <= &bottom_salaries

または、テーブルが既に存在する場合は、次を使用できますINSERT INTO table SELECT ...

INSERT INTO least_earners (sal)
  SELECT sal FROM (
    SELECT sal
    FROM employees
    ORDER BY sal)
  WHERE ROWNUM <= &bottom_salaries

割り当てに PL/SQL が必要な場合、上記のコードにいくつかのエラーがあります (補遺: これは INSERT ... FETCH に基づいていますが、間違っている可能性があります)。オブジェクトを使用するために必要です。


カーソルを使用した補遺PL/SQL は要件であるため、それに応じて回答を調整します...

最初にいくつかのポイント:

  • 有効な構文だとは思いませんINSERT INTO least_earners VALUE(FETCH emp_cursor)が、テストできる場所にいません。以下の例では使用していません。

  • 他のテーブルに挿入し、%NOTFOUND 後で確認しています。前にそれをする必要があります。

全体的にはこのようなことができるはずですが、上で述べたように、私はそれをテストできる場所にいません。微調整が必​​要な場合があります。

DECLARE
 bottom_n_salaries NUMBER := &bottom_salaries;
 thisSalary NUMBER;
 CURSOR emp_cursor IS
   SELECT DISTINCT salary 
   FROM employees
   ORDER BY salary ASC;
BEGIN
 OPEN emp_cursor;
   LOOP
     FETCH emp_cursor INTO thisSalary;
     EXIT WHEN emp_cursor%ROWCOUNT > bottom_n_salaries
            OR emp_cursor%NOTFOUND;
     INSERT INTO least_earners VALUES (thisSalary);
   END LOOP;
 CLOSE emp_cursor;
END;

移動するEXIT WHENと「最低給与」のロジックが台無しになる場合は、次の 2 つの方法をEXIT試すことができます。

     ...
     EXIT WHEN emp_cursor%NOTFOUND;
     INSERT INTO least_earners VALUES (thisSalary);
     EXIT WHEN emp_cursor%ROWCOUNT > bottom_n_salaries;
     ...
于 2013-05-10T17:29:07.457 に答える