diff --git a/base/src/org/compiere/util/DB.java b/base/src/org/compiere/util/DB.java
index 997c7cca4b..03a5a5473a 100644
--- a/base/src/org/compiere/util/DB.java
+++ b/base/src/org/compiere/util/DB.java
@@ -76,6 +76,7 @@ import org.compiere.process.SequenceCheck;
*
FR [ 1986583 ] Add DB.executeUpdateEx(String, Object[], String)
* BF [ 2030233 ] Remove duplicate code from DB class
* FR [ 2107062 ] Add more DB.getKeyNamePairs methods
+ * FR [ 2448461 ] Introduce DB.getSQLValue*Ex methods
*/
public final class DB
{
@@ -1161,6 +1162,19 @@ public final class DB
}
return retValue;
}
+
+ /**
+ * Get String Value from sql
+ * @param trxName trx
+ * @param sql sql
+ * @param params collection of parameters
+ * @return first value or -1
+ * @throws DBException if there is any SQLException
+ */
+ public static int getSQLValueEx (String trxName, String sql, Collection params)
+ {
+ return getSQLValueEx(trxName, sql, params.toArray(new Object[params.size()]));
+ }
/**
* Get int Value from sql
@@ -1192,9 +1206,7 @@ public final class DB
*/
public static int getSQLValue (String trxName, String sql, Collection params)
{
- Object[] arr = new Object[params.size()];
- params.toArray(arr);
- return getSQLValue(trxName, sql, arr);
+ return getSQLValue(trxName, sql, params.toArray(new Object[params.size()]));
}
/**
@@ -1203,8 +1215,9 @@ public final class DB
* @param sql sql
* @param params array of parameters
* @return first value or null
+ * @throws DBException if there is any SQLException
*/
- public static String getSQLValueString (String trxName, String sql, Object... params)
+ public static String getSQLValueStringEx (String trxName, String sql, Object... params)
{
String retValue = null;
PreparedStatement pstmt = null;
@@ -1219,9 +1232,9 @@ public final class DB
else
log.info("No Value " + sql);
}
- catch (Exception e)
+ catch (SQLException e)
{
- log.log(Level.SEVERE, sql, getSQLException(e));
+ throw new DBException(e, sql);
}
finally
{
@@ -1231,6 +1244,40 @@ public final class DB
return retValue;
}
+ /**
+ * Get String Value from sql
+ * @param trxName trx
+ * @param sql sql
+ * @param params collection of parameters
+ * @return first value or null
+ * @throws DBException if there is any SQLException
+ */
+ public static String getSQLValueStringEx (String trxName, String sql, Collection params)
+ {
+ return getSQLValueStringEx(trxName, sql, params.toArray(new Object[params.size()]));
+ }
+
+ /**
+ * Get String Value from sql
+ * @param trxName trx
+ * @param sql sql
+ * @param params array of parameters
+ * @return first value or null
+ */
+ public static String getSQLValueString (String trxName, String sql, Object... params)
+ {
+ String retValue = null;
+ try
+ {
+ retValue = getSQLValueStringEx(trxName, sql, params);
+ }
+ catch (Exception e)
+ {
+ log.log(Level.SEVERE, sql, getSQLException(e));
+ }
+ return retValue;
+ }
+
/**
* Get String Value from sql
* @param trxName trx
@@ -1240,9 +1287,7 @@ public final class DB
*/
public static String getSQLValueString (String trxName, String sql, Collection params)
{
- Object[] arr = new Object[params.size()];
- params.toArray(arr);
- return getSQLValueString(trxName, sql, arr);
+ return getSQLValueString(trxName, sql, params.toArray(new Object[params.size()]));
}
/**
@@ -1281,6 +1326,20 @@ public final class DB
return retValue;
}
+ /**
+ * Get BigDecimal Value from sql
+ * @param trxName trx
+ * @param sql sql
+ * @param params collection of parameters
+ * @return first value or null if not found
+ * @throws DBException if there is any SQLException
+ */
+ public static BigDecimal getSQLValueBDEx (String trxName, String sql, Collection params) throws DBException
+ {
+ return getSQLValueBDEx(trxName, sql, params.toArray(new Object[params.size()]));
+ }
+
+
/**
* Get BigDecimal Value from sql
* @param trxName trx
@@ -1311,9 +1370,7 @@ public final class DB
*/
public static BigDecimal getSQLValueBD (String trxName, String sql, Collection params)
{
- Object[] arr = new Object[params.size()];
- params.toArray(arr);
- return getSQLValueBD(trxName, sql, arr);
+ return getSQLValueBD(trxName, sql, params.toArray(new Object[params.size()]));
}
/**
@@ -1322,8 +1379,9 @@ public final class DB
* @param sql sql
* @param params array of parameters
* @return first value or null
+ * @throws DBException if there is any SQLException
*/
- public static Timestamp getSQLValueTS (String trxName, String sql, Object... params)
+ public static Timestamp getSQLValueTSEx (String trxName, String sql, Object... params)
{
Timestamp retValue = null;
PreparedStatement pstmt = null;
@@ -1338,9 +1396,9 @@ public final class DB
else
log.info("No Value " + sql);
}
- catch (Exception e)
+ catch (SQLException e)
{
- log.log(Level.SEVERE, sql, getSQLException(e));
+ throw new DBException(e, sql);
}
finally
{
@@ -1349,6 +1407,39 @@ public final class DB
}
return retValue;
}
+
+ /**
+ * Get BigDecimal Value from sql
+ * @param trxName trx
+ * @param sql sql
+ * @param params collection of parameters
+ * @return first value or null if not found
+ * @throws DBException if there is any SQLException
+ */
+ public static Timestamp getSQLValueTSEx (String trxName, String sql, Collection params) throws DBException
+ {
+ return getSQLValueTSEx(trxName, sql, params.toArray(new Object[params.size()]));
+ }
+
+ /**
+ * Get Timestamp Value from sql
+ * @param trxName trx
+ * @param sql sql
+ * @param params array of parameters
+ * @return first value or null
+ */
+ public static Timestamp getSQLValueTS (String trxName, String sql, Object... params)
+ {
+ try
+ {
+ return getSQLValueTSEx(trxName, sql, params);
+ }
+ catch (Exception e)
+ {
+ log.log(Level.SEVERE, sql, getSQLException(e));
+ }
+ return null;
+ }
/**
* Get Timestamp Value from sql
diff --git a/extend/src/test/functional/DBTest.java b/extend/src/test/functional/DBTest.java
index 63eb9e0130..fde70b098b 100644
--- a/extend/src/test/functional/DBTest.java
+++ b/extend/src/test/functional/DBTest.java
@@ -4,9 +4,11 @@
package test.functional;
import java.math.BigDecimal;
+import java.sql.Timestamp;
import org.adempiere.exceptions.DBException;
import org.compiere.util.DB;
+import org.compiere.util.TimeUtil;
import test.AdempiereTestCase;
@@ -27,7 +29,7 @@ public class DBTest extends AdempiereTestCase
DBException ex = null;
try
{
- DB.getSQLValueEx(null, "SELECT 10 FROM INEXISTENT_TABLE");
+ result = DB.getSQLValueEx(null, "SELECT 10 FROM INEXISTENT_TABLE");
}
catch (DBException e)
{
@@ -59,7 +61,7 @@ public class DBTest extends AdempiereTestCase
DBException ex = null;
try
{
- DB.getSQLValueBDEx(null, "SELECT 10 FROM INEXISTENT_TABLE");
+ result = DB.getSQLValueBDEx(null, "SELECT 10 FROM INEXISTENT_TABLE");
}
catch (DBException e)
{
@@ -79,4 +81,72 @@ public class DBTest extends AdempiereTestCase
result = DB.getSQLValueBD(null, "SELECT 10 FROM INEXISTENT_TABLE");
assertNull("Error should be signaled", result);
}
+
+ public void test_getSQLValueStringEx() throws Exception
+ {
+ String result = DB.getSQLValueStringEx(null, "SELECT 'string' FROM DUAL");
+ assertEquals("string", result);
+ //
+ result = DB.getSQLValueStringEx(null, "SELECT 10 FROM AD_SYSTEM WHERE 1=2");
+ assertNull("No value should be returned", result);
+ //
+ DBException ex = null;
+ try
+ {
+ result = DB.getSQLValueStringEx(null, "SELECT 'string' FROM INEXISTENT_TABLE");
+ }
+ catch (DBException e)
+ {
+ ex = e;
+ }
+ assertNotNull("No DBException Was Throwed", ex);
+ }
+
+ public void test_getSQLValueString() throws Exception
+ {
+ String result = DB.getSQLValueString(null, "SELECT 'string' FROM DUAL");
+ assertEquals("string", result);
+ //
+ result = DB.getSQLValueString(null, "SELECT 'string' FROM AD_SYSTEM WHERE 1=2");
+ assertNull("No value should be returned", result);
+ //
+ result = DB.getSQLValueString(null, "SELECT 'string' FROM INEXISTENT_TABLE");
+ assertNull("Error should be signaled", result);
+ }
+
+ public void test_getSQLValueTSEx() throws Exception
+ {
+ final Timestamp target = TimeUtil.getDay(2008, 01, 01);
+ //
+ Timestamp result = DB.getSQLValueTSEx(null, "SELECT TO_DATE('2008-01-01','YYYY-MM-DD') FROM AD_SYSTEM");
+ assertEquals(target, result);
+ //
+ result = DB.getSQLValueTSEx(null, "SELECT TO_DATE('2008-01-01','YYYY-MM-DD') FROM AD_SYSTEM WHERE 1=2");
+ assertNull("No value should be returned", result);
+ //
+ DBException ex = null;
+ try
+ {
+ result = DB.getSQLValueTSEx(null, "SELECT TO_DATE('2008-01-01','YYYY-MM-DD') FROM INEXISTENT_TABLE");
+ }
+ catch (DBException e)
+ {
+ ex = e;
+ }
+ assertNotNull("No DBException Was Throwed", ex);
+ }
+
+ public void test_getSQLValueTS() throws Exception
+ {
+ final Timestamp target = TimeUtil.getDay(2008, 01, 01);
+ //
+ Timestamp result = DB.getSQLValueTS(null, "SELECT TO_DATE('2008-01-01','YYYY-MM-DD') FROM DUAL");
+ assertEquals(target, result);
+ //
+ result = DB.getSQLValueTS(null, "SELECT TO_DATE('2008-01-01','YYYY-MM-DD') FROM AD_SYSTEM WHERE 1=2");
+ assertNull("No value should be returned", result);
+ //
+ result = DB.getSQLValueTS(null, "SELECT TO_DATE('2008-01-01','YYYY-MM-DD') FROM INEXISTENT_TABLE");
+ assertNull("Error should be signaled", result);
+ }
}