From: <fab...@us...> - 2009-02-08 16:11:30
|
Revision: 4073 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4073&view=rev Author: fabiomaulo Date: 2009-02-08 16:11:27 +0000 (Sun, 08 Feb 2009) Log Message: ----------- Oracle custom Stored Procedures test (perhaps to fix NH-847 too) Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/OracleCustomSQLFixture.cs trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/StoredProcedures.hbm.xml Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-02-08 13:37:25 UTC (rev 4072) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-02-08 16:11:27 UTC (rev 4073) @@ -933,6 +933,7 @@ <Compile Include="SessionFactoryTest\SessionFactorySerializationFixture.cs" /> <Compile Include="SqlTest\Custom\CustomSQLSupportTest.cs" /> <Compile Include="SqlTest\Custom\CustomStoredProcSupportTest.cs" /> + <Compile Include="SqlTest\Custom\Oracle\OracleCustomSQLFixture.cs" /> <Compile Include="Tools\hbm2ddl\SchemaUpdate\MigrationFixture.cs" /> <Compile Include="Tools\hbm2ddl\SchemaUpdate\Version.cs" /> <Compile Include="SecondLevelCacheTest\AnotherItem.cs" /> @@ -1655,6 +1656,8 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="SqlTest\Custom\Oracle\Mappings.hbm.xml" /> + <EmbeddedResource Include="SqlTest\Custom\Oracle\StoredProcedures.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1619\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1665\Mappings.hbm.xml" /> <EmbeddedResource Include="Generatedkeys\ByTrigger\MyEntity.hbm.xml" /> @@ -1771,7 +1774,6 @@ </ItemGroup> <ItemGroup> <Folder Include="Properties\" /> - <Folder Include="SqlTest\Custom\Oracle\" /> </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Added: trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/Mappings.hbm.xml 2009-02-08 16:11:27 UTC (rev 4073) @@ -0,0 +1,209 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + + This mapping demonstrates the use of Hibernate with + all-handwritten SQL! + + This version is for Oracle +--> +<hibernate-mapping + xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.SqlTest" + default-access="field"> + + <class name="Organization"> + <id name="id" unsaved-value="0" column="orgid"> + <generator class="increment"/> + </id> + <property name="name" not-null="true"/> + <set name="employments" + inverse="true" + order-by="DUMMY"> + <key column="employer"/> + <!-- only needed for DDL generation --> + <one-to-many class="Employment"/> + <loader query-ref="organizationEmployments"/> + </set> + <!-- query-list name="currentEmployments" + query-ref="organizationCurrentEmployments"--> + <loader query-ref="organization"/> + <sql-insert>INSERT INTO ORGANIZATION (NAME, ORGID) VALUES ( UPPER(?), ? )</sql-insert> + <sql-update>UPDATE ORGANIZATION SET NAME=UPPER(?) WHERE ORGID=?</sql-update> + <sql-delete>DELETE FROM ORGANIZATION WHERE ORGID=?</sql-delete> + </class> + + <class name="Person"> + <id name="id" unsaved-value="0" column="perid"> + <generator class="increment"/> + </id> + <property name="name" not-null="true"/> + <loader query-ref="person"/> + <sql-insert callable="true" check="none">call createPerson(?,?)</sql-insert> + <sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE PERID=?</sql-update> + <sql-delete>DELETE FROM PERSON WHERE PERID=?</sql-delete> + </class> + + <class name="Employment"> + <id name="employmentId" unsaved-value="0" column="empid"> + <generator class="increment"/> + </id> + <many-to-one name="employee" not-null="true" update="false"/> + <many-to-one name="employer" not-null="true" update="false"/> + <property name="startDate" not-null="true" update="false" insert="false"/> + <property name="endDate" insert="false" type="NHibernate.Test.SqlTest.NullDateUserType, NHibernate.Test"/> + <property name="regionCode" update="false"/> + <property name="salary" type="NHibernate.Test.SqlTest.MonetaryAmountUserType, NHibernate.Test"> + <column name="VALUE" sql-type="float"/> + <column name="CURRENCY"/> + </property> + <loader query-ref="employment"/> + <sql-insert> + INSERT INTO EMPLOYMENT + (EMPLOYEE, EMPLOYER, STARTDATE, REGIONCODE, VALUE, CURRENCY, EMPID) + VALUES (?, ?, CURRENT_DATE, UPPER(?), ?, ?, ?) + </sql-insert> + <sql-update>UPDATE EMPLOYMENT SET ENDDATE=?, VALUE=?, CURRENCY=? WHERE EMPID=?</sql-update> + <sql-delete>DELETE FROM EMPLOYMENT WHERE EMPID=?</sql-delete> + </class> + + <resultset name="org-emp-regionCode"> + <return-scalar column="regionCode" type="string"/> + <return alias="org" class="Organization"/> + <return-join alias="emp" property="org.employments"/> + </resultset> + + <resultset name="org-emp-person"> + <return alias="org" class="Organization"/> + <return-join alias="emp" property="org.employments"/> + <return-join alias="pers" property="emp.employee"/> + </resultset> + + <sql-query name="person"> + <return alias="p" class="Person" lock-mode="upgrade"/> + SELECT NAME AS {p.name}, PERID AS {p.id} FROM PERSON WHERE PERID=? /*FOR UPDATE*/ + </sql-query> + + <sql-query name="organization"> + <return alias="org" class="Organization"/> + <return-join alias="emp" property="org.employments"/> + SELECT {org.*}, {emp.*} + FROM ORGANIZATION org + LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER + WHERE org.ORGID=? + </sql-query> + + <sql-query name="allOrganizationsWithEmployees" flush-mode="never"> + <return alias="org" class="Organization"/> + SELECT DISTINCT org.NAME AS {org.name}, org.ORGID AS {org.id} + FROM ORGANIZATION org + INNER JOIN EMPLOYMENT e ON e.EMPLOYER = org.ORGID + </sql-query> + + + <sql-query name="employment"> + <return alias="emp" class="Employment"/> + SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer}, + STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate}, + REGIONCODE as {emp.regionCode}, EMPID AS {emp.id} + FROM EMPLOYMENT + WHERE EMPID = ? + </sql-query> + + <sql-query name="organizationEmployments"> + <load-collection alias="empcol" role="Organization.employments"/> + SELECT {empcol.*} + FROM EMPLOYMENT empcol + WHERE EMPLOYER = :id + ORDER BY STARTDATE ASC, EMPLOYEE ASC + </sql-query> + + <sql-query name="organizationCurrentEmployments"> + <return alias="emp" class="Employment"> + <return-property name="salary"> + <!-- as multi column properties are not supported via the + {}-syntax, we need to provide an explicit column list for salary via <return-property> --> + <return-column name="VALUE"/> + <return-column name="CURRENCY"/> + </return-property> + <!-- Here we are remapping endDate. Notice that we can still use {emp.endDate} in the SQL. --> + <return-property name="endDate" column="myEndDate"/> + </return> + <synchronize table="EMPLOYMENT"/> + SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer}, + STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate}, + REGIONCODE as {emp.regionCode}, EMPID AS {emp.id}, VALUE, CURRENCY + FROM EMPLOYMENT + WHERE EMPLOYER = :id AND ENDDATE IS NULL + ORDER BY STARTDATE ASC + </sql-query> + + <database-object> + <create> + CREATE OR REPLACE FUNCTION testParamHandling (j number, i number) + RETURN SYS_REFCURSOR AS st_cursor SYS_REFCURSOR; + BEGIN + OPEN st_cursor FOR + SELECT j as value, i as value2 from dual; + RETURN st_cursor; + END; + </create> + <drop> + DROP FUNCTION testParamHandling + </drop> + </database-object> + + <database-object> + <create> + CREATE OR REPLACE FUNCTION simpleScalar (j number) + RETURN SYS_REFCURSOR AS st_cursor SYS_REFCURSOR; + BEGIN + OPEN st_cursor FOR + SELECT j as value, 'getAll' as name from dual; + RETURN st_cursor; + END; + </create> + <drop> + DROP FUNCTION simpleScalar + </drop> + </database-object> + + <database-object> + <create> + CREATE OR REPLACE FUNCTION allEmployments + RETURN SYS_REFCURSOR AS st_cursor SYS_REFCURSOR; + BEGIN + OPEN st_cursor FOR + SELECT EMPLOYEE, EMPLOYER, STARTDATE, ENDDATE, + REGIONCODE, EMPID, VALUE, CURRENCY + FROM EMPLOYMENT; + RETURN st_cursor; + END; + </create> + <drop> + DROP FUNCTION allEmployments + </drop> + </database-object> + + <database-object> + <create> + CREATE OR REPLACE PROCEDURE createPerson(p_name PERSON.NAME%TYPE, p_id PERSON.PERID%TYPE) + AS + rowcount INTEGER; + BEGIN + INSERT INTO PERSON ( PERID, NAME ) VALUES ( p_id, UPPER( p_name ) ); + rowcount := SQL%ROWCOUNT; + IF rowcount = 1 THEN + NULL; + ELSE + RAISE_APPLICATION_ERROR( -20001, 'Unexpected rowcount [' || rowcount || ']' ); + END IF; + END; + </create> + <drop> + DROP PROCEDURE createPerson; + </drop> + </database-object> + + +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/OracleCustomSQLFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/OracleCustomSQLFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/OracleCustomSQLFixture.cs 2009-02-08 16:11:27 UTC (rev 4073) @@ -0,0 +1,20 @@ +using System.Collections; +using NHibernate.Dialect; +using NUnit.Framework; + +namespace NHibernate.Test.SqlTest.Custom.Oracle +{ + [TestFixture, Ignore("Not supported yet.")] + public class OracleCustomSQLFixture : CustomStoredProcSupportTest + { + protected override IList Mappings + { + get { return new[] { "SqlTest.Custom.Oracle.Mappings.hbm.xml", "SqlTest.Custom.Oracle.StoredProcedures.hbm.xml" }; } + } + + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return dialect is Oracle8iDialect; + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/StoredProcedures.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/StoredProcedures.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/Oracle/StoredProcedures.hbm.xml 2009-02-08 16:11:27 UTC (rev 4073) @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + This version is for Oracle drivers handling of stored procedures/functions. + + + NOTE: so far this is the JAVA syntax, probably we will do something different in .NET + or we can use the same syntax and solve the problem in each Oracle drive +--> +<hibernate-mapping + xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.SqlTest" + default-access="field"> + + <sql-query name="simpleScalar" callable="true"> + <return-scalar column="name" type="string"/> + <return-scalar column="value" type="long"/> + call simpleScalar(:number) + </sql-query> + + <sql-query name="paramhandling" callable="true"> + <return-scalar column="value" type="long"/> + <return-scalar column="value2" type="long"/> + call testParamHandling(?,?) + </sql-query> + + <sql-query name="paramhandling_mixed" callable="true"> + <return-scalar column="value" type="long"/> + <return-scalar column="value2" type="long"/> + call testParamHandling(?,:second) + </sql-query> + + <sql-query name="selectAllEmployments" callable="true"> + <return alias="emp" class="Employment"> + <return-property name="employee" column="EMPLOYEE"/> + <return-property name="employer" column="EMPLOYER"/> + <return-property name="startDate" column="STARTDATE"/> + <return-property name="endDate" column="ENDDATE"/> + <return-property name="regionCode" column="REGIONCODE"/> + <return-property name="employmentId" column="EMPID"/> + <return-property name="salary"> + <return-column name="VALUE"/> + <return-column name="CURRENCY"/> + </return-property> + </return> + call allEmployments() + </sql-query> + +</hibernate-mapping> \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |