1

是否可以为rowtype作为参数传递给 a 的表名创建 aStored-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;

让我知道是否可能。

谢谢。

4

1 回答 1

6

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

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

在我链接到的文档中有许多使用 dbms_sql 包的示例。您可能还想查看 Tom Kyte 的dump_csv 函数,该函数使用UTL_FILE. 如果您真的想将数据写入DBMS_OUTPUT,您可以简单地将UTL_FILE调用替换为DBMS_OUTPUT。但我很确定您想做一些比将数据写入DBMS_OUTPUT缓冲区更有用的事情,因此 Tom 的过程可能更接近您真正想要完成的事情。

于 2012-08-09T21:23:16.667 回答