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;可是编译也无法通过
请指教
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;可是编译也无法通过
请指教
解决方案 »
- oracle 追查某表的数据是从哪程序插入的
- Oracle连接与游标问题
- oracle导入问题,请各位帮忙!
- 高分-请高手指点:如何动态检测远程数据库是否连接问题(急!急!急!)
- 从数据库中读取日期类型数据的问题
- 两个问题向前辈请教。1、如何禁用操作系统认证? 2、使用connect /as sysdba命令的操作系统账号是否必须在database 中创建?
- sql和oracle如何公用一个存储过程?
- 哪里可以找到Oracle Portal 的学习资料啊,十分火急,100分回报
- 文件重写——急需答案
- oracle语言翻译
- 关于webservice发布与oracle9i冲突的问题
- plsql中数据表作为参数进入存储过程?
这种情况你需要的是存储过程包。
(
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;
你研究研究吧
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;试一下 谢谢
表:emp
更新字段名:YGSPECITY
新的赋值:很好条件: YGEDUCATION=大学在执行函数时,如果这样写,提示 第一行 参数个数 或类型不对究竟应该怎样调用呢?
declare
execNum number;
begin
CHG_TBL_VALUE('emp','YGSPECITY','很好','YGEDUCATION=大学',execNum);
dbms_output.put_line('执行了'||execNum||'行');
end;
首先把传入的参数传进去,再定义变量接收传出的参数