函数是命名了的、存储在数据库中的PL/SQL程序块。函数接受零个或多个输入参数,有一个返回值,返回值的数据类型在创建函数时定义。定义函数的语法如下:
parameter(参数)FUNCTION name [{parameter[,parameter,...])] RETURN datatypes IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers]
END [name] 这个是教程上说的,不是很懂,能不能解释一下红色标记部分的符号,顺便给个例子,谢谢了!
看这个教程,好像可以传递多个参数阿,只要参数类型一样就行了阿?

解决方案 »

  1.   

    举例
    create or replace function a(arg1 in number,arg2 in number) return number is
    begin
      return(arg1+arg2);
    end a;1、datatypes  是数据类型  number,varchar等都是数据类型。
    2、参数的个数与类型是自定义的
      

  2.   

    实际的例子,计算两个数字的平方和:CREATE OR REPLACE FUNCTION get_sum_sqrt(p1 NUMBER, p2 NUMBER) RETURN NUMBER IS
    BEGIN
      RETURN power(p1,2)+power(p2,2);
    END;
    /select get_sum_sqrt(1,4) from dual;另外一个例子,从emp表中利用empno取得工资额
    CREATE OR REPLACE FUNCTION get_sal(p_empno NUMBER) RETURN NUMBER IS
      v_sal NUMBER(4);
    BEGIN
      SELECT sal
        INTO v_sal
        FROM emp
       WHERE empno = p_empno;
      RETURN v_sal;
    EXCEPTION WHEN NO_DATA_FOUND THEN    --没有p_empno对应的人,则返回0
      RETURN 0;
    WHEN OTHERS THEN           --出现其他异常,返回-1
      RETURN -1;
    END;
    /
      

  3.   

    create or replace function get_name (id in varchars(10))
    return varchars(10)
    is
    gname varchar(10);
    begin 
    select name in to gname from test
    where id=id;
    return name;
    endselect get_name(id) from dual
      

  4.   

    create or replace function get_name (id in varchars(10))
    return varchars(10)
    is
    gname varchar(10);
    begin 
    select name into gname from test
    where id=id;
    return gname;
    endselect get_name(id) from dual
      

  5.   

    CREATE OR REPLACE FUNCTION is_number (parmin VARCHAR2)
      RETURN BOOLEAN
     IS
        val NUMBER;
     BEGIN
          val := TO_NUMBER (NVL (parmin, 'a'));
     RETURN TRUE;
     EXCEPTION
     WHEN OTHERS
     THEN
      RETURN FALSE;
     END;
    利用系统函数TO_NUMBER定义判断字符对象是否可转为数值型的函数 EXCEPTION定义了异常,返回假。
      

  6.   

    按照大侠们给的例子,改了一下还是不行阿,帮忙看下把:
    FUNCTION GET_MODULE_AVERAGE 出现错误:LINE/COL  ERROR
    2/36  PLS-00103: 出现符号 ")"在需要下列之一时: := . ) , @ % default character 符号 ")在 ")" 继续之前已插入。 

    create or replace function get_module_average (
    cwMarkavg number ,ExMarkavg number)
    return number is v_sal number(4);
    begin
    select module.avg(cw),module.avg(exam)
    into v_sal
    from registration
    where module.avg(cw)=cwMarkavg
    and module.avg(exam)=ExMarkavg
    and m.moduletitle='Introduction to Painting'
    and r.semester='1'
    and r.year='05';
    return v_sal;
    exception when no_data_found then
      return 0;
    when others then
      return -1;
    end;
      

  7.   

    parameter可以是多个,也可以是不同的类型的啊,datatypes 是返回值的类型,举例如下:
    CREATE OR REPLACE FUNCTION FUN_IS_NULL(STRVALUE IN STRING) RETURN STRING IS
      RESULT STRING(1);
    BEGIN
      IF STRVALUE IS NULL THEN
        RESULT := 'Y';
      ELSE
        RESULT := 'N';
      END IF;
      RETURN(RESULT);
    END FUN_IS_NULL;
    以上例子是判断是不是空,如果是空,则返回Y,否则返回N,这里只是据个例子,oracle是自带一个nvl函数的
      

  8.   

    select module.avg(cw),module.avg(exam) 
    into v_sal 
    from registration 
    where module.avg(cw)=cwMarkavg 
    and module.avg(exam)=ExMarkavg 
    and m.moduletitle='Introduction to Painting' 
    and r.semester='1' 
    and r.year='05'; 你select两个字段,返回进一个变量
      

  9.   

    楼上的大侠请赐教,输出是一个结果,但是要靠从cwMarkavg number ,ExMarkavg number两个值中计算出这个结果,然后返回
    计算方程是v_sal=cwMarkavg/(cwWeight*0.01)+ExMarkavg/(ExamWeight*0.01)
      

  10.   

    function函数只能返回一个变量阿,没办法..
      

  11.   

    改了还是不行..
    FUNCTION GET_MODULE_AVERAGE 出现错误:LINE/COL  ERROR
    2/15  PLS-00103: 出现符号 ")"在需要下列之一时: := . ) , @ % default character 符号 ")在 ")" 继续之前已插入。 
    create or replace function get_module_average (
    avgttl number)
    return number is v_sal number(4);
    begin
    select a.avgcw*b.cwweight*0.01 + a.avgexam*b.examweight*0.01 avgttl
      from (select year,
                   semester,
                   moduleid,
                   avg(cw) avgcw,
                   avg(exam) avgexam
              from Registration
             group by year, semester, moduleid) a,
           module b
     where a.moduleid = b.moduleid
    and b.moduletitle='Introduction to Painting'
    and a.semester='1'
    and a.year='05';
    return v_sal;
    exception when no_data_found then
      return 0;
    when others then
      return -1;
    end;