2013-10-31 60 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;