Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在Oracle中将表名作为参数获取?_Sql_Oracle - Fatal编程技术网

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

Sql 如何在Oracle中将表名作为参数获取?,sql,oracle,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 
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中函数和存储过程的区别是什么?在这种情况下使用什么更好?非常感谢您的帮助。

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

我在这个查询中使用了外部联接,因为根据我的经验,开发人员在编写列注释方面不是很严格;)

如果你需要把它放在一个函数中,那么它非常简单:你只需要决定你想要什么样的返回类型。该函数将被其他程序调用还是用于查询?如果只是SQL查询,可能应该编写一个视图(不带WHERE子句)

为了供程序使用,函数应该返回一个ref游标,该游标可以映射到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。但是如果你坚持惯例,你会没事的

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

我在这个查询中使用了外部联接,因为根据我的经验,开发人员在编写列注释方面不是很严格;)

如果你需要把它放在一个函数中,那么它非常简单:你只需要决定你想要什么样的返回类型。该函数将被其他程序调用还是用于查询?如果只是SQL查询,可能应该编写一个视图(不带WHERE子句)

为了供程序使用,函数应该返回一个ref游标,该游标可以映射到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。但是如果你坚持惯例,你会没事的

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