我在 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.
答案 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;
/