您可以创建一个表或删除一个表,就像执行 DML 语句一样... SQL 语句作为字符串传递给数据库引擎。
我怀疑您要问的是是否可以在 SQL 语句中提供一个 标识符(例如 table_name),通过将其作为绑定的 值 提供执行准备好的语句中的占位符。例如
CREATE TABLE ? (mycol INT)
或
CREATE TABLE :my_table_name (mycol INT)
简短的回答是不可能这样做。
语句中的标识符(例如表名)必须与 SQL 文本中的一样。就像关键字SELECT 和FROM 必须出现在SQL 文本中,并且不能通过绑定占位符作为值提供。
我们可以在 SELECT 语句中演示该限制,尝试提供表或视图的名称作为绑定占位符。不管是定位的? 还是命名的占位符。
这不起作用:
SELECT t.col c FROM ? t LIMIT 1
这不起作用:
SELECT 2 AS :col_alias FROM :v_table_name LIMIT 1
如果您了解 SQL 优化器在准备和执行语句时执行的操作,那么关于标识符的限制是有意义的。
此限制适用于 SELECT 语句。以及 DML 语句(INSERT、UPDATE、DELETE)和 DDL 语句(CREATE、ALTER、DROP)。
执行 DDL 语句的另一个潜在问题将导致隐式提交。我们需要注意在事务的上下文中正确处理它。
如果您需要执行动态 DDL 语句,提供带有变量的标识符,有两种基本方法:
1) 动态地将 SQL 文本构造为字符串,因此表名(和其他标识符)是 SQL 文本的一部分,而不是绑定占位符。
2) 创建一个将执行语句的存储过程,并调用该存储过程。存储过程的参数可以作为绑定占位符传递。