【问题标题】:How to get table name as a parameter in Oracle?如何在Oracle中获取表名作为参数?
【发布时间】:2018-04-10 18:59:06
【问题描述】:

我有一个问题:

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

【问题讨论】:

  • 如果必须对表进行参数化,您需要将查询作为动态语句执行。函数和存储过程的区别在于,函数必须使用 return 语句显式返回值,而过程则不需要。
  • 要使用的函数或存储过程取决于您的情况,具体取决于您要执行的操作。例如,如果它只是一个选择并写入日志文件,那么一个过程就可以了。如果有值要返回给调用方法,则可以使用函数。

标签: sql oracle


【解决方案1】:

我认为您在这里不需要子查询:只需将表名和列名的两个视图连接起来。这使得参数化查询变得容易,因为您只需要填充table_name 的一个实例。

我在这个查询中使用了外连接,因为根据我的经验,开发人员在编写列 cmets 方面不是很自律;)

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。但如果你坚持约定,你会没事的。

【讨论】:

  • 很好地解释了函数和存储过程之间的区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 2023-01-20
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 2015-01-29
相关资源
最近更新 更多