2

これが私の単純な PL/SQL プログラムです。

DECLARE

    CURSOR c1 is
        SELECT typ, specifikacia_typu, spz FROM Auta
            WHERE (substr(spz, 1, 2) = 'KE' OR substr(spz, 1, 2) = 'KS') AND ROWNUM <= 2;
    CURSOR c2 is
        SELECT typ, specifikacia_typu, spz FROM Auta
            WHERE substr(spz, 1, 2) <> 'KE' AND substr(spz, 1, 2) <> 'KS';
    my_typ CHAR(10);
    my_specifikacia_typu CHAR(15);
    my_spz CHAR(8);

BEGIN

    -- vytovirt potrebne tabulky pre kosicke a nekosicke auta
    CREATE TABLE Kosicke (
    typ CHAR(10),
    specifikacia_typu CHAR(15),
    spz CHAR(8)
    );
    CREATE TABLE Ostatne (
    typ CHAR(10),
    specifikacia_typu CHAR(15),
    spz CHAR(8)
    );

    -- prve dve auta z Kosic vlozit do tabulky Kosicke
    OPEN c1;
    FOR i IN 1..2 LOOP
        FETCH c1 INTO my_typ, my_specifikacia_typu, my_spz;
        EXIT WHEN c1%NOTFOUND;
        INSERT INTO Kosice VALUES(my_typ, my_specifikacia_typu, my_spz);
        COMMIT;
    END LOOP;
    CLOSE c1;

    -- auta, ktore nie su z Kosic vlozit do tabulky Ostatne
    OPEN c2;
    LOOP
        FETCH c2 INTO my_typ, my_specifikacia_typu, my_spz;
        EXIT WHEN c2%NOTFOUND;
        INSERT INTO Ostatne VALUES(my_typ, my_specifikacia_typu, my_spz);
        COMMIT;
    END LOOP;
    CLOSE c1;

END;
/

Oracle 10g Express Edition を実行すると、次のエラーが発生します。

ORA-06550: line 16, column 5:
PLS-00103: Encountered the symbol "CREATE" when expecting one of the following:

   begin case declare exit for goto if loop mod null pragma
   raise return select update while with 
     <<
   close current delete fetch lock insert open rollback
   savepoint set sql execute commit forall merge pipe

1. DECLARE
2.     
3.     CURSOR c1 is

どこに問題があるのか​​わからず、これが PL/SQL で作成した最初のプログラムなので、少し迷っています。このプログラムを作成するために、Oracle Web サイトのサンプル プログラムを使用しました

編集:

また、最初にプログラムの外部でテーブルを作成してからプログラムを実行すると、次のエラーが発生します。

ORA-06550: line 17, column 21:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 17, column 9:
PL/SQL: SQL Statement ignored

1. DECLARE    
2.     CURSOR c1 is
3.         SELECT typ, specifikacia_typu, spz FROM Auta

テーブル「Auta」が存在するため、これは意味がありません。プログラムで使用されるすべてのテーブルが存在します。

4

3 に答える 3

4

Tony が説明した構文の問題は別として、このコードはカーソルを使用しない単純な SQL 挿入である必要があります。本当にカーソルが必要な場合は、明示的なカーソルを使用する前に暗黙的なカーソルを使用してみてください。

于 2009-11-05T12:19:51.990 に答える
4

PL/SQL で CREATE TABLE のような DDL を直接実行することはできません。ただし、次のように動的 PL/SQL を使用して実行できます。

-- vytovirt potrebne tabulky pre kosicke a nekosicke auta
EXECUTE IMMEDIATE 'CREATE TABLE Kosicke (
typ CHAR(10),
specifikacia_typu CHAR(15),
spz CHAR(8)
)';

コンパイル時にテーブルが存在しないため、コードが無効になるため、挿入も動的にする必要があります。

EXECUTE IMMEDIATE 'INSERT INTO Ostatne VALUES(:p1, :p2, :p3)'
   USING my_typ, my_specifikacia_typu, my_spz;

ただし、なぜこれを行う必要があるのか​​ を知ることは興味深いでしょう.Oracleでは「その場で」テーブルを作成する必要はほとんどなく、一般的にはそうするのは良い考えではありません.

于 2009-11-05T11:23:57.813 に答える
0

わかりましたので、私がどのように問題を解決したかをお知らせします(誰かが答える前に、私はすでに解決しています)。

まず、通常の SQL クエリを使用して、プログラムの外部でテーブルを作成しました。

CREATE TABLE Kosicke (
typ CHAR(10),
specifikacia_typu CHAR(15),
spz CHAR(8)
);
CREATE TABLE Ostatne (
typ CHAR(10),
specifikacia_typu CHAR(15),
spz CHAR(8)
);

そして、私はこのようにプログラムを編集しました(すでに動作しています):

DECLARE

    CURSOR c1 is
        SELECT typ, specifikacia_typu, spz FROM Auta
            WHERE (substr(spz, 1, 2) = 'KE' OR substr(spz, 1, 2) = 'KS') AND ROWNUM <= 2;
    CURSOR c2 is
        SELECT typ, specifikacia_typu, spz FROM Auta
            WHERE substr(spz, 1, 2) <> 'KE' AND substr(spz, 1, 2) <> 'KS';
    my_typ CHAR(10);
    my_specifikacia_typu CHAR(15);
    my_spz CHAR(8);

BEGIN

    /* prve dve auta z Kosic vlozit do tabulky Kosicke */
    OPEN c1;
    FOR i IN 1..2 LOOP
        FETCH c1 INTO my_typ, my_specifikacia_typu, my_spz;
        EXIT WHEN c1%NOTFOUND;
        INSERT INTO Kosicke VALUES(my_typ, my_specifikacia_typu, my_spz);
        COMMIT;
    END LOOP;
    CLOSE c1;

    /* auta, ktore nie su z Kosic vlozit do tabulky Ostatne */
    OPEN c2;
    LOOP
        FETCH c2 INTO my_typ, my_specifikacia_typu, my_spz;
        EXIT WHEN c2%NOTFOUND;
        INSERT INTO Ostatne VALUES(my_typ, my_specifikacia_typu, my_spz);
        COMMIT;
    END LOOP;
    CLOSE c2;

END;
/
于 2009-11-06T15:50:24.263 に答える