2015-08-28 70 views
-2

我需要創建一個存儲過程,至此我必須從select語句中創建一個表,我必須在其中插入參數。 這裏是我的查詢:從創建和選擇語句創建存儲過程

CREATE TABLE DBL_JW AS 
     SELECT * FROM ( 
     SELECT m.IDM, 
      m2.IDM AS dups_key 
     FROM members_tbl m 
     LEFT OUTER JOIN members_tbl m2 
     ON (m.IDM != m2.IDM 
     AND m.DBIRTH = m2.DBIRTH 
     AND utl_match.jaro_winkler_similarity(m.SNAME,m2.SNAME) > 90 
     AND utl_match.jaro_winkler_similarity(m.FNAME,m2.FNAME) > 95)) 
     Where dups_key IS NOT NULL; 

我試圖寫這個存儲過程:

CREATE OR REPLACE PROCEDURE JW_DBL_POT 
(
    P_SNAME IN NUMBER 
, P_FNAME IN NUMBER 
, P_RC OUT SYS_REFCURSOR 
) AS 
BEGIN 
    OPEN P_RC 
    EXECUTE IMMEDIATE 
     CREATE TABLE DBL_JW AS 
     SELECT * FROM ( 
     SELECT m.IDM, 
      m2.IDM AS dups_key 
     FROM members_tbl m 
     LEFT OUTER JOIN members_tbl m2 
     ON (m.IDM != m2.IDM 
     AND m.DBIRTH = m2.DBIRTH 
     AND utl_match.jaro_winkler_similarity(m.SNAME,m2.SNAME) > P_SNAME 
     AND utl_match.jaro_winkler_similarity(m.FNAME,m2.FNAME) > P_FNAME)) 
     Where dups_key IS NOT NULL; 
END JW_DBL_POT; 

我面對這樣的錯誤: - PLS-00103:出現符號「CREATE」 即使刪除了EXECUTE IMMEDIATE指令,我也有同樣的錯誤。我如何管理它? Thx

+2

您沒有將[字符串參數](http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/executeimmediate_statement.htm#CJACGJJG)傳遞給'immediate immediate'。什麼應該進入'P_RC'?爲什麼你要在運行時創建一個表;或者是在其他表中複製數據的表(然後會過時)? –

回答

0

如果你絕對不得不將這些信息存儲在一張表中,這聽起來像只是暫時需要它作爲修復數據的一部分。

而不是每次運行代碼時創建一個表,然後在完成之後刪除它(這是我假定您的計劃是針對此表的!),爲什麼不創建全局臨時表(GTT )一次,然後用它在每個會話的基礎上存儲數據 - 即。只有您的會話可以看到在該會話期間存儲在那裏的數據。

+0

嗨,感謝您的建議;我不知道。那麼我如何使用Global Temporary Table編寫? – freestyle

+0

我強烈建議你閱讀關於GTTs。 [試試這個](https://oracle-base.com/articles/misc/temporary-tables)開始。文檔中還有很多。 – Boneist