2015-07-21 56 views
1

我想創建一個幫助器存儲過程以保存重複的代碼。PL/SQL中的ROWID作爲參數

我寫了下面的存儲過程,它採用表名,status_id和ROWID。

PROCEDURE sp_update_stage_status(p_table_name IN VARCHAR2, 
           p_status_id IN NUMBER, 
           p_rowid IN ROWID) 
AS 
BEGIN  
    execute immediate 'UPDATE ' || p_table_name 
       || ' SET STATUS_ID = ' || p_status_id 
       || ' WHERE ROWID = ' || p_rowid;  
END; 

但是,只要我執行它,我會得到以下內容。

ORA-00904: "AAATQEAAEAAAAHEAAB": invalid identifier 
ORA-06512: at "OBR_DEV.PKG_COMMON", line 32 
ORA-06512: at "OBR_DEV.PKG_DIRECTORY", line 449 

我在這裏做錯了什麼?

+0

更通用的,你應該使用'UROWID' –

回答

6

您將直接刪除rowid的內容而不引用它。

您的查詢變爲WHERE ROWID = AAATQEAAEAAAAHEAAB,它將rowid列與AAATQEAAEAAAAHEAAB列進行比較。
它應該是WHERE ROWID = 'AAATQEAAEAAAAHEAAB'。爲你的動態SQL添加一些引號,你應該沒問題。

或者更好的是,使用綁定變量,不用擔心報價:

EXECUTE IMMEDIATE 
    'UPDATE ' || p_table_name || ' SET status_id = :status WHERE rowid = :seek_rowid' 
    USING p_status_id, p_rowid; 
+0

AHHHH完美,感謝這麼多,我又喜歡PL/SQL數據類型 – greyfox

-2

您聲明p_rowidrowid類型,您必須聲明p_rowid作爲varchar2(18)

PROCEDURE sp_update_stage_status(
    p_table_name IN VARCHAR2, 
    p_status_id IN NUMBER, 
    p_rowid IN VARCHAR2(18) 
) AS 
BEGIN 
    execute immediate 'UPDATE ' || p_table_name || ' SET STATUS_ID = ' || p_status_id || ' WHERE ROWID = ' || p_rowid; 
END;