Chinaunix

标题: 隐形记录 如何引用记录的值 [打印本页]

作者: llslls_007    时间: 2010-01-28 18:07
标题: 隐形记录 如何引用记录的值
1. 声明   
    record    table%rowtype;

不查表 即不知道 table的列名 , 如何输出record的值
如 record.column_name  值
作者: Minsic    时间: 2010-01-28 19:40
这个不是矛盾的么,不知道列名,你咋知道自己要取的是什么列的值啊?

如果你想知道这张表有哪些字段,可以查询user_tab_columns视图
作者: llslls_007    时间: 2010-01-28 20:26
标题: 回复 #2 Minsic 的帖子
不知道列名 如何输出记录
作者: Minsic    时间: 2010-01-29 09:20
标题: 回复 #3 llslls_007 的帖子
还是不明白你的意思。

想知道一个表有哪些字段不是有很多方法么?上面说的,查询user_tab_columns是个办法,如果用sqlplus,desc命令也可以知道大致的表结构。
作者: llslls_007    时间: 2010-01-29 09:35
标题: 回复 #4 Minsic 的帖子
不好意思 我的需求是 :
给一个table, 表名为参数 ,让它竖排显示数据
table (col1,col2,col3) :

col1   value1
col2   value2
col3   value3

由于表名是参数,因此 表中的列也是不知道的,如何实现呢?
作者: Minsic    时间: 2010-01-29 12:42
是这个意思吗?

SQL> set serveroutput on
SQL> select * from test_table;

      COL1       COL2       COL3
---------- ---------- ----------
         1          2          3

SQL> declare
  2  v_sql varchar2(100);
  3  v_col_value number;
  4  cursor col_cur is select column_name from user_tab_columns where table_name='TEST' order by column_id;
  5  begin
  6    for i in col_cur loop
  7      v_sql:='select '||i.column_name||' from test';
  8      execute immediate v_sql into v_col_value;
  9      dbms_output.put_line(i.column_name||' '||v_col_value);
10    end loop;
11  end;
12  /
COL1 1
COL2 2
COL3 3

PL/SQL procedure successfully completed.

SQL>

[ 本帖最后由 Minsic 于 2010-1-29 12:43 编辑 ]
作者: bigapple2008    时间: 2010-01-29 12:58
刚才谁在问数据字典来着,这里有个活生生的例子啊,哈哈
作者: llslls_007    时间: 2010-01-29 13:13
标题: 回复 #6 Minsic 的帖子
3qu very much
作者: llslls_007    时间: 2010-01-29 13:21
标题: 回复 #8 llslls_007 的帖子
6    for i in col_cur loop
  7      v_sql:='select '||i.column_name||' from test';


---- 一般不是 open   然后再fecth   用i引用i.column_name  这样的写法
第一次见 。 哪里有这样的说明么 ,反正谢一个


还有就是因为很多列的类型不一样,怎么考虑用一个变量输出,都转成字符串?

[ 本帖最后由 llslls_007 于 2010-1-29 13:32 编辑 ]
作者: Minsic    时间: 2010-01-29 14:15
说明没有,我只知道有这种用法

字段类型不一样,现在没想到有什么办法,可以按照你的想法来,因为dbms_output.putline本来需要字符串参数。

刚刚想到个问题,如果多行需要转成列的话,上面的那段不行,改了下:

  1. declare
  2.   v_sql varchar2(100);
  3.   v_col_value number;
  4.   cursor col_rowid is select rowid from test_table;
  5.   cursor col_cur is select column_name from user_tab_columns where table_name='TEST_TABLE' order by column_id;
  6. begin
  7.   for j in col_rowid loop
  8.     for i in col_cur loop
  9.       v_sql:='select '||i.column_name||' from test_table where rowid='''||j.rowid||'''';
  10.       execute immediate v_sql into v_col_value;
  11.       dbms_output.put_line(i.column_name||' '||v_col_value);
  12.     end loop;
  13.   end loop;
  14. end;
  15. /
复制代码

作者: bigapple2008    时间: 2010-01-29 15:01
原帖由 llslls_007 于 2010-1-29 13:21 发表
6    for i in col_cur loop
  7      v_sql:='select '||i.column_name||' from test';


---- 一般不是 open   然后再fecth   用i引用i.column_name  这样的写法
第一次见 。 哪里有这样的说明么 ,反 ...



cursor也可以不写,直接

for i in (select xxx,xxx, xxx from yyy)
作者: renxiao2003    时间: 2010-01-29 21:43
太麻烦了。在PL/SQL DEVELOPER等工具里能列出表的列名的。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2