2015-10-27 20 views
1

是否可以使用動態同義詞對存儲過程中的查詢中使用的模式和表名進行參數化?Oracle PL SQL,可行的動態同義詞(參數化模式/表名)?

我們已經嘗試是一個名稱/值對錶

  • 閱讀在運行時這些參數來確定模式(和表名)

    1. 設置參數,如目標更改基於模式在 應用
    2. 將任何現有的同義詞和重建的模式和表
    3. 引用同義詞的查詢

    我們嘗試這種方法的原因是因爲要執行的查詢是長達數百行的合併語句,不適合動態SQL。

  • +1

    這是一個棘手的問題。如果刪除同義詞,則使用同義詞的所有存儲過程都將失效。如果您尚未在當前會話中使用該過程,則不應該成爲問題。當您下次訪問它時,它將被重新編譯。如果您已經使用過,則會遇到錯誤消息。所以如果你採取額外的預防措施並正確地管理你的會話,這可能是可行的。 – Codo

    +1

    沒有理由只爲動態SQL使用簡短語句,您甚至可以使用CLOB for'EXECUTE IMMEDIATE'。使用'DBMS_SQL.VARCHAR2A',編寫大型SQL語句非常簡單。 –

    +1

    是的,你可以,但它不是易維護方面的最佳解決方案。如果你動態地創建你的語句並使用oracle內置的插件,那麼至少所有的代碼都在一個地方。通過創建同義詞,這可能會導致名稱衝突,安全問題和一個錯誤的不幸副作用導致錯誤的事情被改變 – kevinsky

    回答

    3

    也許你可以在你的程序中使用調用者權利時掩蓋你的問題。看看這個例子:

    CREATE USER SCOTT_1 IDENTIFIED BY "tiger"; 
    GRANT UNLIMITED TABLESPACE TO SCOTT_1; 
    
    CREATE USER SCOTT_2 IDENTIFIED BY "tiger"; 
    GRANT UNLIMITED TABLESPACE TO SCOTT_2; 
    
    CREATE TABLE SCOTT_1.EMP (EMP_NAME VARCHAR2(30)); 
    CREATE TABLE SCOTT_2.EMP (EMP_NAME VARCHAR2(30)); 
    
    INSERT INTO SCOTT_1.EMP VALUES ('Schema 1'); 
    INSERT INTO SCOTT_2.EMP VALUES ('Schema 2'); 
    COMMIT; 
    
    CREATE SYNONYM EMP FOR SCOTT_1.EMP; -- Just needed to compile the procedure 
    
    CREATE OR REPLACE FUNCTION GetSchema(p_schema IN VARCHAR2) RETURN VARCHAR2 
        AUTHID CURRENT_USER 
    AS 
        res VARCHAR2(30); 
    BEGIN 
        EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = ' || p_schema; 
        SELECT EMP_NAME 
        INTO res 
        FROM EMP; 
    
        -- Just switch back to own schema to avoid unexpected behaviors 
        EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = '||USER; 
    
        RETURN res; 
    END; 
    /
    
    
    SELECT GetSchema('SCOTT_1') FROM dual; 
    
    GETSCHEMA('SCOTT_1') 
    --------------------------------- 
    Schema 1 
    
    1 row selected. 
    
    
    SELECT GetSchema('SCOTT_2') FROM dual; 
    
    GETSCHEMA('SCOTT_2')   
    --------------------------------- 
    Schema 2 
    
    1 row selected.