2013-05-16 116 views
1
CREATE OR REPLACE PROCEDURE ResetVersionNumberValue IS 
    sql_stmt VARCHAR2(2000); 
BEGIN 
    FOR sql_stmt IN (select 'update '|| table_name || 
          ' set version = 0' 
        from user_tables 
        where table_name like 'MY_%') 
    LOOP 
     EXECUTE IMMEDIATE sql_stmt; 
    END LOOP; 

    COMMIT; 
END; 

爲什麼about程序沒有編譯?它給錯誤說爲什麼Oracle過程不能編譯?

錯誤(8,26):PLS-00382:表達式類型不對

如何解決這個問題?

回答

3

兩件事情:

  1. 你需要記住的是,在光標迭代遊標返回的行,而不是一個值,
  2. 的SELECT需要給一個名字由遊標生成的行中的值。

嘗試:

CREATE OR REPLACE PROCEDURE ResetVersionNumberValue IS 
BEGIN 
    FOR aRow IN (select 'update '|| table_name || 
          ' set version = 0' AS SQL_STMT 
        from user_tables 
        where table_name like 'MY_%') 
    LOOP 
     EXECUTE IMMEDIATE aRow.SQL_STMT; 
    END LOOP; 

    COMMIT; 
END; 

分享和享受。

1
CREATE OR REPLACE PROCEDURE ResetVersionNumberValue IS 
BEGIN 
FOR sql_stmt IN ( 
     select 'update '|| table_name || ' set version = 0' as x 
     from user_tables 
     where table_name like 'MY_%') 
LOOP 
     EXECUTE IMMEDIATE sql_stmt.x; 
END LOOP; 
COMMIT; 
END;