我有一个问题:
SELECT
q1.table_name,
q1.column_name,
q1.data_type,
q1.nullable,
q2.comments
FROM
(
SELECT
table_name,
column_name,
data_type,
nullable
FROM
USER_TAB_COLUMNS
WHERE TABLE_NAME = 'EMPLOYEES'
) q1
JOIN
(
SELECT
column_name,
comments
FROM
USER_COL_Comments
WHERE TABLE_NAME = 'EMPLOYEES'
) q2 ON q1.column_name = q2.column_name;
它工作正常,但我需要将我的表名作为参数。而我只是被困住了。我怎样才能做到这一点? Oracle中的函数和存储过程有什么区别?在这种情况下使用什么更好?非常感谢任何帮助。
答案 0 :(得分:2)
我认为你不需要子查询:只需加入表名和列名的两个视图。这样可以轻松地对查询进行参数化,因为您只需要填充table_name
的一个实例。
我在此查询中使用了外连接,因为根据我的经验,开发人员对编写列注释不是很严格;)
SELECT
q1.table_name,
q1.column_name,
q1.data_type,
q1.nullable,
q2.comments
FROM USER_TAB_COLUMNS q1
left outer JOIN USER_COL_Comments q2
ON q1.table_name = q2.table_name
and ON q1.column_name = q2.column_name
WHERE q1.TABLE_NAME = 'EMPLOYEES'
;
如果你需要将它放在一个函数中,那么它非常简单:你只需要决定你想要的返回类型。该函数是由其他程序调用还是在查询中使用?如果只是SQL查询,可能应该编写一个视图(没有WHERE子句)。
对于程序使用,函数应该返回一个引用游标,它可以映射到JDBC或ODBC结果集。
create or replace function get_table_details
(p_table_name in user_tables.table_name%type)
return sys_refcursor
as
rc sys_refcursor;
begin
open rc for
SELECT
q1.table_name,
q1.column_name,
q1.data_type,
q1.nullable,
q2.comments
FROM USER_TAB_COLUMNS q1
left outer JOIN USER_COL_Comments q2
ON q1.table_name = q2.table_name
and ON q1.column_name = q2.column_name
WHERE q1.TABLE_NAME = p_table_name
;
return rc;
end;
“Oracle中的函数和存储过程有什么区别?”
函数返回一些东西,而一个过程没有。惯例是函数用于只读功能,而过程用于更改数据库状态。但是,过程可以具有OUT参数,因此它们可以返回值,并且有些人不够礼貌地在函数中执行DML。但如果你坚持惯例,你会没事的。