大神快来。游标,动态列名怎么获取值

huto2 2017-11-18 08:46:49
建表:t_test
create table t_test  (id number(9) not null, code varchar2(255));

插入值:
ID CODE
1 1001
2 2002
3 3003
写过程:
declare
begin
for c in (select t.* from t_test t) loop
dbms_output.put_line(c.id);
end loop;
end;
/

可打印出id的值:1,2,3

现问题是:我不知道列名,列名是动态的,如下过程,列名是动态赋值的(此过程是错的),我怎样才能得到c.id的值,或如果输入的列名不存在,就打印出一个null值出来。

declare
v_colname varchar2(50);
begin
v_colname := 'id';
for c in (select t.* from t_test t ) loop
dbms_output.put_line(c.v_colname);
end loop;
end;
/


请问大神高手有遇到此需求没有?
...全文
229 6 点赞 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
jdsnhan 2017-11-20
SQL> desc test2
Name Type         Nullable Default Comments 
---- ------------ -------- ------- -------- 
COL1 NUMBER       Y                         
ID   VARCHAR2(10) Y                         

SQL> select col1,id from test2;
      COL1 ID
---------- ----------
         1 a
         2 b
         3 c

SQL> exec pt('col1');
1
2
3
PL/SQL procedure successfully completed

SQL> exec pt('id');
a
b
c
PL/SQL procedure successfully completed

SQL> exec pt('name');
null
PL/SQL procedure successfully completed

SQL>
  • 打赏
  • 举报
回复
jdsnhan 2017-11-20

create or replace procedure pt(arg_colname in varchar2) is
  cnt  number;
  vsql varchar2(1000);
  res  varchar2(100);
  TYPE ref_cursor IS REF CURSOR;
  c ref_cursor;
begin
  select count(*)
    into cnt
    from user_tab_cols tc
   where upper(tc.COLUMN_NAME) = upper(arg_colname)
     and table_name = 'TEST2';
  if cnt <= 0 then
    dbms_output.put_line('null');
    return;
  end if;

  vsql := 'select ' || arg_colname || ' from test2';
  open c for vsql;
  fetch c
    into res;
  while c %FOUND LOOP
    dbms_output.put_line(res);
    fetch c
      into res;
  end loop;
  close c;
end pt;

  • 打赏
  • 举报
回复
huto2 2017-11-20
其实最后我按另一种方法 实现我的需求,原来的游标设计动态取列名的方法可能Oracle不能支持。 5楼的回答能实现我的提问,就把分给你吧! dbms_cursor 包 我后面研究一下,谢谢!!
  • 打赏
  • 举报
回复
卖水果的net 2017-11-19
前些年,也有一个网友提出过你的问题。 有一个 dbms_cursor,包,楼主研究一下。
  • 打赏
  • 举报
回复
花开了叫我 2017-11-19
User_Tab_Columns 这个视图可以获取到列名
  • 打赏
  • 举报
回复
碧水幽幽泉 2017-11-18
我怎样才能得到c.id的值 你打算打印出id的值:1,2,3,不就是c.id的值吗? 你需要的结果数据是什么? 文字表达的有问题。
  • 打赏
  • 举报
回复
相关推荐
发帖
Oracle
加入

1.6w+

社区成员

Oracle开发相关技术讨论
申请成为版主
帖子事件
创建了帖子
2017-11-18 08:46
社区公告
暂无公告