2017-01-23 59 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; 
/