Выполнение PL / SQL Begin / End процедуры из тонкого драйвера Oracle JDBC - PullRequest
1 голос
/ 18 июля 2011

Я пытаюсь создать процедуры Oracle PL / SQL и выполнить их через Oracle JDBC (тонкий драйвер).Вот полный сценарий PL / SQL:

begin
for i in (select owner, constraint_name, table_name from all_constraints where owner = 'SCHEMA' and status = 'ENABLED') LOOP
execute immediate 'alter table SCHEMA.'||i.table_name||' disable constraint SCHEMA.'||i.constraint_name||'';
end loop;
end;
/
begin
for i in (select table_name from all_tables where owner = 'SCHEMA') LOOP
execute immediate 'truncate table SCHEMA.'||i.table_name||'';
end loop;
end;
/
begin
for i in (select owner, constraint_name, table_name from all_constraints where owner = 'SCHEMA' and status = 'DISABLED') LOOP
execute immediate 'alter table SCHEMA.'||i.table_name||' enable constraint SCHEMA.'||i.constraint_name||'';
end loop;
end;
/

В Java я делю на '/', поэтому каждый блок начала и конца выполняется в отдельной инструкции.Код Java для выполнения инструкции:

CallableStatement c = dbc.getConnection().prepareCall(sqlStatement);
c.executeUpdate();

Я получаю следующую ошибку:

java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended
ORA-06512: at line 3

Как мне отформатировать это и выполнить PL / SQL в JDBC?

Обновлено: Для пояснения, все три оператора выполняются без разделителя '/', разделенного на.

Обновлено: Сервер-оракулследующая версия: Oracle Database 11g Release 11.2.0.1.0 - 64-разрядная версия

1 Ответ

2 голосов
/ 18 июля 2011

В ограничении «enable / diable» не следует добавлять имя схемы (your'SCHEMA).

Из руководства: ALTER TABLE

Yourпример:

begin
    for i in (select owner, constraint_name, table_name
              from   all_constraints
              where  owner = 'SCHEMA'
              and    status = 'ENABLED')
    loop
        execute immediate 'alter table SCHEMA.' || i.table_name ||
                          ' disable constraint ' || i.constraint_name;
    end loop;
end;

Тестовый запрос

select ac.constraint_name, ac.table_name, ac.status, ac.owner
from   all_constraints ac
where  ac.owner = 'HR'
and    ac.constraint_name = 'EMP_SALARY_MIN'

Результат

CONSTRAINT_NAME                TABLE_NAME                     STATUS   OWNER
------------------------------ ------------------------------ -------- --------------------------------------------------------------------------------
EMP_SALARY_MIN                 EMPLOYEES                      ENABLED  HR

Правильный динамический sql

begin
    execute immediate 'alter table HR.EMPLOYEES disable constraint EMP_SALARY_MIN';
end;

Предыдущий результат запроса

CONSTRAINT_NAME                TABLE_NAME                     STATUS   OWNER
------------------------------ ------------------------------ -------- --------------------------------------------------------------------------------
EMP_SALARY_MIN                 EMPLOYEES                      DISABLED HR
...