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

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;
/


请问大神高手有遇到此需求没有?
...全文
313 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
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的值吗? 你需要的结果数据是什么? 文字表达的有问题。

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧