2012-08-10 99 views
17

我想在PostgreSQL數據庫中將所有列名重命名爲小寫我剛剛編寫了一個sql函數。以下是代碼。重命名postgresql數據庫中的列名稱

CREATE OR REPLACE FUNCTION update_column_names() RETURNS boolean AS $$ 
DECLARE 
aRow RECORD; 
aRow2 RECORD; 
tbl_name TEXT; 
col_name TEXT; 
new_col_name TEXT; 
BEGIN 
    FOR aRow IN select table_name from information_schema.tables where table_schema='public' and table_type='BASE TABLE' LOOP 
     SELECT aRow.table_name INTO tbl_name from current_catalog; 
     FOR aRow2 IN select column_name from information_schema.columns where table_schema='public' and table_name = aRow.table_name LOOP 
      SELECT aRow2.column_name INTO col_name from current_catalog; 
      new_col_name:=lower(col_name); 
      RAISE NOTICE 'Table name:%',tbl_name; 
      RAISE NOTICE 'Column name:%',aRow2.column_name; 
      RAISE NOTICE 'New column name:%',new_col_name; 
      ALTER TABLE tbl_name RENAME COLUMN col_name TO new_col_name; 
     END LOOP; 
    END LOOP; 
    RETURN true; 
END; 
$$ LANGUAGE plpgsql; 

上面的代碼給出的關係tbl_name不存在。代碼有什麼問題?

回答

38

您需要使用dynamic SQL來做到這一點;表名不能是變量。

⋮ 
EXECUTE 'ALTER TABLE ' || quote_ident(tbl_name) || ' RENAME COLUMN ' 
     || quote_ident(col_name) || ' TO ' || quote_ident(new_col_name); 
⋮ 

或類似