如何将表名作为参数传递给存储过程?
Posted
技术标签:
【中文标题】如何将表名作为参数传递给存储过程?【英文标题】:how to pass a table name as parameter to stored procedure? 【发布时间】:2012-08-09 21:14:15 【问题描述】:是否可以为作为参数传递给Stored-Procedure
的表名创建rowtype
,以及我如何知道在DBMS_OUUTPUT.PUT_LINE()
语句中寻址它们的列。
最终用户可以给出任何用户名(模式)和表名
我想做如下的事情,但它不起作用。
CREATE OR REPLACE PROCEDURE SP_PASS(USER_NAME VARCHAR2,TAB_NAME IN VARCHAR2)
AS
TYPE REF_CUR IS REF CURSOR;
V_ARR REF_CUR;
V_SQL VARCHAR(200);
V_ROWTYPE USER_NAME.TAB_NAME%ROWTYPE;
BEGIN
V_SQL := 'SELECT * FROM '||USER_NAME||'.'||TAB_NAME;
OPEN V_ARR FOR V_SQL;
LOOP
FETCH V_ARR INTO V_ROWTYPE;
EXIT WHEN V_ARR%NOT FOUND;
DBMS_OUTPUT.PUT_LINE(V_ROWTYPE.COL1||','||V_ROWTYPE.COL2||','||V_ROWTYPE.COL3);
END LOOP;
CLOSE V_ARR;
END;
如果可能,请告诉我。
谢谢。
【问题讨论】:
【参考方案1】:不能为未知表创建%ROWTYPE
变量,并且在编译时不知道表名时不能静态引用列名。
您可以使用dbms_sql package 来处理完全动态的SQL 语句。您需要准备 SQL 语句,描述列以找出列数及其数据类型,绑定适当的变量,然后获取数据。与您发布的示例相比,这是一种更繁琐的代码编写方式,但它为您提供了极大的灵活性。
在我链接到的文档中有许多使用 dbms_sql 包的示例。您可能还想查看 Tom Kyte 的 dump_csv function,它使用 UTL_FILE
将任意查询的结果写入 CSV 文件。如果您真的想将数据写入DBMS_OUTPUT
,您可以简单地将UTL_FILE
调用替换为DBMS_OUTPUT
。但我很确定你想做一些比仅仅将数据写入DBMS_OUTPUT
缓冲区更有用的事情,所以汤姆的过程可能更接近你真正想要完成的事情。
【讨论】:
以上是关于如何将表名作为参数传递给存储过程?的主要内容,如果未能解决你的问题,请参考以下文章
在 azure synapse 存储过程中将表名作为参数传递时将查询结果分配给变量