我有一个问题:
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中的函数和存储过程有什么不同?在这种情况下,使用哪个更好?都会非常感谢你的帮助。
发布于 2018-04-10 15:41:32
我认为这里不需要子查询:只需连接表名和列名的两个视图即可。这使得查询很容易参数化,因为您只需要填充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。但如果你坚持惯例,你就会好起来的。
https://stackoverflow.com/questions/49741826
复制相似问题