6

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 命令?使用准备好的语句?

4

3 回答 3

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 );
                ^

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

CREATE TABLE ? ( ? text, ...)

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

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

您需要根据 PostgreSQL 的词法结构规则进行自己的字符串插值和安全引用——这几乎是 SQL 规范中的规则。将所有标识符"double quotes"括起来,并将任何文字双引号加倍,例如"these are literal ""double quotes"""表名these are literal "double quotes"

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

于 2013-07-15T07:36:29.667 回答
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;

我们使用字符串函数“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));

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

select sf.start_mc(42);

您可以将任何内容包装在 CREATed FUNCTION 中。但这确实意味着您被 PostgreSQL 困住了,您需要将您的数据库模式和模式更改集成到您的开发过程中,作为一等公民。

于 2016-08-26T20:06:31.557 回答
-1

除非您使用来自外部世界的用户输入,否则不需要使用准备好的语句。

通常使用 DDL 语句,用户不知道也不应该知道有关内部数据库模式或模型的任何信息。

只要数据通过安全网络传输,我真的看不出准备报表有什么好处

于 2020-07-22T23:01:49.907 回答