是否可以为表名创建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;
请告诉我是否有可能。
感谢。
答案 0 :(得分: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
缓冲区更有用的东西,这样汤姆的程序可能更接近你真正想要完成的事情。