如何在Oracle中将表名作为参数?

时间:2018-04-09 21:16:30

标签: sql oracle

我有一个问题:

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中的函数和存储过程有什么区别?在这种情况下使用什么更好?非常感谢任何帮助。

1 个答案:

答案 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。但如果你坚持惯例,你会没事的。