2013-07-15 2 views
4

DDL команды:Можем ли мы использовать DDL-команды в подготовленном заявлении (PostgreSQL)?

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 Я удалил эту ссылку, thats для исправления меня – Microtechie

ответ

2

Да, вы можете использовать EXECUTE и обернуть его в FUNCTION. Вызов функции позволяет вам передавать параметры, а внутри FUNCTION вы используете манипуляции с строкой для изменения инструкции DDL. Наконец, использование EXECUTE в FUNCTION делает так. Вот простой пример параметризованных CREATE заявления ПОСЛЕДОВАТЕЛЬНОСТИ ...

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, который заключен в круглые скобки. Более простым вызовом будет

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, DELETE и SELECT.

Вам нужно будет сделать свою собственную интерполяцию строк и безопасное цитирование в соответствии с lexical structure rules PostgreSQL, которые в значительной степени соответствуют спецификации SQL. Заверните все идентификаторы в "double quotes" и удвоьте любые буквенные двойные кавычки, например "these are literal ""double quotes""" для имени таблицы these are literal "double quotes".

Тот факт, что вы хотите сделать это, говорит о том, что у вас, вероятно, есть проблемы с дизайном в вашей схеме, и вам, возможно, придется подумать о том, как вы собираетесь поступать. Возможно, напишите более подробный вопрос на dba.stackexchange.com, который объясняет, чего вы хотите достичь с этим и почему?

Смежные вопросы