执行函数pl / sql时出错

时间:2017-01-23 11:21:02

标签: sql oracle plsql

我写了一个函数,我删除了一个表中的行号。我不太明白错误

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

4 个答案:

答案 0 :(得分: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 :(得分: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语法。

答案 2 :(得分:0)

DECLARE语句应该在AS关键字之后。

    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;

答案 3 :(得分:0)

- 在PLSQL块中执行此操作,即不创建架构/ SQL级别对象 - 创建或替换仅用于创建不属于PLSQL对象的SQL对象。

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;
/

- 创建后调用PLSQL块中的函数

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