Function call in Callable statement
Hi,
I have a function in pl/sql.
Am trying to use that using callable statement.
How to fetch the return value of the function?
Moreover, is it a good practise to use the function or is there
any other way in OAF
Thank you.
kumar
This would help.
Re: calling funcntions from OA Framework
Thanks
Tapash
Similar Messages
-
Function call in update statement
Hi,
I have an update statement as follows
update
tableA
set
some_Ind = 0
where
cond1=val1
and some_Ind = 1
and f_test(param1, param2) ='Y'
If i have say total 5 rows in tableA and the some_Ind is set to 1 for 2 rows.
Will this update stmt, call the funtion for all 5 rows ? and then update only the rows matching the condition?
Because i am expecting this update stmt to call the function for only the 2 rows which has the some_Ind as set but i get the message printed out 5 times for 5 rows but it updates only 2 rows.
Since this function f_test is very complex, i need to call it for only those rows to be updated.
Please give your suggestions....thanx...I just gave the test function to display the two parameters.
This function is displaying the messages for all the 5 rows and not for the 2 rows which match the condition.
CREATE OR REPLACE FUNCTION f_test1 (param1IN VARCHAR2,param2 IN VARCHAR2)
RETURN VARCHAR2 IS
retInd varchar2(1);
begin
dbms_output.put_line('param1: '||param1);
dbms_output.put_line(param2: '||param2);
retInd := 'Y';
DBMS_OUTPUT.PUT_LINE('Val of retInd:'||retInd);
RETURN retInd;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('other exception ');
RETURN 'N';
END; -
Problems with asynchronous(?) function call before return statement
I have a function as following inside a class deriving from CustomNode:
override protected function create () : Node {
parseContent();
return group;
}parseContent() executes a HttpRequest and then a PullParser. At least that's what it should do. But actually, it doesn't. Is this because the HttpRequest is asynchronous and is "cancelled" because of the return statement? Or can't this be the problem?You would have to update or create the view in the finally block of the onOutput: or onInput methods within the request.
You could also try
var viewContent: Node;
override protected function create () : Node {
parseContent();
FX.deferAction(function():Void{
viewContent = group;
return Group{ content: bind viewContent }
}I never tried that, but it might work.
Another option is to bind the parsed content to whatever view you are pushing it to. Then whenever the request is done, the view will populate its content on the change of the variable where the content is stored.
Example:
var allTables: TableModel[];
//***************start of table list decleration****************************\\
public var list: SwingJList = SwingJList {
var shortcutKey: Boolean = false;
focusTraversable: true
selectedIndex: 0
action: function(){
FX.deferAction(function():Void{
openButton.fire();
items: bind for( table in allTables ){
table.name
var searchDataXml = xmlGenerator.generateSearchXMLString(searchData);
var contentLength: Integer = searchDataXml.getBytes().length;
def postRequest: HttpRequest = HttpRequest {
location: "{WEB_APPLICATION_REQUEST_URL}searchData/?database={DATABASE_KEY}";
method: HttpRequest.POST;
headers: [
HttpHeader {
name: HttpHeader.CONTENT_TYPE;
value: "application/xml";
HttpHeader {
name: HttpHeader.CONTENT_LENGTH;
value: "{contentLength}";
onStarted: function() {
println("onStarted - started performing method: {postRequest.method} on location: {postRequest.location}");
onConnecting: function() { println("onConnecting") }
onDoneConnect: function() { println("onDoneConnect") }
onWriting: function() { println("onWriting") }
onOutput: function(os: java.io.OutputStream) {
try {
os.write(searchDataXml.getBytes());
} finally {
println("onOutput - about to close output stream.");
os.close();
os.flush();
onToWrite: function(bytes: Long) { println("onToWrite - entire content to be written: {bytes} bytes") }
onWritten: function(bytes: Long) { println("onWritten - {bytes} bytes has now been written") }
onDoneWrite: function() { println("doneWrite") }
onReadingHeaders: function() { println("onReadingHeaders") }
onResponseCode: function(code:Integer) { println("onResponseCode - responseCode: {code}") }
onResponseMessage: function(msg:String) { println("onResponseMessage - responseMessage: {msg}") }
onResponseHeaders: function(headerNames: String[]) {
println("onResponseHeaders - there are {headerNames.size()} response headers:");
for (name in headerNames) {
println(" {name}: {postRequest.getResponseHeaderValue(name)}");
onReading: function() { println("onReading") }
onToRead: function(bytes: Long) {
if (bytes < 0) {
println("onToRead - Content length not specified by server; bytes: {bytes}");
} else {
println("onToRead - total number of content bytes to read: {bytes}");
onRead: function(bytes: Long) {
// The toread variable is non negative only if the server provides the content length
def progress =
if (postRequest.toread > 0) "({(bytes * 100 / postRequest.toread)}%)" else "";
println("onRead - bytes read: {bytes} {progress}");
var parser = new XmlPullParser();
onInput: function(is: java.io.InputStream) {
// use input stream to access content here.
// can use input.available() to see how many bytes are available.
try {
allTables = parser.processResults(is);
} finally {
is.close();
onException: function(ex: java.lang.Exception) {
println("onException - exception: {ex.getClass()} {ex.getMessage()}");
onDoneRead: function() { println("onDoneRead") }
onDone: function() { println("onDone") }
postRequest.start();
} In this case an array of tableModel names are bound to the list view.
When the httprequest ends, it sets the parsed tableModel array to the array declared in this class.
The list view will populate the table names from the array when the request finishes. -
Return records from Stored Procedure to Callable Statement
Hi All,
I am createing a web application to display a students score card.
I have written a stored procedure in oracle that accepts the student roll number as input and returns a set of records as output containing the students scoring back to the JSP page where it has to be put into a table format.
how do i register the output type of "records" from the stored function in oracle in the "registerOutParameter" method of the "callable" statement in the JSP page.
if not by this way is there any method using which a "stored function/procedure" returning "record(s)" to the jsp page called using "callable" statement be retrieved to be used in the page. let me know any method other that writing a query for the database in the JSP page itself.I have a question for you:
If the stored procedure is doing nothing more than generating a set of results why are you even using one?
You could create a view or write a simple query like you mentioned.
If you're intent on going the stored procedure route, then I have a suggestion. Part of the JDBC 2.0 spec allows you to basically return an object from a CallableStatement. Its a little involved but can be done. An article that I ran across a while back really helped me to figure out how to do this. There URL to it is as follows:
http://www.fawcette.com/archives/premier/mgznarch/javapro/2000/03mar00/bs0003/bs0003.asp
Pay close attention to the last section of the article: Persistence of Structured Types.
Here's some important snippets of code:
String UDT_NAME = "SCHEMA_NAME.PRODUCT_TYPE_OBJ";
cstmt.setLong(1, value1);
cstmt.setLong(2, value2);
cstmt.setLong(3, value3);
// By updating the type map in the connection object
// the Driver will be able to convert the array being returned
// into an array of LikeProductsInfo[] objects.
java.util.Map map = cstmt.getConnection().getTypeMap();
map.put(UDT_NAME, ProductTypeObject.class);
super.cstmt.registerOutParameter(4, java.sql.Types.STRUCT, UDT_NAME);
* This is the class that is being mapped to the oracle object.
* There are two methods in the SQLData interface.
public class ProductTypeObject implements java.sql.SQLData, java.io.Serializable
* Implementation of method declared in the SQLData interface. This method
* is called by the JDBC driver when mapping the UDT, SCHEMA_NAME.Product_Type_Obj,
* to this class.
* The object being returned contains a slew of objects defined as tables,
* these are retrieved as java.sql.Array objects.
public void readSQL(SQLInput stream, String typeName) throws SQLException
String[] value1 = (String[])stream.readArray().getArray();
String[] value2 = (String[])stream.readArray().getArray();
public void writeSQL(SQLOutput stream) throws SQLException
}You'll also need to create Oracles Object. The specification for mine follows:
TYPE Detail_Type IS TABLE OF VARCHAR2(1024);
TYPE Product_Type_Obj AS OBJECT (
value1 Detail_Type,
value2 Detail_Type,
value3 Detail_Type,
value4 Detail_Type,
value5 Detail_Type,
value6 Detail_Type,
value7 Detail_Type,
value8 Detail_Type);Hope this helps,
Zac -
Naming the parameters of a callable statement
Hi!
I am having some kind of a problem here. I am currently working on a software with a database.OK, simple.
The problem is that we have different kind of databases (oracle, Sybase, DB2) AND different schema!
We are obviously trying to keep the persistence layer as cut from the rest as possible.
The problem is that in some cases, we may call a callable statement but the actual callable statement in the database is not the same as the one that would be called in a similar case with another schema.
Therefore, we are looking for a way to set the parameters of a callable statement by a name, not an index.
Instead of
setString(1,"aValue");
some
setString("FirstParameter", "aValue");
PLease help!
Cheers!
ChrisI think there is a driver that does that.Thanks for replying so quickly, could you tell me what
that driver would be ?Like I said I don't think it is going to help because it is for a specific data base. I you need to support more than one.
I think it is either Oracle (if you use the Oracle specific JDBC classes - cast to them) or one of the third party drivers.
>
I was thinking of the wrapper too but I, as the
(different)schemas are still changing and the callable
statement too, I think it will be very error prone
during the developpement cycle.
So I'd like to avoid to have to maintain a
"correspondance table" between each callable statement
and it's parameters...
And that is my idea. Developement cycles are always error prone so I am not sure that it matters. -
Calling a procedure/function in CO using Callable Statement
Hi,
Please help me in understanding this:
__method1__
BEGIN
:1 := Package.Function(
param1 => :2"
,param2 => :3"
,param3 => :4"
,param4 => :5"
END;
method2
BEGIN
Package.Function(:1, :2, :3, :4, :5);"
END;
Whats the significance of using method1?
I have seen the callable statements written as in method1 but, the parameters passed are not in order and not all params are passed.
When i tried writing similar code, I got "Invalid Column Index" exception. Please let me know how to overcome this.
ThanksHi,
You can call a function using Callable Statement as
public String checkprimarycontact(String pri_loc_id,String org_id,String party_id)
int p_location_id = 0;
int p_org_id = 0;
int p_party_id = 0;
p_location_id = Integer.parseInt(pri_loc_id);
p_org_id = Integer.parseInt(org_id);
p_party_id = Integer.parseInt(party_id);
String priflag = "";
try
Connection conn1 = getOADBTransaction().getJdbcConnection();
CallableStatement cstmt1 = conn1.prepareCall("{? = call GET_PRIMARY_FUNCTION(?,?,?)}");
cstmt1.registerOutParameter(1,Types.VARCHAR);
cstmt1.setInt(2,p_location_id);
cstmt1.setInt(3,p_org_id);
cstmt1.setInt(4,p_party_id);
cstmt1.execute();
priflag = cstmt1.getString(1);
catch(Exception e1)
e1.printStackTrace();
return priflag;
Thanks,
Gaurav -
How to get the returned value from Functions with Callable statement?
I was glad to find that stored procedures can be invoke with Java class code by the object of Callable statement like :
String stmt = "BEGIN departments_pkg.do_select(?,?,?); END;";
and getting the output variables by
populateAttribute(DEPARTMENTNAME,st.getString(2),true,false);
But i would like to get values returned from FUNCTION other than stored procedure, how can i achieve it? Thanks a lot!Here is my code
PROCESS BEFORE OUTPUT.
MODULE STATUS_1202.
MODULE subscreen_find.
CALL SUBSCREEN SUBSEARCH INCLUDING sy-cprog dynnr.
PROCESS AFTER INPUT.
MODULE USER_COMMAND_1202.
CALL SUBSCREEN SUBSEARCH.
MODULE subscreen_find.
case sy-ucomm.
when 'SELECTED'. "fcode
case 'ZSKILL_SEARCH'. "data element
when '01'. " value range
dynnr = 0110.
when '02'.
dynnr = 0111.
endcase.
endcase.
ENDMODULE.
kindly tell me what is wrong
Edited by: Raji Thomas on Feb 8, 2010 10:20 AM -
How it works (Calling Stored Procedure in DB2 Through Callable statement)
Can anyone Please tell me what exactly happens on calling ESP(External Stored Procedure) through Callable statement Database point of view and Callable point of view also.
eg:
CallableStatement cstmt = con.prepareCall(
"{call getTestData(?, ?)}");
cstmt .executeUpdate();
where getTestData is Stored Procedure in DB2.
Can anyone please guide me working on this scenario..
Message was edited by:
Nitin_GuptaCheck this post out:
http://forum.java.sun.com/thread.jspa?threadID=638768&messageID=3785982
But I think you should be getting results right? What do you mean you want it in a format other than resultset? -
Can call a function in the select statement?
Is there any ways to call a function in the select statement?
what I like to do is this:
select deptno, totalEmployees(deptno), TotalSalary(deptno)
from emp;
I know it can be done by count(*) and join tables, but my case
is much more complex and the where clauses are different from
one function to another, and have many tables to join and many
combinations
ThanksFunctions can be used in a select statement subject to certain
restrictions, see
http://otn.oracle.com/docs/products/oracle8i/doc_library/817_doc/
server.817/a85397/statem9b.htm#2062024
It's under "CREATE FUNCTION> Keywords and Parameters> function>
Restrictions on User-Defined Functions"
Here is an except...
When a function is called from within a query or DML statement,
the function cannot:
a) Have OUT or IN OUT parameters
b) Commit or roll back the current transaction, create or roll
back to a savepoint, or alter the session or the system. DDL
statements implicitly commit the current transaction, so a user-
defined function cannot execute any DDL statements.
c) Write to the database, if the function is being called from a
SELECT statement. However, a function called from a subquery in
a DML statement can write to the database.
d) Write to the same table that is being modified by the
statement from which the function is called, if the function is
called from a DML statement.
Except for the restriction on OUT and IN OUT parameters, Oracle
enforces these restrictions not only for the function called
directly from the SQL statement, but also for any functions that
function calls, and on any functions called from the SQL
statements executed by that function or any function it calls. -
Function call statement parameters
I have called some functions within a select query and the parameters are mentioned in the function call.
month, department_code,office,finincial_year
are the input parameters
these are fetched from the selected columns and are passed as parameters to the functions.
all this is in the same select query.
what names are to be written for this parameter list in the function call?
do i need to use the alias names of the selected columns or...?
the actual function has the parameters same as the variables mentioned in the query inside the function body.
Please let me know what to do
ASAP
ThanksActually, I have already tested using the first appraoch, but the result was not what i have expected.
My requirement is as follows:
this financial_year has to be passed as 2008-2009 format and this is the same format present in the view fro,m which it is being selected
I am not sure this is being passed correctly to the functions because when i tested the query inside the function to get the desired result using 2008-2009 format it has given me result as expected. but the same thing when tested using just 2008 gives just zero as the result.
hence i got to know that this value is not being passed correctly.
for each month, for a single office, and a single dept the count of policies has to be calculated.
what needs to be done.
2) this value has to be calculated per month and upto the month
per month is for the self same month
upto the month starts from the financial year to the cuent months that is passed to the function (APRIL to AUGUST, APRIL to SEPTEMBER ...so on)
ex: for the month count is 1 for august 3 for septmeber
upto the month values ought to be as 1 upto august, 4 upto septmeber
so i have added the statemetn as month betweem 'APRIL' and p_month in the function query.
but to my disappointment both 'for' and 'upto' values are coming as same.
any logic for this please -
Please, Not getting result set from callable statement (Code posted)
I am posting some simple code which should get a ResultSet from a CallableStatement object using the executeQuery() Method.
It is returning "No RsultSet was produced"
If I modify the code and simply output the CallableableStatement using its executeUpdate() then getString() methods it works fine. Anything obviously wrong with this bit of code? Thanks.
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import db.util.query.*;
import db.util.pool.*;
public class oracle extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
response.setContentType("text/html");
java.io.PrintWriter out = response.getWriter();
Connection con = ConnectionFactory.getConnection();
CallableStatement cs = null;
ResultSet rs = null;
int intID = 1;
try{
cs = con.prepareCall("{? = call test1(?)}");
cs.registerOutParameter(1, java.sql.Types.VARCHAR);
cs.setInt(2,intID);
/*These lines work on their own
*cs.executeUpdate();
*out.println("Name is : " + cs.getString(1));
//this code is what is not working...hmm
rs = cs.executeQuery();
while(rs.next()){
out.println(rs.getString("name"));
rs.close();
cs.close();
//the rest of this works too.
ConnectionFactory.releaseConnection(con);
catch(SQLException e){
out.println(e.getMessage());
Here's the stored procedure. I'm just trying to do a simple test to return multiple rows. The table has numberous records with the same id which is being passed to the function.
create or replace function test1 ( strInputID IN testtable.id%type)
return varchar2
is
strOutputName testtable.name%type;
found_it EXCEPTION;
begin
select name into strOutputName from testtable
where id = strInputID;
raise found_it;
exception
when no_data_found
then
return null;
when found_it
then
return strOutputName;
end;I've posted the code...it's doing a select. I think the problem is that to return multiple rows I need to return a cursor. But I've run into problems with both the MS and Oracle Drivers.
All I really want to do is to query a database using a callable statement(function in oracle) which will return multiple rows which I can process. I have been trying to do this in a servlet.
I can do it successfully for one column from one row, but not multiple columns from mulitple rows.
I've been searchging for some good examples and am trying different things but can't seem to get it to work. -
Error executing a callable statement on a pooled connection
Hi,
I have an Oracle function that returns a number:
create or replace function
S2B_STOP_STAGE (DOC_ID number, ST_ID number)
return number ...
and the following Java code:
Class.forName("weblogic.jdbc.pool.Driver").newInstance();
conn = DriverManager.getConnection("jdbc:weblogic:pool:madrigalPool");
String sql = "{? = call S2B_STOP_STAGE(401,1002)}";
CallableStatement stmt = conn.prepareCall(sql);
stmt.registerOutParameter(1, Types.INTEGER);
stmt.execute(sql);
res = stmt.getInt(1);
When the execute(sql) statement is executed, a SQLException is thrown:
java.sql.SQLException: ORA-01008: not all variables bound
at weblogic.jdbc.pool.PreparedStatement.execute(PreparedStatement.java:121)
Does anybody have an idea about what may be wrong? I am using Oracle
8.1.6, the thin driver classes12-81620.zip, and WebLogic 6.0 sp2.
Thanks,
VladimirI found out what was wrong. I should have used execute() instead of execute(sql)
on the callable statement...
Sorry for the problem.
Vladimir
"vladimir" <[email protected]> wrote:
>
Hi,
I have an Oracle function that returns a number:
create or replace function
S2B_STOP_STAGE (DOC_ID number, ST_ID number)
return number ...
and the following Java code:
Class.forName("weblogic.jdbc.pool.Driver").newInstance();
conn = DriverManager.getConnection("jdbc:weblogic:pool:madrigalPool");
String sql = "{? = call S2B_STOP_STAGE(401,1002)}";
CallableStatement stmt = conn.prepareCall(sql);
stmt.registerOutParameter(1, Types.INTEGER);
stmt.execute(sql);
res = stmt.getInt(1);
When the execute(sql) statement is executed, a SQLException is thrown:
java.sql.SQLException: ORA-01008: not all variables bound
at weblogic.jdbc.pool.PreparedStatement.execute(PreparedStatement.java:121)
Does anybody have an idea about what may be wrong? I am using Oracle
8.1.6, the thin driver classes12-81620.zip, and WebLogic 6.0 sp2.
Thanks,
Vladimir -
Callable Statement throws exception..pls help
When I use Callable Statement calling my function which returns Y if person is employee or nothing if not I get this error..
Procedure not createdORA-06550: line 1, column 22:
PLS-00103: Encountered the symbol "CHCK_EMP_STATUS" when expecting one of
the following:
. ( * @ % & = - + ; < / > at in mod not rem
<an exponent (**)> <> or != or ~= >= <= <> and or like
between is null is not || is dangling
The symbol "." was substituted for "CHCK_EMP_STATUS" to continue.
Here is my code..
import java.sql.*;
import java.io.*;
public class FunctionTest
public static void main(String args[])
Connection conn = null;
CallableStatement stmt = null;
ResultSet rs=null;
try
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("........");
stmt = conn.prepareCall("{call function chck_emp_status(?,?)}");
stmt.setString(1,"137897");
stmt.registerOutParameter(2,Types.VARCHAR);
stmt.execute();
String s = stmt.getString(1);
stmt.close();
conn.commit();
conn.close();
}//try
catch(Exception e)
System.out.println("Procedure not created"+e.getMessage());
finally
}//main
Please help...This is the function
CREATE OR REPLACE function chck_emp_status (id number) return varchar2
as
emp_id number;
results varchar(2);
cursor emp_status is
select id
from emp
where emp_status = 'A'
and emp_id = id;
begin
open emp_status;
fetch emp_status into emp_id;
if emp_id%notfound THEN
results := '';
else
results := 'Y';
end if;
close emp_id;
return results;
end; -
Using A callable statement in java
Hi all im trying to get results back from the database using a callable statement the problem is that it is placing / infront of single quotes.I need to get rid of this because it's not returning anything
here is my code
CallableStatement statementOne;
statementOne = ComparitiveAnalysisGUI.conn.prepareCall("{call graphProc(?,?,?,?,?,?,?)}");
statementOne.setString(1,"\"date_format(calldate, '%Y-%m-%d H:59:59'),avg(billsec)\"");
statementOne.setString(2,"Clovercdr");
statementOne.setString(3,start);
statementOne.setString(4,end);
statementOne.setString(5,"Boksburg");
statementOne.setString(6,"\"billsec > 0 and Network = " + network + "\"");
statementOne.setString(7,"\"date_format(calldate, '%Y-%m-%d %H:M:S')\"");
System.out.println(statementOne.toString());
rs = statementOne.executeQuery();
the result of the println is
com.mysql.jdbc.CallableStatement@ec4a87: CALL graphProc('"date_format(calldate, \'%Y-%m-%d %H:59:59\'),avg(billsec)"','Clovercdr','\'2006-03-14 00:00:01\'','\'2006-03-14 23:59:59\'','Boksburg','"billsec > 0 and Network = \'SAMobile\'"','"date_format(calldate, \'%Y-%m-%d %H:M:S\')"')
as you can see quite a mess please help if you can get the statement to look as follows
CALL graphProc("date_format(calldate, '%Y-%m-%d %H:59:59'),avg(billsec)",'Clovercdr','2006-03-14 00:00:01','2006-03-14 23:59:59','Boksburg',"billsec > 0 and Network = 'SAMobile'","date_format(calldate, '%Y-%m-%d %H:M:S')")
thanks BrianOk in order to understand why I did what I did parhaps it would be best if you saw my Stored procedure
create procedure graphProc(col varchar(100),company varchar(20),startTime datetime,endTime datetime,branchName varchar(20),andSection varchar(200),groupSec varchar(100))
BEGIN
SET @stmt := CONCAT("SELECT ",col," from ",company," where calldate between '",startTime,"' and '",endTime,"' and branchName = '",branchName,"' and ",andSection," Group by ",groupSec);
PREPARE stmt1 from @stmt;
EXECUTE stmt1;
the call is for example
call graphProc("date_format(calldate, '%Y-%m-%d %H:59:59'),avg(billsec)",'Clovercdr','2006-03-01 00:00:01','2006-03-14 23:59:59','Boksburg',"billsec > 0 and date_format(calldate, '%k') BETWEEN 7 AND 19 and Network = 'SAMobile'","date_format(calldate, '%Y-%m-%d %H:M:S')")//
as you can see In MySQL the "date_format(calldate, '%Y-%m-%d %H:59:59'),avg(billsec)" has to be quoted like this, so it can recognise it as a single parameter, since , '%Y-%m-%d %H:59:59' is viewed as another parameter
thaks for your reply
Brian -
Java.lang.VerifyError - Incompatible object argument for function call
Hi all,
I'm developing a JSP application (powered by Tomcat 4.0.1 in JDK 1.3, in Eclipse 3.3). Among other stuff I have 3 classes interacting with an Oracle database, covering 3 use cases - renaming, adding and deleting an database object. The renaming class simply updates the database with a String variable it receives from the request object, whereas the other two classes perform some calculations with the request data and update the database accordingly.
When the adding or deleting classes are executed, by performing the appropriate actions through the web application, Tomcat throws the following:
java.lang.VerifyError: (class: action/GliederungNewAction, method: insertNewNode signature: (Loracle/jdbc/driver/OracleConnection;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V) Incompatible object argument for function call
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:120)
at action.ActionMapping.perform(ActionMapping.java:53)
at ControllerServlet.doResponse(ControllerServlet.java:92)
at ControllerServlet.doPost(ControllerServlet.java:50)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
...The renaming works fine though. I have checked mailing lists and forums as well as contacted the company's java support but everything I have tried out so far, from exchanging the xerces.jar files found in JDOM and Tomcat to rebuidling the project didn't help.
I just can't explain to myself why this error occurs and I don't see how some additional Java code in the other 2 classes could cause it?
I realize that the Tomcat and JDK versions I'm using are totally out of date, but that's company's current standard and I can't really change that.
Here's the source code. I moved parts of the business logic from Java to Oracle recently but I left the SQL statements that the Oracle stored procedures are executing if it helps someone.
package action;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.StringTokenizer;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import oracle.jdbc.driver.OracleConnection;
* This class enables the creation and insertion of a new catalogue node. A new node
* is always inserted as the last child of the selected parent node.
public class GliederungNewAction implements Action {
public String perform(ActionMapping mapping, HttpServletRequest request,
HttpServletResponse response) {
// fetch the necessary parameters from the JSP site
// the parent attribute is the selected attribute!
String parent_attribute = request.getParameter("attr");
String catalogue = request.getParameter("catalogue");
int parent_sequenceNr = Integer.parseInt(request.getParameter("sort_sequence"));
// connect to database
HttpSession session = request.getSession();
db.SessionConnection sessConn = (db.SessionConnection) session.getAttribute("connection");
if (sessConn != null) {
try {
sessConn.setAutoCommit(false);
OracleConnection connection = (OracleConnection)sessConn.getConnection();
int lastPosition = getLastNodePosition( getLastChildAttribute(connection, catalogue, parent_attribute) );
String newNodeAttribute = createNewNodeAttribute(parent_attribute, lastPosition);
// calculate the sequence number
int precedingSequenceNumber = getPrecedingSequenceNumber(connection, catalogue, parent_attribute);
if ( precedingSequenceNumber == -1 ) {
precedingSequenceNumber = parent_sequenceNr;
int sortSequence = precedingSequenceNumber + 1;
setSequenceNumbers(connection, catalogue, sortSequence);
// insert the new node into DB
insertNewNode(connection, catalogue, newNodeAttribute, parent_attribute, "Neuer Punkt", sortSequence);
connection.commit();
} catch(SQLException ex) {
ex.printStackTrace();
return mapping.getForward();
* Creates, fills and executes a prepared statement to insert a new entry into the specified table, representing
* a new node in the catalogue.
private void insertNewNode(OracleConnection connection, String catalogue, String attribute, String parent_attribute, String description, int sortSequence) {
try {
String callAddNode = "{ call fasi_lob.pack_gliederung.addNode(:1, :2, :3, :4, :5) }";
CallableStatement cst;
cst = connection.prepareCall(callAddNode);
cst.setString(1, catalogue);
cst.setString(2, attribute);
cst.setString(3, parent_attribute);
cst.setString(4, description);
cst.setInt(5, sortSequence);
cst.execute();
cst.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
// String insertNewNode = "INSERT INTO vstd_media_cat_attributes " +
// "(catalogue, attribute, parent_attr, description, sort_sequence) VALUES(:1, :2, :3, :4, :5)";
// PreparedStatement insertStmt;
// try {
// insertStmt = connection.prepareStatement(insertNewNode);
// insertStmt.setString(1, catalogue);
// insertStmt.setString(2, attribute);
// insertStmt.setString(3, parent_attribute);
// insertStmt.setString(4, description);
// insertStmt.setInt(5, sortSequence);
// insertStmt.execute();
// insertStmt.close();
// } catch (SQLException e) {
// e.printStackTrace();
* This method returns the attribute value of the last child of the parent under which
* we want to insert a new node. The result set is sorted in descending order and only the
* first result (that is, the last child under this parent) is fetched.
* If the parent node has no children, "parent_attr.0" is returned.
* @param connection
* @param catalogue
* @param parent_attribute
* @return attribute of the last child under this parent, or "parent_attr.0" if parent has no children
private String getLastChildAttribute(OracleConnection connection, String catalogue, String parent_attribute) {
String queryLastChild = "SELECT attribute FROM vstd_media_cat_attributes " +
"WHERE catalogue=:1 AND parent_attr=:2 ORDER BY sort_sequence DESC";
String lastChildAttribute;
PreparedStatement ps;
try {
ps = connection.prepareStatement(queryLastChild);
ps.setString(1, catalogue);
ps.setString(2, parent_attribute);
ResultSet rs = ps.executeQuery();
/* If a result is returned, the selected parent already has children.
* If not set the lastChildAttribute to parent_attr.0
if (rs.next()) {
lastChildAttribute = rs.getString("attribute");
} else {
lastChildAttribute = parent_attribute.concat(".0");
rs.close();
return lastChildAttribute;
} catch (SQLException e) {
e.printStackTrace();
return null;
* This helper method determines the position of the last node in the attribute.
* i.e for 3.5.2 it returns 2, for 2.1 it returns 1 etc.
* @param attribute
* @return position of last node in this attribute
private int getLastNodePosition(String attribute) {
StringTokenizer tokenizer = new StringTokenizer(attribute, ".");
String lastNodePosition = "0";
while( tokenizer.hasMoreTokens() ) {
lastNodePosition = tokenizer.nextToken();
return Integer.parseInt(lastNodePosition);
* This method calculates the attribute of a node being inserted
* by incrementing the last child position by 1 and attaching the
* incremented position to the parent.
* @param parent_attr
* @param lastPosition
* @return attribute of the new node
private String createNewNodeAttribute(String parent_attr, int lastPosition) {
String newPosition = new Integer(lastPosition + 1).toString();
return parent_attr.concat("." + newPosition);
* This method checks if the required sequence number for a new node is already in use and
* handles the sequence numbers accordingly.
* If the sequence number for a new node is NOT IN USE, the method doesn't do anything.
* If the sequence number for a new node is IN USE, the method searches for the next free
* sequence number by incrementing the number by one and repeating the query until no result
* is found. Then all the sequence numbers between the required number (including, >= relation)
* and the nearest found free number (not including, < relation) are incremented by 1, as to
* make space for the new node.
* @param connection
* @param catalogue
* @param newNodeSequenceNumber required sequence number for the new node
private void setSequenceNumbers(OracleConnection connection, String catalogue, int newNodeSequenceNumber) {
// 1. check if the new sequence number exists - if no do nothing
// if yes - increment by one and see if exists
// repeat until free sequence number exists
// when found increment all sequence numbers freeSeqNr > seqNr >= newSeqNr
String query = "SELECT sort_sequence FROM vstd_media_cat_attributes " +
"WHERE catalogue=:1 AND sort_sequence=:2";
PreparedStatement ps;
try {
ps = connection.prepareStatement(query);
ps.setString(1, catalogue);
ps.setInt(2, newNodeSequenceNumber);
ResultSet rs = ps.executeQuery();
// if no result, the required sequence number is free - nothing to do
if( rs.next() ) {
int freeSequenceNumber = newNodeSequenceNumber;
do {
ps.setString(1, catalogue);
ps.setInt(2, freeSequenceNumber++);
rs = ps.executeQuery();
} while( rs.next() );
// increment sequence numbers - call stored procedure
String callUpdateSeqeunceNrs = "{ call fasi_lob.pack_gliederung.updateSeqNumbers(:1, :2, :3) }";
CallableStatement cst = connection.prepareCall(callUpdateSeqeunceNrs);
cst.setString(1, catalogue);
cst.setInt(2, newNodeSequenceNumber);
cst.setInt(3, freeSequenceNumber);
cst.execute();
cst.close();
// String query2 = "UPDATE vstd_media_cat_attributes " +
// "SET sort_sequence = (sort_sequence + 1 ) " +
// "WHERE catalogue=:1 sort_sequnce >=:2 AND sort_sequence <:3";
// PreparedStatement ps2;
// ps2 = connection.prepareStatement(query2);
// ps2.setString(1, catalogue);
// ps2.setInt(2, newNodeSequenceNumber);
// ps2.setInt(3, freeSequenceNumber);
// ps.executeUpdate();
// ps.close();
} // end of if block
rs.close();
} catch (SQLException e) {
e.printStackTrace();
* This method finds the last sequence number preceding the sequence number of a node
* that is going to be inserted. The preceding sequence number is required to calculate
* the sequence number of the new node.
* We perform a hierarchical query starting from the parent node: if a result is returned,
* we assign the parent's farthest descendant's node sequence number; if no result
* is returned, we assign the parent's sequence number.
* @param connection
* @param catalogue
* @param parent_attr parent attribute of the new node
* @return
private int getPrecedingSequenceNumber(OracleConnection connection, String catalogue, String parent_attr) {
int sequenceNumber = 0;
String query = "SELECT sort_sequence FROM vstd_media_cat_attributes " +
"WHERE catalogue=:1 " +
"CONNECT BY PRIOR attribute = parent_attr START WITH parent_attr=:2 " +
"ORDER BY sort_sequence DESC";
try {
PreparedStatement ps = connection.prepareStatement(query);
ps.setString(1, catalogue);
ps.setString(2, parent_attr);
ResultSet rs = ps.executeQuery();
if ( rs.next() ) {
sequenceNumber = rs.getInt("sort_sequence");
} else {
// TODO: ggf fetch from request!
sequenceNumber = -1;
rs.close();
ps.close();
} catch (SQLException e) {
e.printStackTrace();
return sequenceNumber;
}After further googling I figured out what was causing the problem: in eclipse I was referring to external libraries located in eclipse/plugins directory, whereas Tomcat was referring to the same libraries (possibly older versions) in it's common/lib directory.
Maybe you are looking for
-
Hi, maybe I'm missing something but why doesn't iCal have a web based version that syncs with the home version in the same way that MAIL does. I know that you can PUBLISH to the web, but wouldn't the obvious solution be to also have a web based versi
-
Numbers locks up on "Formatting cells..."
I have uncovered what must be a massive bug in iWork Numbers for Mac. This is now happening to me all of the time. Periodically when I apply a simple formatting to a column, such as currency or number format, the app shows a modal dialog that says "F
-
(--x) Vs (- - x)
int x; x = (x=1) + (x=7)* (- - x); System.out.println( x ); why does the output of the above statements differ from the one given below.. int x; x = (x=1) + (x=7)* (--x); System.out.println( x ); Thanks in advance....
-
Can apple still replace my iphone for free??
My iphone 4 is under warranty and one of the buttons on the side to lower the volume doesn't work, it's just stiff and therefore i can not press it, my iphone speakers doesn't work either, whenever I put it on loud speaker no sound can be picked up a
-
Content slides in question pools?
Can content slides be used in question pools? Same for random question mode? I am in a captivate 7 trial.