如何通过一个表名作为参数传递给存储过程?(how to pass a table name as p

2019-07-30 21:10发布

是否有可能创建一个rowtype为被作为参数传递给一个表名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;

让我知道这是否是可能的。

谢谢。

Answer 1:

您不能创建一个%ROWTYPE未知表变量,你不能静态地指代列名,当你不知道在编译时表名。

您可以使用DBMS_SQL包处理完全动态的SQL语句。 你需要准备的SQL语句,表示列,找出列和数据类型的号码,绑定相应的变量,然后取数据。 这是写代码比你张贴的例子的更麻烦的方式,但它给你极大的灵活性。

有许多的我链接到文档中使用DBMS_SQL包的例子。 您可能还需要检查出汤姆凯特的dump_csv功能 ,其写入使用CSV文件中的任意查询的结果UTL_FILE 。 如果你真的想将数据写入到DBMS_OUTPUT ,你可以简单地更换UTL_FILE与调用DBMS_OUTPUT 。 但我敢肯定,你想要做的事不仅仅是将数据写入到更多有用的DBMS_OUTPUT缓冲所以汤姆的过程可能更接近你真正想完成。



文章来源: how to pass a table name as parameter to stored procedure?