我们可以在预准备语句(PostgreSQL)中使用DDL命令吗?

09Q*_*534 6 java postgresql ddl jdbc java-ee

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;

}
Run Code Online (Sandbox Code Playgroud)

有没有机会在这种类型中使用DDL CREATE命令?用准备好的陈述?

Cra*_*ger 5

你试了吗?

服务器不支持它,所以即使它似乎在客户端 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 );
                ^
Run Code Online (Sandbox Code Playgroud)

这样做没有任何好处,因为你不能参数化它们,所以你不能写:

CREATE TABLE ? ( ? text, ...)
Run Code Online (Sandbox Code Playgroud)

然后将占位符值指定为Statement.

在 PostgreSQL 中,只能在服务器端准备和参数化计划语句。目前这意味着INSERT, UPDATE,DELETESELECT

您需要根据 PostgreSQL 的词法结构规则进行自己的字符串插值和安全引用- 这与 SQL 规范中的规则非常相似。将所有标识符包裹在"double quotes"任何文字双引号中并将其加倍,例如"these are literal ""double quotes"""表名these are literal "double quotes"

您想要这样做的事实表明您的架构中可能存在设计问题,并且可能需要重新考虑您将如何处理事情。也许在 dba.stackexchange.com 上发布一个更详细的问题,解释你想用这个实现什么以及为什么?


Mic*_*lon 3

是的,如果您使用 EXECUTE 并将其包装在 FUNCTION 中,则可以。函数调用允许您传递参数,并且在 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;
Run Code Online (Sandbox Code Playgroud)

我们使用字符串函数“format”来操作语句并包含传递给函数的参数。当然,您的 SQL 看起来相当不寻常,特别是如果您在调用它之前包含 CREATE FUNCTION。这个例子来自我最近做的一个数据迁移工作。创建函数后,我们像这样使用它:

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));
Run Code Online (Sandbox Code Playgroud)

请注意,外部 SELECT 不会选择任何内容,它只是提供一个执行函数调用的位置。作为参数传递的数字来自括在括号中的内部 SELECT。一个更简单的调用是

select sf.start_mc(42);
Run Code Online (Sandbox Code Playgroud)

您可以将任何内容包装在 CREATEd FUNCTION 中。但这确实意味着您必须使用 PostgreSQL,并且您需要作为一等公民将您的数据库模式和模式更改集成到您的开发过程中。