PL Sql create/replace proc via jdbc, possible, wl7.0sp1?

Hi,
Sorry for this basic question, I've looked in the archives and can't find an answer.
I need to dynamically create users on an oracle 8i db and run a script to create
a standard set of tables for them from Weblogic server jdbc.
The problem I have is that the script not only creates some tables but also populates
them with a procedure (example below).
My question is simply:
Is this possible to do using JDBC, or do I need to "Runtime.getRuntime().exec..."
the PLSQL exe under windows and write the script to it.
Thanks
David
Script:
CREATE OR REPLACE PROCEDURE populate_d_time IS
timeID d_time.time_id%TYPE;
timeOfDay d_time.time_of_day%TYPE;
hourOfDay d_time.hour_of_day%TYPE;
minuteOfHour d_time.minute_of_hour%TYPE;
secondOfMinute d_time.second_of_minute%TYPE;
BEGIN
--initialise
timeID := 1;
timeOfDay := TO_DATE('00:00:00', 'HH24:MI:SS');
--start looping, stop at ending time
WHILE (timeOfDay <= TO_DATE('23:59:59', 'HH24:MI:SS')) LOOP
--get information about the data
hourOfDay := TO_CHAR(timeOfDay, 'HH24');
minuteOfHour := TO_CHAR(timeOfDay, 'MI');
secondOfMinute := TO_CHAR(timeOfDay, 'SS');
INSERT INTO d_time
VALUES (timeID, hourOfDay, minuteOfHour, secondOfMinute, timeOfDay);
--increment
timeID := timeID + 1;
timeOfDay := timeOfDay + (1/86400); -- Add one second
END LOOP;
END;

Thanks, but my question was can you create a plsql statement from java.
I think you can only create them in sqlplus, so I assume therefore that I have
to shell sqlplus.exe from java and write the script to it's inputstream.
-unless anyone knows a way of doing this from a connection object which would
be more elegant.
Thanks
DB
Mitesh Patel <[email protected]> wrote:
If you already have stored procedure created, you can use callablestatement
to execute
it. Look for examples on callablestatement. You can do it sure.
Mitesh
David Bisbal wrote:
Hi,
Sorry for this basic question, I've looked in the archives and can'tfind an answer.
I need to dynamically create users on an oracle 8i db and run a scriptto create
a standard set of tables for them from Weblogic server jdbc.
The problem I have is that the script not only creates some tablesbut also populates
them with a procedure (example below).
My question is simply:
Is this possible to do using JDBC, or do I need to "Runtime.getRuntime().exec..."
the PLSQL exe under windows and write the script to it.
Thanks
David
Script:
CREATE OR REPLACE PROCEDURE populate_d_time IS
timeID d_time.time_id%TYPE;
timeOfDay d_time.time_of_day%TYPE;
hourOfDay d_time.hour_of_day%TYPE;
minuteOfHour d_time.minute_of_hour%TYPE;
secondOfMinute d_time.second_of_minute%TYPE;
BEGIN
--initialise
timeID := 1;
timeOfDay := TO_DATE('00:00:00', 'HH24:MI:SS');
--start looping, stop at ending time
WHILE (timeOfDay <= TO_DATE('23:59:59', 'HH24:MI:SS')) LOOP
--get information about the data
hourOfDay := TO_CHAR(timeOfDay, 'HH24');
minuteOfHour := TO_CHAR(timeOfDay, 'MI');
secondOfMinute := TO_CHAR(timeOfDay, 'SS');
INSERT INTO d_time
VALUES (timeID, hourOfDay, minuteOfHour, secondOfMinute, timeOfDay);
--increment
timeID := timeID + 1;
timeOfDay := timeOfDay + (1/86400); -- Add one second
END LOOP;
END;

Similar Messages

  • ORA-00604: error occurred at recursive SQL when calling proc via db_link

    Hi,
    I'm on 9.2.0.8 and got strange issue with simple test case
    on source db:
    CREATE OR REPLACE PROCEDURE ADMIN.gg_ref(out_tokens OUT SYS_REFCURSOR) is
      BEGIN
      OPEN out_tokens for select dummy from dual;
    END ;
    Now testing code localy:
    SQL> var r refcursor
    SQL> declare
      2   output sys_refcursor;
      3  begin
      4   adminx.gg_ref(output);
      5  :r:=output;
      6  end;
      7  /
    PL/SQL procedure successfully completed.
    SQL> print r
    D
    X
    So its working.
    I've got db_link to that db , and now call that proc via dblink from other 9.2.0.8 DB:
    var r refcursor
      1  declare
      2   output sys_refcursor;
      3  begin
      4   admin.gg_ref@LINK_NAME(output);
      5  :r:=output;
      6* end;
    SQL> /
    declare
    ERROR at line 1:
    ORA-00604: error occurred at recursive SQL level 1
    ORA-00900: invalid SQL statementWhats wrong with my code ?
    Are there any restriction I'm not aware of ?
    Regards
    GregG

    GregG wrote:
    What should my code look like now ?
    Should I rewrite this as function returning index by collection or something ?You can use DBMS_SQL - but use the remote package and not the local one. This is a little bit more complex ito call interface than using a ref cursor, but is the very same thing on the server side. DBMS_SQL also provides a more comprehensive set of features than using the ref cursor interface.
    The main issue though is additional coding - as DBMS_SQL is a lower level interface (a lot closer to the real Oracle Call Interface/OCI):
    --// on remote database the procedure returns a DBMS_SQL cursor instead of a ref cursor
    SQL> create or replace procedure FooProc( cur in out number, deptID number ) is
      2          rc      number;
      3  begin
      4          cur := DBMS_SQL.open_cursor;
      5 
      6          DBMS_SQL.parse(
      7                  cur,
      8                  'select ename from emp where deptno = :deptID',
      9                  DBMS_SQL.native
    10          );
    11 
    12          DBMS_SQL.Bind_Variable( cur, 'deptID', deptID );
    13 
    14          rc := DBMS_SQL.Execute( cur );
    15  end;
    16  /
    Procedure created.
    --// from the local database side we call this remote proc
    SQL> declare
      2          c               number;  --// instead of using sys_refcursor
      3          empName         varchar2(10); --// buffer to fetch column into
      4  begin
      5          FooProc@testdb( c, 10 );  --/ call the proc that creates the cursor
      6 
      7          --// we need to define our fetch buffer for the 1st column in the
      8          --// SQL projection of that cursor (10 byte fetch buffer for 1st column)
      9          DBMS_SQL.define_column@testdb( c, 1, empName, 10 );
    10 
    11          --// we now fetch from this cursor, but via the DBMS_SQL
    12          --// interface
    13          loop
    14                  --// fetch the row (exit when 0 rows are fetched)
    15                  exit when DBMS_SQL.Fetch_Rows@testdb( c ) = 0;
    16 
    17                  --// copy value of 1st column in row into the local PL/SQL buffer
    18                  DBMS_SQL.column_value@testdb( c, 1, empName );
    19 
    20                  --// record value it via dbms output
    21                  DBMS_OUTPUT.put_line( 'name='||empName||' deptID=10' );
    22          end loop;
    23 
    24          --// close it explicitly as you would a ref cursor
    25          DBMS_SQL.Close_Cursor@testdb( c );
    26  end;
    27  /
    name=CLARK deptID=10
    name=KING deptID=10
    name=MILLER deptID=10
    PL/SQL procedure successfully completed.
    SQL>

  • Problem Obtaining multiple results from MySql Stored Proc via JDBC

    I've spent alot of time on this and I'd be really grateful for anyones help please!
    I have written a java class to execute a MySQL stored procedure that does an UPDATE and then a SELECT. I want to handle the resultset from the SELECT AND get a count of the number of rows updated by the UPDATE. Even though several rows get updated by the stored proc, getUpdateCount() returns zero.
    It's like following the UPDATE with a SELECT causes the updatecount info to be lost. I tried it in reverse: SELECT first and UPDATE last and it works properly. I can get the resultset and the updatecount.
    My Stored Procedure:
    delimiter $$ CREATE PROCEDURE multiRS( IN drugId int, IN drugPrice decimal(8,2) ) BEGIN UPDATE drugs SET DRUG_PRICE = drugPrice WHERE DRUG_ID > drugId; SELECT DRUG_ID, DRUG_NAME, DRUG_PRICE FROM Drugs where DRUG_ID > 7 ORDER BY DRUG_ID ASC; END $$
    In my program (below) callablestatement.execute() returns TRUE even though the first thing I do in my stored proc is an UPDATE not a SELECT. Is this at odds with the JDBC 2 API? Shouldn't it return false since the first "result" returned is NOT a resultset but an updatecount? Does JDBC return any resultsets first by default, even if INSERTS, UPDATES happened in the stored proc before the SELECTs??
    Excerpt of my Java Class:
    // Create CallableStatement CallableStatement cs = con.prepareCall("CALL multiRS(?,?)"); // Register input parameters ........ // Execute the Stored Proc boolean getResultSetNow = cs.execute(); int updateCount = -1; System.out.println("getResultSetNow: " +getResultSetNow); while (true) { if (getResultSetNow) { ResultSet rs = cs.getResultSet(); while (rs.next()) { // fully process result set before calling getMoreResults() again! System.out.println(rs.getInt("DRUG_ID") +", "+rs.getString("DRUG_NAME") +", "+rs.getBigDecimal("DRUG_PRICE")); } rs.close(); } else { updateCount = cs.getUpdateCount(); if (updateCount != -1) { // it's a valid update count System.out.println("Reporting an update count of " +updateCount); } } if ((!getResultSetNow) && (updateCount == -1)) break; // done with loop, finished all the returns getResultSetNow = cs.getMoreResults(); }
    The output of running the program at command line:
    getResultSetNow: true 28, Apple, 127.00 35, Orange, 127.00 36, Bananna, 127.00 37, Berry, 127.00 Reporting an update count of 0
    During my testing I have noticed:
    1. According to the Java documentation execute() returns true if the first result is a ResultSet object; false if the first result is an update count or there is no result. In my java class callablestatement.execute() will return TRUE if in the stored proc the UPDATE is done first and then the SELECT last or vica versa.
    2. My java class (above) is coded to loop through all results returned from the stored proc in succession. Running this class shows that any resultsets are returned first and then update counts last regardless of the order in which they appear in the stored proc. Maybe there is nothing unusual here, it may be that Java is designed to return any Resultsets first by default even if they didn't happen first in the stored procedure?
    3. In my stored procedure, if the UPDATE happens last then callablestatement.getUpdateCount() will return the correct number of updated rows.
    4. If the UPDATE is followed by a SELECT (see above) then callablestatement.getUpdateCount() will return ZERO even though rows were updated.
    5. I tested it with the stored proc doing SELECT - UPDATE - SELECT and again getUpdateCount() returns ZERO.
    6. I tested it with the stored proc doing SELECT - UPDATE - SELECT - UPDATE and this time getUpdateCount() returns the number rows updated by the last UPDATE and not the first.
    My Setup:
    Mac OS X 10.3.9
    Java 1.4.2
    mysql database 5.0.19
    mysql-connector 5.1.10 (connector/J)
    Maybe I have exposed a bug in JDBC?
    Thanks for your help.

    plica10 wrote:
    Jschell thank you for your response.
    I certainly don't mean to be rude but I often get taken that way. I like to state facts as I see them. I'd love to be proved wrong because then I would understand why my code doesn't work!
    Doesn't matter to me if you are rude or not. Rudeness actually makes it more entertaining for me so that is a plus. Nothing I have seen suggests rudeness.
    In response to your post:
    When a MySql stored procedure has multiple sql statements such as SELECT and UPDATE these statements each produce what the Java API documentation refers to as 'results'. A Java class can cycle through these 'results' using callableStatement dot getMoreResults(), getResultSet() and getUpdateCount() to retrieve the resultset object produced by Select queries and updateCount produced by Inserts, Deletes and Updates.
    As I read your question it seems to me that you have already proven that it does not in fact do that?
    You don't have to read this but in case you think I'm mistaken, there is more detail in the following website under the heading 'Using the Method execute':
    http://docsrv.sco.com/JDK_guide/jdbc/getstart/statement.doc.html#1000107
    Sounds reasonable. But does not your example code prove that this is not what happens for the database and driver that you are using?
    Myself I dont trust update counts at all since, in my experience some databases do not return them. And per other reports sometimes they don't return the correct value either.
    So there are two possibilities - your code is wrong or the driver/database does not do it. For me I would also question whether in the future the driver/database would continue to behave the same if you did find some special way to write your SQL so it does do it. And of course you would also need to insure that every proc that needed this would be written in this special way. Hopefully not too many of those.
    So this functionality is built into java but is not in common use amongst programmers. My java class did successfully execute a stored proc which Selected from and then finally Updated a table. My code displayed the contents of the Select query and told me how many rows were affected by the update.
    It isn't "built into java". It isn't built into jdbc either. If it works at all then the driver and by proxy the database are responsible for it. I suspect that you would be hard pressed to find anything in the JDBC spec that requires what that particular link claims. I believe it is difficult to find anything that suggests that update counts in any form are required.
    So you are left with hoping that a particular driver does do it.
    I suppose it is rare that you would want to do things this way. Returning rowcounts in OUT parameters would be easier but I want my code to be modular enough to cover the situation where a statement may return more than one ResultSet object, more than one update count, or a combination of ResultSet objects and update counts. The sql may need to be generated dynamically, its statements may be unknown at compile time. For instance a user might have a form that allows them to build their own queries...
    Any time I see statements like that it usually makes me a bit uncomfortable. If I am creating data layers I either use an existing framework or I generate the code. For the latter there is no generalization of the usage. Every single operation is laid out in its own code.
    And I have in fact created generalized frameworks in the past before. I won't do it again. Benefits of the other idioms during maintenance are too obvious.

  • [How To] access Ms SQL Server2k multiple instance via JDBC?

    hi,
    could anybody tell me how to?
    sql server 'servera': ms sql 2000 enterprise (english)
    installed 3 name instances ('instance1','instance2' and 'instance3')
    jdbc driver: i-net opta 2000
    I don't find any parameter like 'instance' in driver's document, so how could I present my db instance?
    Here is my attemp, but not hit:
    "jdbc:inetdae7:servera\instance1?database=aaa" via tcp/ip and
    "jdbc:inetdae7:\\servera$instance1\pipe\sql\query?database=aaa" via pipe
    who can help me, thanks

    Though I am not an expert in this area, I wish to give my thoughts. Each instance will be listening to a particular port. So in the url string you can specify the port to connect to the particular instance. For example
    jdbc:oracle:thin:@127.0.0.1:1521:oracle","scott","tiger
    the above url string is for the instance running on my local box listening to port 1521.
    If I have one more instance running on 1523, I just change the port number.
    Hope this gives you some insight.
    Cheers.
    Sekar

  • Execute anonymous PL/SQL block via JDBC - OUT parameter not available

    I have a simple proc on the database:
    CREATE PROCEDURE TEST(X OUT BINARY_INTEGER, Y IN VARCHAR) AS
    BEGIN
      X := 33;
    END; I am trying to invoke it via JDBC using an anonymous PL/SQL block:
            try {
                Connection connection =
                  DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL",
                    "scott", "tiger");
                CallableStatement stproc_stmt = connection.prepareCall(
                    "DECLARE\n" +
                    " X_TARGET BINARY_INTEGER;\n" +
                    " Y_TARGET VARCHAR(20) := :2;\n" +
                    "BEGIN\n" +
                    " TEST(X=>X_TARGET, Y=>Y_TARGET);\n" +
                    " :1 := X_TARGET;\n" +
                    "END;"
                stproc_stmt.registerOutParameter(1, Types.NUMERIC);
                stproc_stmt.setString(2, "test");
                stproc_stmt.executeUpdate();
                Object o = stproc_stmt.getObject(1);
            catch (Exception e) {
                e.printStackTrace();
            } No exceptions are thrown, but the Object o does not get the value '33' - it is NULL.
    Any ideas?
    thanks in advance,
    Mike Norman

    I think the issue may be in how JDBC parameter binding is being managed throughout the block's lifecycle.
    The slightly-different TEST2 works:
    CREATE PROCEDURE TEST2(Y IN VARCHAR, X OUT BINARY_INTEGER) AS
    BEGIN
      X := 33;
    END;
    try {
        Connection connection =
          DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL",
         "scott", "tiger");
        CallableStatement stproc_stmt = connection.prepareCall(
         "DECLARE\n" +
         " Y_TARGET VARCHAR(20) := :1;\n" +
         " X_TARGET BINARY_INTEGER;\n" +
         "BEGIN\n" +
         " TEST2(Y=>Y_TARGET, X=>X_TARGET);\n" +
         " :2 := X_TARGET;\n" +
         "END;"
        stproc_stmt.setString(1, "test");
        stproc_stmt.registerOutParameter(2, Types.NUMERIC);
        stproc_stmt.executeUpdate();
        Object o = stproc_stmt.getObject(1);
    catch (Exception e) {
        e.printStackTrace();
    }The order of the bind indices ':1' and ':2' are reversed in the above anonymous block - we are returning via ':2'.
    I am wondering if 'under the covers' there isn't perhaps a cursor issue. When the original block is parsed and the first bind index is found to be position 2, somehow we can't go back to position 1 - a forwards-only cursor?

  • Connecting to MS SQL 2005 via JDBC Driver

    I have an application in which I use Java to abstract
    database elements as objects and handle most of the server-side
    processing. This is done by creating a Java object via
    CreateObject(). The Java then connects to a MS SQL 2005 database
    using the JDBC 1.1 Driver.
    The following tutorial explains how to set this up:
    http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=ded4216b.
    It instructs you to create a Data Source, much like how you
    typically would in "regular" ColdFusion applications. Then, using
    some simple Java, I am successfully able to connect to the
    database, query it, and get results. The connection code is
    attached.
    As you can see, I am still passing all the connection
    parameters to the Database class constructor. My question is: how
    would I go about connecting to the database by simply using the
    Data Source Name, as you would, again, in "regular" ColdFusion
    applications. Is this possible at all?
    Thanks!

    Thanks for the input guys.
    Perhaps I did not explain my intent very clearly. What I am
    trying to accomplish is have a vast majority of the server-side
    code done in Java. With that, I would be able to do things like:
    <cfset myUser = CreateObject("java", "User").init(5)>
    <cfoutput>#myUser.getFirstName()#</cfoutput>
    However, unless I am able to connect to the database in Java
    (which I currently AM able to do, but just not quite the way I want
    to), I would have to run all the queries in CF and then pass them
    to the different objects so that they can then process the query
    results. This isn't a very smart thing to do, seeing that it binds
    me to a lot of CF while I am trying use it as little as possible
    (session management and user interface "tier" only).
    So no, I am not going all out with Java just to avoid passing
    username/password, but instead to use true OOP instead of CF
    Components. I realize ColdFusion too passes this info, but it does
    not show up in the source code, which is precisely what I need to
    do, but with Java.
    Basically, I have everything working the way I need now,
    except I need to be able to connect using a data source name rather
    than passing the parameters, if at all possible.

  • Creating APEX pages via SQL scripts..

    Hi Guys,
    I want to create APEX pages via SQL Script. The main reason to have this option that I have couple of applications which has XML files for screen definition where I can read all screen properties (field types, sizes, caption, etc...)
    Is there any documentation or help stuff where I can find the APEX page definition tables? I found something like WWV tables but I couldnt figure it out properly...
    Any help ?
    Thanks,
    Osman...

    We have built our entire apex app in a similar way. We create the shell apex pages using apex (eg, Item Detail, Insert Item, etc.). Then we create a PL/SQL region on the page. The PL/SQL region simply calls a stored procedure to render the controls on the page. For example, our regions looks similar to this:
    begin
    apex_pkg.sp_render_page('ITEM_DETAIL',Param1,Param2,Param3);
    end;
    The sp_render_page procedure in the database generates the appropriate HTML for the page. This procedure reads meta data in the database (eg, field label, field size, field type, field position, etc.) and renders the same HTML that apex would render if the apex page was manually created. For example, in the procedure we use lines similar to these:
    HTP.p(apex_item.text(...))
    HTP.p(apex_item.select_list_from_query(...))
    Because the procedure is reading meta data, the apex page is dynamic and can be different for different users or clients.
    Darrin

  • Access MS SQL 7.0 via JDBC

    I am using following code to connect to the MS SQL database:
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    connection = DriverManager.getConnection("Provider=SQLOLEDB.1;" +
    "Integrated Security=SSPI;" +
    "Persist Security Info=False;" +
    "Initial Catalog=Northwind;" +
    "Data Source=KOLOSKOV");
    please tell why it raises an SQLException: "No suitable driver". Or is any way to connect to the database without DSN creation.

    Try this code
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    Connection dbConnection = DriverManager.getConnection("jdbc:odbc:KOLOSKOV", "DataBaseUserID", "Password");

  • Creating a CLOB in jdbc

    I have a PL/SQL stored procedure which accepts a CLOB data type as one of the arguments. This procedure inserts a record into a table which has a column of datatype CLOB.
    Using jdbc, my java program creates a CallableStatement to the stored proc. Now I wish to create the CLOB based on a String value and pass it to the stored proc.
    This is a snippet of my code.
    import java.io.*;
    import java.sql.*;
    import oracle.jdbc.driver.*;
    import oracle.sql.*;
    public class TestClob2 {
    public static Connection getConnection() throws FPError {
    Connection connection = null;
    String hostname= "ahost";
    String host = "jdbc:oracle:thin:@" + hostname+ ":1521:db";
    String user = "user";
    try {
    DriverManager.registerDriver( new oracle.jdbc.driver.OracleDriver());
    connection = DriverManager.getConnection(host, user, user);
    } catch ( Exception e ){
    System.out.println("could not get connection" + e.toString());
    } catch ( Throwable t ){
    System.out.println("could not get connection" + t.toString());
    } finally {
    return connection;
    public static void main( String[] args){
    Connection con = null;
    try {
    con = getConnection();
    OracleCallableStatement stmt = (OracleCallableStatement) con.prepareCall("{call plsqlStoredProc(? )}");
    String message="Test for Clob";
    try
    oracle.sql.CLOB cl = new oracle.sql.CLOB( (OracleConnection) con);
    //byte[] msg = message.getBytes("UTF8");
    //CLOB cl = new CLOB( (OracleConnection) con, msg);
    if ( cl == null ) System.out.println("clob is null");
    long index = cl.getLength();
    System.out.println("length is " + l );
    int i = cl.putString(index+1, message);
    stmt.setCLOB(1, cl);
    stmt.executeUpdate();
    catch (SQLException excep)
    System.out.println(excep.getMessage());
    excep.printStackTrace();
    //new LogException(excep.getMessage());
    } catch (Exception e ) {
    System.out.println("caught exception " + e.toString());
    e.printStackTrace();
    } finally {
    try { if (con != null ) con.close(); } catch ( Exception e){ }
    I get the following error
    caught exception java.lang.NullPointerException:
    java.lang.NullPointerException:
    at oracle.sql.Datum.getBytes(Datum.java:147)
    at oracle.jdbc.driver.OraclePreparedStatement.setCLOB(OraclePreparedStat
    ement.java)
    at oracle.sql.CLOB.plsql_write(Compiled Code)
    at oracle.jdbc.ttc7.TTC7Protocol.lobWrite(TTC7Protocol.java)
    at oracle.sql.CLOB.putChars(CLOB.java)
    at oracle.sql.CLOB.putString(CLOB.java)
    at TestClob3.main(TestClob3.java:38)
    Can anybody tell me how I can create a CLOB in jdbc to pass it over to a PL/SQL stored proc.
    When I test the stored procedure using a PL/SQL proc ( creating a temporary clob and passing it to the stored proc ) it works fine.
    Can somebody point out the mistake in my code. Appreciate it.
    Thanks.
    null

    Hello,
    First of i must admit that i am naive to installation softwares. But i can tell u that u can create tables using java and jdbc. I have done it myself. As far as creating database in concerned i haven't tried it out yet. But my gut feeling is that u can create it. I u are interested in having a look at the sample code then here it is.
    import java.sql.*;
    public class demoddl
    public static void main(String[] args) throws SQLException
    try
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection con = DriverManager.getConnection("jdbc:oracle:thin:@10.0.0.8:1521:oraserv","scott","lion");
    Statement stmt = con.createStatement();
    boolean b = stmt.execute("create table demoddl(a number)");
    System.out.println("Boolean
    catch(Exception e)
    System.out.println("Exception="+e.toString());
    }

  • Filesize a problem when uploading a file to Oracle via JDBC?

    Hello,
    I am trying to upload a file via JDBC to an Oracle Database (into a BLOB field). The file is converted to a byte array for uploading.
    While processing the request the following error is thrown :
    [31.08.05 09:58:33:151 CEST] 40cc40cc SystemErr R Caused by: java.sql.SQLException: Datengr��e gr��er als max. Gr��e f�r diesen Typ: 485323
    [31.08.05 09:58:33:151 CEST] 40cc40cc SystemErr R      at java.lang.Throwable.<init>(Throwable.java)
    [31.08.05 09:58:33:151 CEST] 40cc40cc SystemErr R      at java.lang.Throwable.<init>(Throwable.java)
    [31.08.05 09:58:33:151 CEST] 40cc40cc SystemErr R      at java.sql.SQLException.<init>(SQLException.java:52)
    [31.08.05 09:58:33:151 CEST] 40cc40cc SystemErr R      at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
    [31.08.05 09:58:33:151 CEST] 40cc40cc SystemErr R      at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
    [31.08.05 09:58:33:151 CEST] 40cc40cc SystemErr R      at oracle.jdbc.ttc7.TTCItem.setArrayData(TTCItem.java:95)
    [31.08.05 09:58:33:151 CEST] 40cc40cc SystemErr R      at oracle.jdbc.dbaccess.DBDataSetImpl.setBytesBindItem(DBDataSetImpl.java:2414)
    [31.08.05 09:58:33:151 CEST] 40cc40cc SystemErr R      at oracle.jdbc.driver.OraclePreparedStatement.setItem(OraclePreparedStatement.java:1134)
    [31.08.05 09:58:33:151 CEST] 40cc40cc SystemErr R      at oracle.jdbc.driver.OraclePreparedStatement.setBytes(OraclePreparedStatement.java:2170)
    ("Datengr��e gr��er als max. Gr��e f�r diesen Typ" means: "Filesize bigger than maximum allowed size for this type")
    A blob is able to hold files with gigabyte size, a simple 460k file should not cause this JDBC error. I had a test with a 127k file, too, same error (different file types tested: html, doc, pdf, ...). Is this a problem of the driver or is there anythig I am doing wrong?
    Many thanks in advance for your help,
    Rommie.

    My problem is not to retrieve the file but to upload
    it. I checked the examples and only saw examples for
    retrieving a BLOB or CLOB, but not for inserting it
    into the database
    Maybe I am blind ... if so, please publish your link
    to the example.The page at:
    http://www.oracle.com/technology/sample_code/tech/java/sqlj_jdbc/files/advanced/advanced.html
    Has a subsection that reads:
    LOB Datatype [19-Feb-2003]
    The term large object (LOB) refers to a data item that is too large to be stored directly in a database table. This sample application demonstrates how to read and write LOB datatype.The Oracle JDBC drivers provide support for two types of LOBs: BLOBs (unstructured binary data) and CLOBs (character data). BLOB and CLOB data is accessed and referenced using a locator stored in the database table.
    Download Now (ZIP, 76KB)
    Readme
    Source
    The zip is a standalone Java application that will create any needed tables, populate them with example data (both LOBs and CLOBs) from the data files in the zip and then put up a Swing gui that will allow you to add additional LOB and CLOB data to the table. Everything is there, the readme explains the 2 properties files you need to edit. The only other thing besides reading comprehension that you need to supply is DB connection information with the necessary privileges.
    The Source link is a link to the main code, but does not include all the code in the package. However, it contains the code to write CLOBs and BLOBs into the database.
    The Readme explains everything. It also has code excerpts, including the code used to read the sample data from file and write it into the LOBs and CLOBs.
    http://www.oracle.com/technology/sample_code/tech/java/sqlj_jdbc/files/advanced/LOBSample/Readme.html
    Look for "loadSamples"

  • Obtaining an oracle.sql.STRUCT through a pooled JDBC connection

    Hello,
    I am using WebLogic Server 10 and and Oracle 10 and I am trying to obtain a vendor-specific oracle.sql.STRUCT from a ResultSet using a pooled connection defined in Weblogic. I need the vendor-specific object, rather than simply the java.sql.Struct implementation, because a third party library requires it.
    What gets returned in the ResultSet is a non-exposed WebLogic wrapper object which implements java.sql.Struct, but which cannot be cast to an oracle.sql.STRUCT. I can use reflection on this object to find and call the getVendorObj() method to obtain the oracle.sql.STRUCT, but this solution is not acceptable because this is not a published API and is not guaranteed not to change in future versions.
    How can I reliably obtain a vendor-specific implementation of java.sql.Struct through a WebLogic connection pool in WebLogic Server 10?
    Thanks for any advice,
    -Dan Schwemlein

    dan schwemlein wrote:
    Joe,
    Thanks again. With your guidance, I have arrived at the following approach, which I'll post for the benefit of others, and which I'd be thankful if you would validate:
    1) Import the jar com.bea.core.datasource-1.0.0.0.jar from %BEA_HOME%\modules, which is the only location of the class WLConnection, which is the only class with the getVendorConnection() method you refer to.
    2) Get the logical connection from the pooled data source, cast it to a WLConnection, call getVendorConnection() to obtain an OracleConnection (from the ojdbc jar), and use this connection to obtain the required oracle.sql.STRUCT from an OracleResultSet.
    3) Be aware of the limitations and follow the guidelines in the document http://e-docs.bea.com/wls/docs81/jdbc/thirdparty.html#1043646 regarding security, error handling, releasing resources (close only the logical connection), etc.
    Does this sound like the approach you had in mind?
    Thanks again,
    -Danyes.
    Joe
    >
    Re: Obtaining an oracle.sql.STRUCT through a pooled JDBC connection
    Posted: Jul 16, 2007 3:21 PM
    dan schwemlein wrote:
    Thanks for the quick response!I was working today...
    Thank you for the information about the connection being closed.
    I will look into using this configuration setting.
    You say that you can describe a way to get a handle on an unwrapped
    pool object using some documented WLS-specific code. Are you referring
    here to the getVendorConnection() method?yes.
    This method does not help me
    get the oracle.sql.STRUCT object, because even the connection returned
    by getVendorConnection() returns a wrapped WL java.sql.Struct object
    from a call to getObject().I don't believe it. If you are running in WLS, with a local pool,
    the getVendorConnection() will give you the Oracle connection,
    which will give you an Oracle statement, etc, down to an oracle
    STRUCT object. Once you have a direct reference to the oracle connection,
    we're not in the picture when it returns something to you.
    It would be great if getVendorObj() were
    documented and could be counted on in future versions. To use this
    method, one would still have to access it via Java reflection, because
    the wrapper class and its getVendorObj() method would be exposed in an
    API, correct? Could this method be exposed in the API, so that reflection
    doesn't need to be used, or it is exposed somewhere that isn't documented?getVendorObj() is not yet exposed or therefore supported for the general
    wrapped object, so you would have to start from the connection and
    derive all subobjects from it.
    Thanks again,
    -Dan Schwemlein
    Hello,
    I am using WebLogic Server 10 and and Oracle 10 and I am trying to obtain a
    vendor-specific oracle.sql.STRUCT from a ResultSet using a pooled connection
    defined in Weblogic. I need the vendor-specific object, rather than simply
    the java.sql.Struct implementation, because a third party library requires it.
    What gets returned in the ResultSet is a non-exposed WebLogic wrapper object
    which implements java.sql.Struct, but which cannot be cast to an oracle.sql.STRUCT.
    I can use reflection on this object to find and call the getVendorObj() method to
    obtain the oracle.sql.STRUCT, but this solution is not acceptable because this is
    not a published API and is not guaranteed not to change in future versions.Understood. We all benefit from sticking to the J2EE standards,
    but we could also wish Oracle had done so with it's driver objects.
    I will assume your code is running in the WebLogic server, because
    an external JVM can never access the real driver object, which will
    always really be in the WLS JVM. No active JDBC object is serializable.
    How can I reliably obtain a vendor-specific implementation of java.sql.Struct
    through a WebLogic connection pool in WebLogic Server 10?There is no way to get a handle on an unwrapped pool object without using some
    WLS-specific code, though I can describe a way with documented methods,
    and/or I can get our documentation altered to say we'll support the
    getVendorObj() method. We introspect every vendor object, and for those
    implementations that have done the wise thing, projecting any non-standard
    methods as an Interface, we are able to also project that Interface so
    the vndor example code should work. However, in some poorly-done
    cases, such as for some Oracle stuff, there is either no Interface,
    or the Oracle code has extensions that take java.sql objects as input,
    (at least that's the signature of the method) but two lines into the
    method, the Oracle code assumes and casts the java.sql object to a concrete
    Oracle object. In these use cases you need the direct unwrapped object.
    We provide and document Connection.getVendorConnection(), and intend
    getVendorObj() to serve the same for subobjects, but note the dangers
    and responsibilities: We rely on our wrappers to implement the security
    and thread-safety of our pooling system. Because user code can get
    unrestricted access to the actual connection from most JDBC objects,
    we can never trust that we have complete control once a vendor object
    is exposed. Therefore, by default we will close and replace every JDBC
    connection so exposed, as soon as the current thread is finished with
    the pool connection. This hurts performance. We also document a pool
    config setting that will tell us that you take responsibility for any such
    problems, and not to close connections just because they've been exposed.
    HTH,
    Joe
    Thanks for any advice,
    -Dan Schwemlein

  • Create java procedure using jdbc

    Hi,
    I am trying to create java procedure using jdbc connection, I am using Oracle 11.2. When I create the procedure using sqlplus it works fine. Using jdbcit fails; code sniplet below:
                   ddl =
                   "create or replace java source named \"UTLCMD\" as \r\n"+
                   "import java.lang.Runtime; \r\n"+
                   "public class execHostCommand \r\n"+
                   "{ \r\n"+
                   "public static void execute (String command) \r\n"+
                   " throws java.io.IOException \r\n"+
                   " { \r\n"+
                   " Runtime rt = java.lang.Runtime.getRuntime(); \r\n"+
                   " rt.exec(command); \r\n"+
                   " } \r\n"+
                   statement = conn.createStatement();
                   statement.executeUpdate(ddl);
    I am getting this error:
    2013-01-26 12:45:31.835 UTC: ERROR: Exception "java.sql.SQLException: ORA-29536: badly formed source: Encountered "ublic" at line 3, column 1.
    Was expecting one of:
    "extends" ...
    "implements" ...
    "<" ...
    ". Stack dump:

    Hi,
    We can load java class using blob column, for example :
    create or replace and compile java class using blob select code from java_code;If class is OK, but resolution of referenced names to other classes failed, statement.execute() will not show any error and we need to 'select from user_errors' view for errors. How can we got the required object name for loaded class?

  • Hierarchical Queries / Rowsets via JDBC?

    I have an application that requires data from an SQL database to be displayed in a hierarchical directed graph (i.e. a JTree). Is it possible to construct Hierarchical Queries that return Hierarchical Rowsets in servlets via JDBC? This would be akin to using a Microsoft ADODB Hierarchical Recordset object, but I need a Java solution that's portable and isn't dependent on proprietary extensions in a server (i.e. iPlanet, etc.).
    Any help would be appreciated.
    Thanks.

    Is it possible to construct Hierarchical Queries that
    return Hierarchical Rowsetsin servlets via JDBC?No. JDBC only speaks in flat rows and columns.
    What type of hierarchical rowset are you referring to? Is it multidimensional data? For example MSSqlServer OLAP with row, column and measure dimensions? Or, is it simply grouped data for which you are both summarizing and displaying detail?

  • Lost index stats in Ora 8.1.6 Tables when selecting via jdbc

    Hi,
    i'm using JBuilder8 and Kylix2 on a Linux machine with Oracle oci drivers of client 8.1.7.
    The connect through JB8 jdbc via DBPilot is succesful and shows the tables of the db.
    After executing a select on any table the index stats of this table are lost.
    Kylix works fine without this failure.
    Thanks for any comments to this problem
    Jens

    Well, it's not the PL/SQL code that is causing a problem. Everything worked fine for many months. Then one day (without any changes in the environment or code) the update of a table from a java application (via JDBC) fails. The same update done directly on the DB with SQL Plus still succeeds!
    This led us to think that something is wrong with the JDBC connection (which was up for several months). Maybe a memory corruption?
    Anyone that experienced similar problems with JDBC?

  • Error 7 occurred at open/create/replace file

    Hello,
    I have searched the forum and could not find any useful information regarding my problem, so hope you may shed some light. MyVI can create a new csv (text) file by using the time to name the file, so every time the new file will be created with a different name and file path is not a relative path. I can run the VI in both development environment and stand along executable without any problem. But, 
    One of my colleagues  cannot run the executable exe on her machine because Error 7 occurred at Open/Create/Replace File in xxxx.vi Possible reason: LabVIEW: File not found. The file might be in a different location or deleted. Use the command prompt or the file explorer to verify that the path is correct.
    My question is why only she cannot run this exe on her machine. I have checked a few different PC in my office and all of them can run this exe without problem, so I am pretty sure the code is fine.
    I have already ask her to do,
    Run the executable as administrator
    Save the new file to other drives (not C: drive)
    but she still cannot run the executable. I dont think this is a premission issue, otherwise, LabVIEW would give a different error, Error 8 I believe.
    Both her PC and my PC is running Windows 7 professional 64-bit. The only difference I can see is that she is based in US and I am based Australia. Does anyone have any idea? Please help.
    Thanks,
    Sherman

    I’m not sure but expecting like below,
    As you said, your creating file name with Time. Make sure file name is correct and there is no special characters (like, / or : ). If your formatting time to string with “Format Date/Time String.vi” (while creating file name), based on UTC format, string will change.
    UTC format specifies if the output string is in Universal Time or in the configured time zone for the computer. If TRUE, date/time string is in Universal Time. The default is FALSE.
    Make sure you have access rights to create files into mentioned folder. Try to create new file manually.
    Munna

Maybe you are looking for