2013-10-31 59 views
0

我在開發環境中執行查詢,如果在實時環境中運行該查詢,將會造成災難性後果。因此,我想確保這個查詢只能針對特定的數據庫執行。我的Oracle技能不是太熱,所以我想知道是否有人可以提供幫助?這裏是一些僞代碼,它解釋了我想要做的事情:Oracle - 有條件地執行查詢

select instance_name from v$instance; 

    if instance_name = 'this_environment' 
    then 
     update tableA 
     set column1 = 'ABC' 
    else 
    *break out of query* 

有人會知道如何去做這件事嗎? 感謝您提前提供任何幫助!

回答

1

做到這一點的最好方法就是避免讓查詢接近生產。

反正,就像鍛鍊可以這樣做:

update tableA 
    set column1 = 3 
where 'this_environment' in (select instance_name 
           from v$instance); 

您可以檢查這個代碼在這裏做你的測試上SQLFiddle。我必須在SQLFiddle上創建一個v $實例來模擬該系統視圖。

+0

類似的方式做到這一點是'CROSS JOIN V $實例其中instance_name =「RUN_IT_HERE''。 –

+0

你確定oracle在更新中喜歡交叉連接嗎?我試過在SQLFiddle中,它不適用於我 – mucio

+0

我錯過了這是更新 - 我的PL/SQL部分刷新,我用它來生成滴使用選擇交叉連接。 –

0

事情是這樣的:

DECLARE 
    CURSOR C1 
    IS 
     SELECT 
       CASE 
        WHEN INSTANCE_NAME = 'ENV_NAME' 
        THEN 
         'Y' 
        ELSE 
         'N' 
       END 
        AS FLAG,  -- You can have diff values as per env 
       CASE 
        WHEN INSTANCE_NAME = 'ENV_NAME' 
        THEN 
         'YOUR_QUERY' 
        WHEN INSTANCE_NAME = 'ELSE' 
        THEN 
         NULL 
       END 
        AS QUERY  -- You can have diff queries as per env 
     FROM 
       V$INSTANCE; 

    MY_FLAG VARCHAR2 (1); 
    MY_QUERY VARCHAR2 (2000); 
BEGIN 
    OPEN C1; 

    FETCH C1 
    INTO 
      MY_FLAG, MY_QUERY; 

    CLOSE C1; 

    IF FLAG = 'Y' 
    THEN 
     EXECUTE IMMEDIATE 'my_query'; 
    END IF; 
END;