错误:此SELECT语句中需要INTO子句

时间:2018-03-28 19:19:06

标签: sql oracle plsql

我尝试使用if语句基于db实例运行不同的代码,但我一直收到此错误:

  

错误报告 - ORA-06550:第9行第8列:PLS-00428:INTO子句   预期在此SELECT语句中   06550. 00000 - "行%s,列%s:\ n%s"   *原因:通常是PL / SQL编译错误。   *操作:

我试图使用系统变量确定我是否在prod,qa,dev中,然后根据我的位置运行各种语句。

这是我尝试过的:

DECLARE 
        ENV VARCHAR(256);
    BEGIN
        SELECT sys_context('USERENV','DB_NAME') AS Instance
        INTO ENV
        FROM dual;

        IF ENV = 'CSTMP' THEN
            CREATE MV_TEST_CSTMP ...;
        ELSIF ENV = 'PROD' THEN
            CREATE MV_TEST_PROD ...;
        ELSE
            CREATE MV_DEFAULT ...;
        END IF;
    END;

但我得到: PLS-00428:此SELECT语句中需要INTO子句

编辑:我也试过这个

VAR ENV VARCHAR(255);

SELECT sys_context('USERENV','DB_NAME') AS Instance
INTO ENV
FROM DUAL;

IF ENV = 'CSTMP' THEN
    execute immediate 'CREATE MATERIALIZED VIEW TEST_CSTMP
    USING INDEX 
    REFRESH 
    NEXT trunc(SYSDATE, ''hh'') + 1/24       
    FORCE 
    USING DEFAULT LOCAL ROLLBACK SEGMENT 
    ENABLE QUERY REWRITE AS 
    SELECT count(m.work_ownerid)
            FROM MV_WWORK_SHRUNK m
            WHERE WORK_STATUS = 2';

ELSIF ENV = 'PROD' THEN
    execute immediate 'CREATE MATERIALIZED VIEW PROD
    USING INDEX 
    REFRESH 
    NEXT trunc(SYSDATE, ''hh'') + 1/24       
    FORCE 
    USING DEFAULT LOCAL ROLLBACK SEGMENT 
    ENABLE QUERY REWRITE AS 
    SELECT count(m.work_ownerid)
            FROM MV_WWORK_SHRUNK m
            WHERE WORK_STATUS = 3';

ELSE
    execute immediate 'CREATE MATERIALIZED VIEW TEST_ELSE
    USING INDEX 
    REFRESH 
    NEXT trunc(SYSDATE, ''hh'') + 1/24       
    FORCE 
    USING DEFAULT LOCAL ROLLBACK SEGMENT 
    ENABLE QUERY REWRITE AS 
    SELECT count(m.work_ownerid)
            FROM MV_WWORK_SHRUNK m
            WHERE WORK_STATUS = 4';
END IF;

ORA-00933:SQL命令未正确结束 00933. 00000 - " SQL命令未正确结束"

1 个答案:

答案 0 :(得分:0)

让它像这样工作:

DECLARE 
 ENV VARCHAR(255);

BEGIN

    SELECT sys_context('USERENV','DB_NAME') AS Instance
    INTO ENV
    FROM DUAL;

    IF ENV = 'CSTMP' THEN
        execute immediate 'CREATE MATERIALIZED VIEW TEST_CSTMP
        USING INDEX 
        REFRESH 
        NEXT trunc(SYSDATE, ''hh'') + 1/24       
        FORCE 
        USING DEFAULT LOCAL ROLLBACK SEGMENT 
        ENABLE QUERY REWRITE AS 
        SELECT count(m.work_ownerid)
                FROM MV_WWORK_SHRUNK m
                WHERE WORK_STATUS = 2';

    ELSIF ENV = 'PROD' THEN
        execute immediate 'CREATE MATERIALIZED VIEW PROD
        USING INDEX 
        REFRESH 
        NEXT trunc(SYSDATE, ''hh'') + 1/24       
        FORCE 
        USING DEFAULT LOCAL ROLLBACK SEGMENT 
        ENABLE QUERY REWRITE AS 
        SELECT count(m.work_ownerid)
                FROM MV_WWORK_SHRUNK m
                WHERE WORK_STATUS = 3';

    ELSE
        execute immediate 'CREATE MATERIALIZED VIEW TEST_ELSE
        USING INDEX 
        REFRESH 
        NEXT trunc(SYSDATE, ''hh'') + 1/24       
        FORCE 
        USING DEFAULT LOCAL ROLLBACK SEGMENT 
        ENABLE QUERY REWRITE AS 
        SELECT count(m.work_ownerid)
                FROM MV_WWORK_SHRUNK m
                WHERE WORK_STATUS = 4';
    END IF;
END;