2009-11-05 64 views
2

這裏是我的簡單的PL/SQL程序:問題簡單的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網站這個範例程序編寫這個程序:http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96624/a_samps.htm#563

編輯:

此外,當我創建程序以外的表,然後再運行該程序,我得到這個錯誤:

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」存在,所以沒有任何意義,程序中使用的所有表都存在。

+0

解決,謝謝! – 2009-11-05 11:20:17

+1

然後您應該發佈您的答案,並且請不要編輯標題以表明問題已解決。 – 2009-11-05 11:22:28

回答

0

好了,只是爲了讓你知道我是如何解決這個問題(我已經解決了它的人aswered之前)。

首先,我創建了計劃外的表用普通的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; 
/
+0

它的工作原理,但它仍然是錯誤的方法。顯式遊標是不必要的開銷,並且循環內的COMMIT語句可能導致ORA-1002異常。當你只插入兩行時,你會擺脫它,但沒有更大的卷。 – APC 2009-11-07 18:59:53

+0

APC和其他海報是正確的,不太清楚爲什麼你會使用2個這樣的遊標來完成2個插入語句。如果你仍然遵循線程理查德...什麼是錯誤的只是做:插入到ostane(SELECT typ,specifikacia_typu,spz FROM Auta WHERE substr(spz,1,2)<>'KE'AND substr(spz, 1,2)<>'KS'; ),然後重複您擁有的其他表格。任何你需要這些遊標的原因? – Twelfth 2010-10-08 14:40:09

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中「隨時」創建表,通常不是這樣做的好主意。

從你的語法問題,託尼解釋
4

除此之外,該代碼應該僅僅是直的SQL插入沒有任何遊標。如果你確實需要一個遊標,那麼在使用一個明確的遊標之前,嘗試使用一個隱式遊標。

+0

遊標在那裏用於SELECT查詢。我已經自己解決了這個問題,我發佈了工作程序。 – 2009-11-06 16:20:04