mytbl
id     name     cost     date1
1       李四       10      2010-9-7
2      王五        30      2009-8-7
3       周一       10       2011-01-01
4     john          20      2009-9-7对于这个表 我想做一个函数 实现 指定field 的指定条件 ,更新数据,如:
cost=10 的时间都改成  2010-01-01  或者
将2010年以前的消费 cost都改成50
等等我的想法是使用动态传条件 和 字段名  给一个函数
CREATE OR REPLACE  FUNCTION "ZZYLCDAT"."VALUE2FIELD" 
    (MYFIELDNAME IN STRING,
           MYFIELDVALUE IN STRING,
     MYCONDITION IN STRING
           )
RETURN NUMBER IS MYTOTAL NUMBER(6);
BEGIN
 SELECT COUNT(ID) INTO MYTOTAL FROM mytbl
  WHERE MYCONDITION;
 IF MYTOTAL=0 THEN
  INSERT INTO mytbl (MYFIELDNAME)
  VALUES(MYFIELDVALUE);
 ELSE
  UPDATE mytbl SET MYFILEDNAME=MYFILEDVALUE
          WHERE MYCONDITION;
  SELECT COUNT(ID) INTO MYTOTAL  FROM mytbl
  WHERE MYCONDITION;
 END IF;
 RETURN(MYTOTAL);
END;可是编译也无法通过
请指教

解决方案 »

  1.   

    函数中是不允许进行写实表操作的,比如insert, delete,或update. 编译器一扫描到这们的操作就报错。
    这种情况你需要的是存储过程包。
      

  2.   

    UPC05070000 兄,你好又是我问问题,能给个详细点的例子不?我上次的问题,也是你帮助的
      

  3.   

    CREATE OR REPLACE procedure mw_app.mwp_test
    (
      MYFIELDNAME  IN varchar2,
      MYFIELDVALUE IN varchar2,
      MYCONDITION  IN varchar2,
      MYTOTAL      out NUMBER) 
    is
      fieldvalue varchar2(100) := MYFIELDVALUE;
      fieldname  varchar2(100) := MYFIELDNAME;
      condition  varchar2(100) := MYCONDITION;
      strsql     varchar2(100);
    BEGIN
      strsql := 'SELECT COUNT(*) INTO MYTOTAL FROM mw_app.mwt_gradeinfo  WHERE ' || condition || '';
      execute immediate strsql;
      IF MYTOTAL = 0 THEN
        INSERT INTO mw_app.mwt_gradeinfo
          (stuname, subject, grade)
        VALUES
          ('宋光辉', '高数', 89);
      ELSE
        strsql :='UPDATE mw_app.mwt_gradeinfo SET subject = MYFIELDVALUE WHERE'|| condition||'';
        execute immediate strsql;
      END IF;
    END;
    你研究研究吧
      

  4.   

    CREATE OR REPLACE  PROCEDURE "ZZYLCDAT"."CHG_TBL_VALUE" (
      MYTBLNAME    IN VARCHAR2,
      MYFIELDNAME  IN varchar2,
      MYFIELDVALUE IN varchar2,
      MYCONDITION  IN varchar2,
      MYTOTAL      out NUMBER)
    is
      fieldvalue varchar2(100) := MYFIELDVALUE;
      fieldname varchar2(100) := MYFIELDNAME;
      condition varchar2(100) := MYCONDITION;
      strsql varchar2(100);
    BEGIN
      strsql := 'SELECT COUNT(*) INTO MYTOTAL FROM '|| MYTBLNAME ||'
     WHERE ' || MYCONDITION || '';
      execute immediate strsql;
      IF MYTOTAL = 0 THEN
      strsql := 'INSERT INTO '|| MYTBLNAME ||
      ' ('|| MYFIELDNAME ||')  VALUES
      ('|| MYFIELDVALUE ||')';
      execute immediate strsql;
      ELSE
      strsql :='UPDATE '|| MYTBLNAME ||
     'SET '|| MYFIELDNAME ||' =' ||MYFIELDVALUE|| ' WHERE'|| MYCONDITION ||'';
      execute immediate strsql;
      END IF;
    END;试一下   谢谢
      

  5.   

    execute  CHG_TBL_VALUE('emp','YGSPECITY','很好','YGEDUCATION=大学');这些参数要怎么写?
    表:emp
    更新字段名:YGSPECITY
    新的赋值:很好条件:  YGEDUCATION=大学在执行函数时,如果这样写,提示  第一行   参数个数 或类型不对究竟应该怎样调用呢?
      

  6.   

    在sql窗口执行这些语句
    declare
    execNum number;
    begin
    CHG_TBL_VALUE('emp','YGSPECITY','很好','YGEDUCATION=大学',execNum);
    dbms_output.put_line('执行了'||execNum||'行');
    end;
    首先把传入的参数传进去,再定义变量接收传出的参数