请叫一个关于open 动态光标的问题

[复制链接]
查看11 | 回复8 | 2005-2-28 12:57:00 | 显示全部楼层 |阅读模式
表:
create table t2 (
id number,
name varchar2(10)
);
过程:
create OR replace procedure movesql4 (v_what varchar2) as
type t_t2 is ref cursor ;
v_cur t_t2;
ar t2%rowtype;
v_sql varchar2(100);
BEGIN
v_sql:='select :waht co from t2 ';
open v_cur for v_sql using v_what;
LOOP
FETCH v_cur INTO ar;
exit when v_cur%notfound;
dbms_output.put_line(ar.co);

END LOOP;
END;
/
我想用 movesql4('id') 先检索出所有的id,再用 movesql4('name') 检索出所有的name,但我的过程编译出错
12/1 PL/SQL: Statement ignored
12/25PLS-00302: component 'CO' must be declared

请问各位我该怎么实现这个功能

回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
你的用法好象不对
如果是游标变量的话,不能用联编变量。
如果是动态游标的话,没有代入PARSRE和BIND。
建议仔细查阅游标变量和动态游标的用法。
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
看看 ORACLE8 PL/SQL程序设计第15章动态PL/SQL
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
----------------
我从最南走到最北,又从最北走到
南,你们猜我在哪里

尚在人间
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
最初由 zl_king 发布
[B]你的用法好象不对
如果是游标变量的话,不能用联编变量。
如果是动态游标的话,没有代入PARSRE和BIND。
建议仔细查阅游标变量和动态游标的用法。 [/B]


这个是本地动态sql相当于 execute immediate v_qureyString
我也知道用dbms_sql包要变脸变量,我是从书上看到的,试试而已
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
最初由 hkwangwen 发布
[B]看看 ORACLE8 PL/SQL程序设计第15章动态PL/SQL [/B]

我的是第八章,呵呵,看样没有你的详细,可否借来看看呢?
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
好想就是不能编联列名,如果我编联变量就可以运行
create OR replace procedure movesql4 (v_being varchar2) as
type t_t2 is ref cursor ;
v_cur t_t2;
ar t2%rowtype;
v_sql varchar2(100);
BEGIN
v_sql:='update t2 set name = :being ';
--open v_cur for v_sql using v_what;
execute immediate v_sql using v_being;
/*LOOP
FETCH v_cur INTO ar;
exit when v_cur%notfound;
dbms_output.put_line(ar.co);

END LOOP;*/
END;
/
begin
movesql4('ok');
end;
/
--可以
create OR replace procedure movesql4 (v_what,v_being varchar2) as
type t_t2 is ref cursor ;
v_cur t_t2;
ar t2%rowtype;
v_sql varchar2(100);
BEGIN
v_sql:='update t2 set :what = :being ';
execute immediate v_sql using v_what,v_being;
/*LOOP
FETCH v_cur INTO ar;
exit when v_cur%notfound;
dbms_output.put_line(ar.co);

END LOOP;*/
END;
/
begin
movesql4('ok');
end;
/
--就不可以

那怎么编联列名呢?
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
create OR replace procedure movesql6 (v_what in varchar ,v_being in varchar ,v_id in number ) as
v_sql varchar2(100);
v_cur number ;
v_get integer;
BEGIN
--v_sql:='update T2 set '||v_what||' = '''||v_being||''' where id= '||v_id ;
v_sql:='update T2 set '||v_what||' = :being where id= :id ';
v_cur:=dbms_sql.open_cursor;
dbms_sql.parse(v_cur,v_sql,dbms_sql.native);
dbms_sql.bind_variable(v_cur,':being',v_being);
dbms_sql.bind_variable(v_cur,':id',v_id);
v_get:=dbms_sql.execute(v_cur);
dbms_sql.close_cursor(v_cur);
commit;
dbms_output.put_line(v_sql);
END;
/
set serveroutput on;
BEGIN
movesql3('name','ok',6);
END;

/

看样大家都很忙
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行