2012-08-09 156 views
1

是否可以创建一个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; 

让我知道是否有可能。

谢谢。

回答

6

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

您可以使用dbms_sql package来处理完全动态的SQL语句。您需要准备SQL语句,描述列以找出列数及其数据类型,绑定适当的变量,然后获取数据。这是一种比你发布的例子更麻烦的编写代码的方式,但它给了你极大的灵活性。

在链接到的文档中有很多使用dbms_sql软件包的例子。您可能还想查看Tom Kyte的dump_csv function,它使用UTL_FILE将任意查询的结果写入CSV文件。如果您确实想要将数据写入DBMS_OUTPUT,则可以简单地将UTL_FILE呼叫替换为DBMS_OUTPUT。但是我确定你想要做一些比将数据写入DBMS_OUTPUT缓冲区更有用的东西,所以Tom的过程可能更接近你真正想要完成的任务。

相关问题