2017-02-15 12 views
0

我想在Oracle中創建PL/SQL程序,我此刻struggeling用下面的代碼:程序,如果(SELECT COUNT(從表列))> 0,則

CREATE OR REPLACE PROCEDURE MyProcedure(
    cName number, 
    cStatus varchar2 
) AS 
    BEGIN 
    declare recCount; 
    BEGIN 
     select count(*) 
     into recCount 
     from myTable 
     where colName=cName 
     AND colStatus=cStatus; 
    END; 
    If recCount = 0 Then 
     do something... 
    Else 
     do something else... 
    End if; 
     COMMIT; 
    END; 

基本上我想從一個表格中統計線條,然後檢查表格中是否有一定數量的線條。目前我收到PLS-00103錯誤。

我搜索了很多的解決方案,但不幸的是沒有工作。我對oracle sql比較新,所以也許我犯了一個常見的錯誤。

感謝您的時間和精力。

+2

參見[「什麼是放置通訊的效果它在DML之後?「](http://stackoverflow.com/a/41998936/1509264)關於爲什麼在程序中放置COMMIT語句的評論通常是一個壞主意。 – MT0

+0

@ MT0感謝提示 –

回答

3

你有一些問題,在您的syntax

  • DECLARE是錯誤的過程定義;例如,您可以使用DECLARE構建一個匿名塊,您需要聲明變量(DECLARE ... BEGIN ... END)或在觸發器定義中。
  • 需要指定一個類型爲變量recCount,和變量定義,然後有一個不必要BEGIN...ENDBEGIN
  • 去;這不是一個錯誤,但是這個塊在這裏是無用的;只是將異常處理添加到代碼的特定部分纔會有用

我甚至會考慮添加一些異常處理;這裏我給出一個OTHERS的示例,但是您應該更好地指定異常來處理,具體取決於您的代碼。

此外,正如在MT0評論中已經注意到的那樣,COMMIT不是一個好主意。

CREATE OR REPLACE PROCEDURE MyProcedure(cName NUMBER, cStatus VARCHAR2) AS 
    recCount        NUMBER; 
BEGIN 
    SELECT COUNT(*) 
     INTO recCount 
     FROM myTable 
    WHERE  colName = cName 
      AND colStatus = cStatus; 

    IF recCount = 0 
    THEN 
     -- your code 
    ELSE 
     -- your code 
    END IF; 

    COMMIT; 
EXCEPTION 
    WHEN OTHERS THEN 
     -- exception handling  
END; 

如果您只需要檢查是否有行存在,不管有多少行符合條件,就能避免計算所有匹配的行,加入的條件只得到一個行:

SELECT COUNT(*) 
    INTO recCount 
    FROM myTable 
WHERE  colName = cName 
     AND colStatus = cStatus 
     AND rownum = 1; 

你甚至可以用它來在過程中構建塊的例子,與異常處理(我只張貼此作爲一個例子,我不喜歡這種方法):

BEGIN  
    SELECT 1 
     INTO recCount 
     FROM myTable 
    WHERE  colName = cName 
      AND colStatus = cStatus 
      AND rownum = 1; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     recCount := 0; 
END; 
+3

請添加一個錯誤解釋(對於OP和未來訪問者的好處) - 聲明一個變量需要聲明其數據類型,而不僅僅是其名稱;關鍵字'declare'用於匿名塊,而不是命名過程等。瞭解原始嘗試的錯誤可能與如何正確使用它們一樣有幫助和啓發性。 – mathguy

+2

...並且異常處理很好,但是當其他人不應該被初學者使用時。 (實際需要的情況可能會非常少,但它們都是「高級」情況。) – mathguy

+0

我會爲查詢添加'和rownum = 1'條件,或者將其重寫爲'存在「,因爲它似乎是一個存在檢查,不需要全部計數。 –