2013-07-15 37 views
4

DDL命令如下:我們可以在預備語句(PostgreSQL)中使用DDL命令嗎?

CREATE TABLE - 使用用戶提供的列名創建表。

DROP TABLE - 刪除所有行並從數據庫中刪除表定義。

ALTER TABLE - 添加或刪除表中的列。

如果在PostgreSQL和Java中有可能使用這些命令,我​​需要幾個例子嗎?

public boolean create(Employee employee) { 

    try { 

     callableStatement = openConnection().prepareCall("{call insert_employee(?,?,?)}"); 
     callableStatement.setInt(1, employee.getEid()); 
     callableStatement.setString(2, employee.getEname()); 
     callableStatement.setInt(3, employee.getSid());  

     i = callableStatement.execute(); 

     callableStatement.close(); 

     closeConnection(); 



    } catch (SQLException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return i; 

} 

有沒有在這種類型中使用DDL CREATE命令的機會?使用預準備報表?

+0

@CraigRinger我刪除了那個鏈接,那是爲了糾正我 – Microtechie

回答

2

是的,你可以,如果你使用EXECUTE並將其包裝在一個函數中。函數調用允許您傳遞參數,並且在FUNCTION中使用字符串操作來修改DDL語句。最後,在FUNCTION中使用EXECUTE使其如此。這裏是一個參數CREATE SEQUENCE語句的一個簡單的例子...

DROP FUNCTION sf.start_mc(integer); 

CREATE FUNCTION sf.start_mc(thefirst integer) RETURNS void AS $$ 
BEGIN 
    EXECUTE format('CREATE SEQUENCE sf.mastercase START %s',thefirst); 
END; 

$$ LANGUAGE plpgsql; 

我們使用字符串函數「格式」操縱語句,幷包括傳遞給函數的參數。當然,你的SQL看起來相當不尋常,特別是如果你在調用它之前包含了CREATE FUNCTION。這個例子來自我最近做的數據遷移工作。 CREATEing功能後,我們用這樣的:

DROP SEQUENCE sf.mastercase; 

-- the following uses the above function to set the starting value of a new sequence based on the last used 
-- in the widget table 
select sf.start_mc((select substring("widgetId",4)::integer + 1 from widgets 
where "widgetId" like 'MC-%' 
order by "widgetId" desc 
limit 1)); 

注意外部選擇不選擇任何內容,它只是使一個地方做的函數調用。作爲參數傳遞的數字來自包含在括號中的內部SELECT。一個更簡單的電話將是

select sf.start_mc(42); 

你可以包裝任何東西在CREATED FUNCTION。但這確實意味着你被PostgreSQL困住了,並且你需要將你的數據庫模式和模式更改作爲一等公民集成到你的開發過程中。

3

你試過了嗎?

它不被服務器端支持,所以即使它似乎在客戶端JDBC驅動程序工作,我不建議這樣做:

regress=> PREPARE CREATE TABLE test (id serial primary key); 
ERROR: syntax error at or near "CREATE" 
LINE 1: PREPARE CREATE TABLE test (id serial primary key); 
       ^

有沒有優勢,這樣做呢,因爲你不能參數化他們,所以你不能寫:

CREATE TABLE ? (? text, ...) 

,然後指定佔位符值作爲查詢參數的Statement

在PostgreSQL中只有計劃的語句可能會被準備和參數化服務器端。目前這意味着INSERT,UPDATE,DELETESELECT

您需要根據PostgreSQL的lexical structure rules進行自己的字符串插值和安全引用 - 這幾乎是SQL規範的一部分。將所有標識符包裝在"double quotes"中,並將任何文字雙引號加倍,例如"these are literal ""double quotes"""作爲表名these are literal "double quotes"

事實上,你想這樣做表明你可能在你的模式中有設計問題,並可能需要重新考慮你如何處理事情。也許在dba.stackexchange.com上發佈一個更詳細的問題,解釋你想要實現的目標以及爲什麼?

相關問題