<font color=red face=隶书> 救命! oracle8中,如何update用动态sql查询出的数据集?</font>(

  • 主题发起人 主题发起人 Walone
  • 开始时间 开始时间
W

Walone

Unregistered / Unconfirmed
GUEST, unregistred user!
<font color=red face=隶书> 救命! oracle8中,如何update用动态sql查询出的数据集?</font>(200分)<br />这两天在用动态sql写存储过程,因为,我临要在过程中建临时表。
用到cursor时有点问题。
记得静态sql中,可以在定义了cursor for update之后,
用where current of 去更新。
但是,在动态sql中,open 出来的cursor,
再在loop里,用where current of 语句,不认这样的cursor
想写成sql字符串,用dbms_sql.parse()来做,
然后把cursor变量用已打开的cursor代换
如:
v_sqlstr:='update tab_pd set hipdbh =hipdbh+1
where current of :v_cur';
dbms_sql.parse(v_cur2,v_sqlstr,dbms_sql.v7);
dbms_sql.bind_variable(v_cur2,':cur',v_cur);
其中,cursor是先用dbms_sql.open_cursor打开的,
后又用 动态sql语句做了select,

错误提示:
ORA-00936: 缺少表达式
ORA-06512: 在"SYS.DBMS_SYS_SQL", line 491
ORA-06512: 在"SYS.DBMS_SQL", line 32

不明所以,请高人指点,如何更新用动态sql查找出来的记录。

可见<a href="DispQ.asp?LID=279568">这里</a>
 
只有自发自收了。
 
update table1
set c1 = table2.c1
from table1, table2
where table1.c2 = table2.c2

MSSQL7可实现UPDATE ... FROM ...
 

1, oracle 与 mssql server 不是一回事
2, 动态sql与静态sql不是一回事
 
附加功能 将问题提前
 
这样的情况最好就是先用Query查到数据后,把数据倒到临时表中,
再Insert、Edit,在这里,我隆重推荐TClientDataSet,它除了用在三层
应用中,还有Memory Table的用途,用法跟Table一样,只是不用指定
DatabaseName和TableName,Remote Server也不要。
它可以用以下方法编辑字段(表结构),
ClientDataSet.FieldDefs.AddFieldDef;
当然还可以用以下方法编辑数据,
ClientDataSet.Append;
ClientDataSet.Edit;
ClientDataSet.Post;
用以下方法添加索引,
ClientDataSet.IndexDefs.AddIndexDef;
还可以Filter ......

就跟虚拟表一样,但它更方便,要注意:
1.用ClientDataSet.Close后 ,表结构(虚拟)被清除;
2.不要Refresh,他要Remote Server.

从此,你就可以跟什么虚拟表、内存表、中间表拜拜了。我个人认为,
做复杂报表时,它是最佳选择。
 
可以用两个TQuery来实现,一个执行查询操作,一个执行修改操作。
查询完后,作一个For循环。
{生成查询用Query的语句}
Query1.Open;
For I := 0 to Query1.RecordCount - 1 do
begin
{生成修改用Query的语句}
{绑定数据}
Query2.Execsql;
end;
 
多人接受答案了。
 
后退
顶部