为什么Oracle程序没有编译?

时间:2013-05-16 11:06:30

标签: oracle plsql oracle11g oracle-sqldeveloper

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;

为什么关于程序没有编译?它给出错误说

  

错误(8,26):PLS-00382:表达式类型错误

如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

两件事:

  1. 你需要记住,当迭代一个游标时,它会返回一个ROW,而不是一个VALUE和
  2. 游标中的SELECT需要为游标生成的行中的值指定名称。
  3. 尝试:

    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 :(得分: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;