输出注释列而不是列名

时间:2013-03-16 16:30:10

标签: sql oracle plsql

我在 all_col_comments 表格中对此表格的列进行了表格和评论。我怎样才能在表格中输出列名称来输出select query中all_col_comments的列注释?

示例:

SELECT column1 AS 'comment for column1 from all_col_comments table'
     , column2 AS 'comment for column2 from all_col_comments table',
  FROM my_table;

问题V2 我想做什么

SQL> create table myTable(
  2    id           NUMBER(2),
  3    value        NUMBER(6,2)
  4  )
  5  /
Table created.

SQL>
SQL> -- prepare data
SQL> insert into myTable(ID,  value)values (1,9)
  2  /

1 row created.

SQL> insert into myTable(ID,  value)values (2,2.11)
  2  /

1 row created.

SQL>
SQL> select * from myTable
  2  /

        ID      VALUE
---------- ----------
         1          9
         2       2.11

2 rows selected.

SQL>
SQL> COMMENT ON COLUMN myTable.id IS
  2  'id stores the id';

Comment created.

SQL> COMMENT ON COLUMN myTable.value IS
  2  'value stores the some comment for value';

Comment created.

然后我需要做一些选择并得到这个

SQL>
SQL> select ??? ...

id stores the id      value stores the some comment for value
      ----------                                   ----------
               1                                            9
               2                                         2.11

    2 rows selected.

3 个答案:

答案 0 :(得分:2)

我认为没有任何方法可以在没有动态SQL的情况下执行您的要求。无法对列别名(AS之后的位)进行参数化,因此您必须使用串联来构建SQL字符串。

在使用串联构建SQL字符串时,您需要考虑如何减少SQL注入。 (风险很低;如果您有权更改数据库表上的注释,则您可能已获得足够的权限直接访问数据库,而无需构建适当的恶意列注释。)至少,您的SQL字符串需要包含"个字符的列别名(而不是问题中的'),并且在将列注释连接到SQL字符串之前,您必须验证注释不包含{ {1}}角色。

编辑:从您的评论中看来,您似乎正在使用Perl与数据库通信。以下是未经测试的草图,希望显示构建SQL字符串的方法。我会留给你填补空白:

"

请注意,您需要两次查询数据库:一次获取列注释,一次获取实际数据。

答案 1 :(得分:0)

You can get the comments on your columns using user_col_comments

SELECT *
FROM user_col_comments
WHERE table_name = 'MYTABLE';

答案 2 :(得分:-1)

使用动态查询(未测试):

begin
 s := ' select ';
 for i in ( select column_name, column_comment from user_tables where table_name = 'MyTable' )
 loop
  s := i.column_name ||' AS ' ||'"'|| i.column_comment || '", '; 
 end loop;
s := s || ' from ' || 'MyTable';

dbms_output.put_line( 'SQL: ' || s ); -- SHOW
execute immediate ... -- execute
end;
/