2013-07-15 32 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上发布一个更详细的问题,解释你想要实现的目标以及为什么?

相关问题