如何将表名作为参数传递给存储过程?

Asp*_*ant 1 oracle plsql stored-procedures rowtype

是否可以rowtype为表名创建一个作为参数传递给a的表名,Stored-Procedure以及如何知道在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;
Run Code Online (Sandbox Code Playgroud)

如果有可能请告诉我.

谢谢.

Jus*_*ave 6

您不能%ROWTYPE为未知表创建变量,并且在编译时不知道表名时,不能静态引用列名.

您可以使用dbms_sql包来处理完全动态的SQL语句.您需要准备SQL语句,描述列以查找列数及其数据类型,绑定适当的变量,然后获取数据.编写代码的方式比您发布的示例要麻烦得多,但它为您提供了极大的灵活性.

在我链接的文档中有许多使用dbms_sql包的示例.您可能还想查看Tom Kyte的dump_csv函数,该函数使用任意查询的结果将其写入CSV文件UTL_FILE.如果你真的想要写入数据DBMS_OUTPUT,你可以简单地UTL_FILEDBMS_OUTPUT.但是我很确定你想做一些比将数据写入DBMS_OUTPUT缓冲区更有用的东西,所以汤姆的程序可能更接近你真正想要完成的事情.