2012-08-09 157 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的過程可能更接近你真正想要完成的任務。

相關問題