2017-01-23 58 views
0

我寫了一個函數,在這裏我刪除了一個表中的行號。我不明白的錯誤當執行函數pl/sql時出錯

DECLARE 
a integer ; 

CREATE OR REPLACE function f (j sejour.jour%type) return integer is 

n integer 

begin 

select count(*) into n from sejour where jour < j ; 

Delete Sejour where jour < j ; 

RETURN n ; 

end; 
BEGIN 
    a:= 5; 

    c := f(a); 
dbms_output.put_line(' Nombre est : ' || c); 
END; 
/

我有錯誤:

ERROR at line 4: 
ORA-06550: line 4, column 1: 
PLS-00103: Encountered the symbol "CREATE" when expecting one of the following: 
begin function pragma procedure subtype type <an identifier> 
<a double-quoted delimited-identifier> current cursor delete 
exists prior 

回答

0

DECLARE報表應關鍵字之後。

CREATE OR REPLACE function f (j sejour.jour%type) return integer is 


     DECLARE 
     a integer ,n integer 

     begin 

     select count(*) into n from sejour where jour < j ; 

     Delete Sejour where jour < j ; 

     RETURN n ; 

     end; 
     BEGIN 
      a:= 5; 

      c := f(a); 
     dbms_output.put_line(' Nombre est : ' || c); 
     END; 
+1

其實後'create'你不需要'declare'在所有 –

1

我認爲你正在尋找的東西是這樣的:

create or replace function f (in_j sejour.jour%type) 
return integer is 
    v_n integer; 
begin 
    select count(*) into v_n from sejour where jour < in_j ; 
    delete Sejour where jour < in_j ; 
    return v_n ; 
end; 
/

declare 
    v_a integer ; 
    v_c integer; 
begin 
    v_a := 5; 

    v_c := f(v_a); 
    dbms_output.put_line('Nombre est : ' || v_c); 
end; 
/

注:

  • 您需要聲明的所有變量。
  • 使用前綴,因此您可以區分表中的變量和列。
  • 如果您正在修改數據庫,我會建議使用存儲過程而不是函數。
1

實際上,還有另外一種選擇,它讓事情更接近原始努力,並且不會導致創建架構級功能。只要刪除「創建或替換」。

DECLARE 
    a INTEGER; 

    FUNCTION f (j sejour.jour%TYPE) 
     RETURN INTEGER 
    IS 
     n INTEGER; 
    BEGIN 
     SELECT COUNT (*) 
     INTO n 
     FROM sejour 
     WHERE jour < j; 

     DELETE sejour 
     WHERE jour < j; 

     RETURN n; 
    END; 
BEGIN 
    a := 5; 
    c := f (a); 
    DBMS_OUTPUT.put_line (' Nombre est : ' || c); 
END; 

請記住:「創建或替換」不是PL/SQL的一部分。這是SQL本身的DDL語法。

0

- 在PLSQL塊中執行它,即不創建模式/ SQL級別對象 - 創建或替換僅用於創建SQL對象,而不用於PLSQL obects。

DECLARE 
    a INTEGER ; 
    FUNCTION f(
     j sejour.jour%type) 
    RETURN INTEGER 
    IS 
    n INTEGER; 
    BEGIN 
    SELECT COUNT(*) INTO n FROM sejour WHERE jour < j ; 
    DELETE Sejour WHERE jour < j ; 
    RETURN n ; 
    END; 
    BEGIN 
    a := 5; 
    c := f(a); 
    dbms_output.put_line(' Nombre est : ' || c); 
    END; 
/

- 通過創建SQL級別的對象函數並在PLSQL塊中調用它的第二種方法如下所示。

CREATE OR REPLACE 
FUNCTION f(
    j sejour.jour%type) 
    RETURN INTEGER 
IS 
    n INTEGER; 
BEGIN 
    SELECT COUNT(*) INTO n FROM sejour WHERE jour < j ; 
    DELETE Sejour WHERE jour < j ; 
    RETURN n ; 
END; 
/

--Once創建呼叫PLSQL功能塊

DECLARE 
    a INTEGER ; 
BEGIN 
    a := 5; 
    c := f(a); 
    dbms_output.put_line(' Nombre est : ' || c); 
END; 
/