2016-06-22 5 views
2

後はトリガーです:Apache Antを持つSQLを実行してエラーではなく、OracleのSQL Developerの

CREATE OR REPLACE TRIGGER "CMDC"."USER_ROADS_UC" 
BEFORE INSERT OR UPDATE OF 
    ASSOCIATED_PARENT_ROAD 
ON USER_ROADS 
REFERENCES NEW AS NEW 
FOR EACH ROW BEGIN 
    :new.ASSOCIATED_PARENT_ROAD:=upper(:new.ASSOCIATED_PARENT_ROAD); 
    EXCEPTION 
    WHEN OTHERS THEN RETURN; 
END; 
/
ALTER TRIGGER "CMDC"."USER_ROADS_UC" ENABLE 

完全にSQL Developerで上記実行されます。私はAntを使用し、それを実行したときに、私は次のエラーを取得するときしかし、:

[sql] Failed to execute: EXCEPTION WHEN OTHERS THEN RETURN 
[sql] java.sql.SQLException: ORA-00900: invalid SQL statement 
[sql] Failed to execute: END 
[sql] java.sql.SQLException: ORA-00900: invalid SQL statement 
[sql] Failed to execute:/ALTER TRIGGER "CMDC"."USER_ROADS_UC" ENABLE 
[sql] java.sql.SQLException: ORA-00900: invalid SQL statement 

私はすでにthis questionを検討しています。しかし、Antで動作するようにスクリプトを変更することはできませんでした。

アリSQLタグ付きAntターゲットである

<target name="create-db-schema" > 
     <echo message="############################################################"/> 
     <echo message="#    Create Complete DB Schema     #"/> 
     <echo message="############################################################"/> 

     <sql onerror="continue" classpathref="project.class.path" driver="${database.driverClassName}" 
      url="${database.url}" userid="${database.username}" password="${database.password}"> 
      <path> 
       <fileset dir="${test.dbscripts.dir}/schema/"> 
        <include name="*.sql"/> 
       </fileset> 
      </path> 
     </sql> 
</target> 
+0

'ALTER TRIGGER'文の最後にセミコロンや'/'を置くと違いはありますか? 'ALTER TRIGGER'文を削除し、それを新しい呼び出しで別の文として挿入するとどうでしょうか? –

+1

しかし、どのようにあなたのアリタスクを定義しましたか? 'delimiter'、' delimitertype'の行を設定しましたか? [これをチェック](https://technology.amis.nl/2005/08/08/ant-and-stored-procedures-and-dbms_output/) –

+0

@ArkadiuszŁukasiewicz、関連するビルドスクリプトを表示してもよろしいですか? '-debug'オプションを試しましたか? – Rao

答えて

0

後、私は多くの方法で試みにもかかわらず、同じスクリプトでSQLおよびPL/SQLの両方を実行できませんでした。

これを行うには、このライブラリを使用しました。外部ライブラリを使用しています。dbmaintain ビルドスクリプトに以下を追加してください。

<path id="dbmaintain-lib"><fileset dir="${dbmaintain.home}/lib"><include name="*.jar"/></fileset></path> 
<taskdef resource="dbmaintain-anttasks.xml" classpathref="dbmaintain.lib"/> 

    <target name="update-db"> 
    <updateDatabase scriptLocations="scripts" autoCreateDbMaintainScriptsTable="true"> 
     <database driverClassName="oracle.jdbc.driver.OracleDriver" userName="user" password="pass" url="jdbc:oracle:thin:@//localhost:1521/XE" schemaNames="SCHEMA"/> 
    </updateDatabase> 
</target> 

これまでのところ、 ';'を置き換えるSQLスクリプトファイルを変更することなく、完全に動作します。 これが必要な人に役立つことを願っています。

0

私はこのソリューションをテストする環境がありません。しかし、テスト目的のために、このようなものを試すことができます。

<sql 
    driver="xxx" 
    url="xxx" 
    userid="xxx" 
    password="xxx" 
    delimiter="/" 
    delimitertype="row" 
    ><![CDATA[ 

CREATE OR REPLACE TRIGGER "CMDC"."USER_ROADS_UC" 
BEFORE INSERT OR UPDATE OF 
    ASSOCIATED_PARENT_ROAD 
ON USER_ROADS 
REFERENCES NEW AS NEW 
FOR EACH ROW BEGIN 
    :new.ASSOCIATED_PARENT_ROAD:=upper(:new.ASSOCIATED_PARENT_ROAD); 
    EXCEPTION 
    WHEN OTHERS THEN RETURN; 
END; 
/
ALTER TRIGGER "CMDC"."USER_ROADS_UC" ENABLE 
/

]]></sql> 
  • 重要!現在の区切り文字は、空白を囲まずに新しい行に "/"表示されます。
+0

すでにこれを行いましたが、SQLの部分を別のファイルに保存しました。仕事はしない –

関連する問題