2011-07-18 10 views
1

Oracle PL/SQLプロシージャを作成し、Oracle JDBC(Thin Driver)経由で実行しようとしています。Oracle JDBC ThinドライバからのPL/SQL Begin/Endプロシージャの実行

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では、私は '/'で分割しているので、それぞれのbegin endブロックは別々の文で実行されます。ステートメントを実行するためのJavaコードは次のとおりです。

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

私は次のエラーを受信して​​います:

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

は、どのように私はこれをフォーマットし、JDBCでPL/SQLを実行していますか?

更新:明確にするために、3つのステートメントはすべて、分割された '/'区切り文字なしで実行されます。

更新: Oracleサーバーには、次のバージョンである:Oracle Database 11gリリース11.2.0.1.0 - 64ビットの生産

+1

私は投稿のコードに問題が表示されません。 SQL文がセミコロンで終わっていることを確認してください。セミコロンが必要なので、スラッシュは存在してはいけません。 – Codo

+0

Codoのコメントをチェックしてください。「スラッシュは存在してはいけません。 – Olaf

+0

私は、CallableStatementで更新を実行したときに '/'が実際には存在しないことを示す質問を更新しました。 – abargnesi

答えて

2

に(スキーマ名を追加してはならない制約「/ディアブルを有効にする」あなた'SCHEMA)。

マニュアルから: ALTER TABLE

あなたの例:

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 
+0

私はoracleの制約を読んだ後、これを問題として認識しました。 zepの回答ごとにSQLが修正された後も、私はまだエラーが発生しています。外部キーと主キーを無効/有効にするために、現在のユーザーには「Create Any Index」と「Any Indexを削除」権限が必要です。 zepへの答えを与える。 – abargnesi

関連する問題