Howto insert blob using pear mdb2
Hi,
we need a php code snippet showing how to insert in a blob column using pear::mdb2. I know who to make it using oci8 (there is an example in the faq), but we only use mdb2 to access the database.
thanks in advance
//...some code here to instantiate MDB2 class...
$buf = file_get_contents('/path/to/blobfile');
$fieldsValues = array(
'MYFIELD1'=>$someVar,//integer
'BLOB_DATA'=>$buf,
$table_name = 'mytable';
$types = array('integer', 'blob');
$db->loadModule('Extended');
$sth = $db->extended->autoExecute($table_name, $fieldsValues, MDB2_AUTOQUERY_INSERT, null, $types);
if (PEAR::isError($sth)) {
die($sth->getMessage());
Note that you CANNOT insert a blob when using the 'prepare' method with placeholders. That seemed to be the problem.
Similar Messages
-
Inserting Blob in PL/SQL using select from other table
Oracle 11.1.7.0:
I am trying to insert blob column as defined below but not able to. Is this the right way of inserting blobs?
set serveroutput on
spool a.dat
DECLARE
BEGIN
for i in 1..2
loop
for j in (select r_payload
from fp_data where payload_id=331525112)
loop
EXECUTE IMMEDIATE 'insert into fp_data (r_payload) values ( ' || j.r_payload || ')';
end loop;
end loop;
rollback;
END;
exit;BLOB work same a CLOB
SQL> @clob
SQL> drop table toto;
SQL> create table toto (
2 A VARCHAR2 (30) NOT NULL,
3 B VARCHAR2 (30) NOT NULL,
4 C clob default empty_clob()
5 )
6 lob(c) store as toto_name_lo(disable storage in row)
7 ;
SQL>
SQL> set feedback off
SQL> set timing on;
SQL> prompt
SQL> prompt Insert lob with enabled storage in row:
Insert lob with enabled storage in row:
SQL> insert into toto (a, b, c)
2 select owner a, object_name b, owner || ' ' || object_name c from all_objects
3 where rownum < 10
4 ;
Elapsed: 00:00:00.51
SQL> set timing off;
SQL> select a,b from toto;
A B
SYS ICOL$
SYS I_USER1
SYS CON$
SYS UNDO$
SYS C_COBJ#
SYS I_OBJ#
SYS PROXY_ROLE_DATA$
A B
SYS I_IND1
SYS I_CDEF2
SQL> drop table fp_data;
SQL> create table fp_data (r_payload clob);
SQL> insert into fp_data select c from toto where a = 'SYS' AND B = 'I_IND1';
SQL> select count(*) from fp_data;
COUNT(*)
1no need for PL/SQL -
How to create and write a BLOB using ImmediateAccess
Hi there,
I'd like to write a BLOB using ScrollableRowSetAccess an ImmediateAccess and thereby want to avoid the use of any SQL-statements.
The problem is that I can't write to an empty BLOB, so that I have to create a dummy-Blob using BLOBDomain and overwrite it afterwards (see code below).
It should be possible to avoid the creation of a dummy-BLOB but I don't know how. Could you please send me a corrected version of my code?
Thanks in advance
write File with filename to the column with index col /(or the column with name colname, if specified) of the table that is specified by ResultSetInfo rsi
public static void writeFileToBlob(int col, String colname, ResultSetInfo rsi, String filename, SessionInfo _sessionInfo)
FileInputStream fin;
Object obj;
ScrollableRowsetAccess srsa= _rsi.getRowsetAccess();
ImmediateAccess ia;
byte []mybytes;
BlobDomain
BLOB blob;
OutputStream out;
byte []myBuffer;
int bytesRead=0;
try{
//open file
fin = new FileInputStream(_filename);
//lock Row
srsa.lockRow();
if (_colname==null)
ia = (ImmediateAccess)srsa.getColumnItem(_col);
else
ia = (ImmediateAccess)srsa.getColumnItem(_colname);
obj= ia.getValueAsObject();
//insert a dummy-BLOB of size 1-byte
mybytes= new byte[1];
blobDom= new BlobDomain();
blobDom.setBytes(mybytes); //ein Byte in den BLOB schreiben
ia.setValue(blobDom); //Wert in Zeile einf|gen
//commit Data
_sessionInfo.getApplicationModule().getTransaction().commit();
//access previously created dummy-Blob
srsa.lockRow();
if (_colname==null)
ia = (ImmediateAccess)srsa.getColumnItem(_col);
else
ia = (ImmediateAccess)srsa.getColumnItem(_colname);
obj= ia.getValueAsObject();
//assign the BLOB
blob= (BLOB) obj;
//open BLOB for writing
out= blob.getBinaryOutputStream();
myBuffer= new byte[10*1024];
//read file and write the BLOB
while ((bytesRead= fin.read(myBuffer)) !=-1)
out.write(myBuffer, 0, bytesRead);
out.flush();
out.close();
fin.close();
ia.setValue(blob);
//commmit data
_sessionInfo.getApplicationModule().getTransaction().commit();
}catch(Exception e){System.out.println("writeblob:"+e);}
nullHere are the issues with your usage of BlobDomain:
1. Streaming support is not implemented in 3.2 version of BlobDomain. It'll be implemented in our next release.
2. Your casting of object returned from getColumnItem is illegal as the objects will be of type BlobDomain and not BLOB.
3. When you create an empty BlobDomain you're in-effect meaning to call the empty_blob() method on the sql-row to create a empty blob locator.
4. You need to use getBytes(), setBytes() to read data out/set data into a blob/clob domain object in JDev 3.2
5. Casting/using oracle.sql.BLOB may lead to non-portable code (you're binding to the jdbc objects which may not be available in all tiers of deployment).
Here's the pseudocode you could use for new blobs.
1. create a new instance of BlobDomain()
2. setBytes() with actual data read from a stream. (Yes this may not work with real large blobs but we've tested blobs ~2MB in size and for larger needs, we're implementing the streaming support scheduled for our next release).
3. set the domain object into an attribute.
4. post/commit your data.
null -
Inserting blob data into database
Hello everybody,
I need insert blob data into database. that data i need to get from form
can i use request.getParameter(""); for getting that file.
Plz help how to get data from form to servlet and through callablestatement i need to insert into database.
regards,
AnilHi,
1) first create a form with file element
first.jsp
<form action="GetData" enctype="multipart/form-data" method="post">
<input type="file" name="datafile" size="40">
<input type="submit" value="Send">
<input type="reset" name="Reset" value="Cancel">
</form>
GetData.java
// servlet file
public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
res.setContentType("text/html");
PrintWriter out = response.getWriter();
try {
System.setProperty( "jdbc.drivers", "com.microsoft.jdbc.sqlserver.SQLServerDriver" );
Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver" );
con = DriverManager.getConnection( "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=JAVATEAM;SelectMethod=cursor;User=sa;Password=urpassword" );
PreparedStatement pst = con.prepareStatement("insert into uploads(binaryfile) values(?)");
FileInputStream fis=new FileInputStream(request.getParameter ( "datafile" ) );
byte[] b= new byte[fis.available()+1];
fis.read(b);
pst.setBytes(1,b);
pst.executeUpdate();
pst.close();
con.close();
catch(SQLException e)
out.println ( e);
catch (ClassNotFoundException e)
out.println( e );
}Here in doPost(), i create preparedstatement,
now you to create one procedure for insert
and by using callable statement you just call that procedure and pass this byte b as arguments,
now its in your hands
my idea is over. -
How much space does a blob use?
How much space does a BLOB use?
Does it use allocated anyspace if its empty?It will size appropriately:
TEST.SQL>CREATE TABLE TBLOB
2 (
3 A BLOB
4 ) TABLESPACE _SANITIZED_;
TABLE CREATED.
TEST.SQL>SELECT INITIAL_EXTENT FROM DBA_TABLESPACES WHERE TABLESPACE_NAME='_SANITIZED_';
INITIAL_EXTENT
5242880
TEST.SQL>SELECT * FROM DBA_EXTENTS WHERE SEGMENT_NAME='TBLOB';
OWNER SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE
TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
YJAM TBLOB TABLE
_SANITIZED_ 0 16 1201289 5242880 640 16
TEST.SQL>SELECT * FROM DBA_OBJECTS WHERE CREATED > SYSDATE-1;
OWNER OBJECT_NAME
SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL TIMESTAMP STATUS T G S
YJAM SYS_LOB0000920875C00001$$
920876 920876 LOB 14:41:36 14:41:36 2005-11-16:14:41:36 VALID N Y N
YJAM TBLOB
920875 920875 TABLE 14:41:36 14:41:36 2005-11-16:14:41:36 VALID N N N
TEST.SQL>SELECT * FROM DBA_EXTENTS WHERE SEGMENT_NAME='SYS_LOB0000920875C00001$$';
OWNER SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE
TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
YJAM SYS_LOB0000920875C00001$$ LOBSEGMENT
_SANITIZED_ 0 16 1202569 5242880 640 16
TEST.SQL>DECLARE
2 VALINS VARCHAR2(4000);
3 BEGIN
4 VALINS:='1';
5 FOR I IN 1..100000
6 LOOP
7 INSERT INTO TBLOB VALUES (RPAD(VALINS,4000,'0'));
8 END LOOP;
9 END;
10 /
PL/SQL procedure successfully completed.
TEST.SQL>COMMIT;
Commit complete.
TEST.SQL>SELECT * FROM DBA_EXTENTS WHERE SEGMENT_NAME IN ('SYS_LOB0000920875C00001$$','TBLOB');
OWNER SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE
TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
YJAM TBLOB TABLE
_SANITIZED_ 0 16 1201289 5242880 640 16
YJAM TBLOB TABLE
_SANITIZED_ 1 17 1169929 5242880 640 17
YJAM TBLOB TABLE
_SANITIZED_ 2 18 1163529 5242880 640 18
YJAM TBLOB TABLE
_SANITIZED_ 3 19 1176969 5242880 640 19
YJAM TBLOB TABLE
_SANITIZED_ 4 5 379529 5242880 640 5
YJAM TBLOB TABLE
_SANITIZED_ 5 14 375689 5242880 640 14
YJAM TBLOB TABLE
_SANITIZED_ 51 18 1172489 5242880 640 18
YJAM TBLOB TABLE
_SANITIZED_ 52 19 1191689 5242880 640 19
YJAM SYS_LOB0000920875C00001$$ LOBSEGMENT
_SANITIZED_ 0 16 1202569 5242880 640 16
54 rows selected.
TEST.SQL>ANALYZE TABLE TBLOB COMPUTE STATISTICS;
Table analyzed.
TEST.SQL>SELECT * FROM DBA_TABLES WHERE TABLE_NAME='TBLOB';
OWNER TABLE_NAME TABLESPACE_NAME CLUSTER_NAME IOT_NAME PCT_FREE PCT_USED
INI_TRANS MAX_TRANS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE FREELISTS FREELIST_GROUPS LOG B NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE CHAIN_CNT
AVG_ROW_LEN AVG_SPACE_FREELIST_BLOCKS NUM_FREELIST_BLOCKS DEGREE INSTANCES CACHE TABLE_LO SAMPLE_SIZE LAST_ANA PAR IOT_TYPE T S NES BUFFER_ ROW_MOVE GLO USE
DURATION SKIP_COR MON CLUSTER_OWNER DEPENDEN COMPRESS
YJAM TBLOB _SANITIZED_ 10
1 255 5242880 5242880 1 2147483645 0 YES N 100000 33547 373 1977 0
2042 0 0 1 1 N ENABLED 100000 14:51:22 NO N N NO DEFAULT DISABLED NO NO
DISABLED NO DISABLED DISABLED
TEST.SQL>SELECT BYTES/1024 FROM DBA_SEGMENTS WHERE SEGMENT_NAME='TBLOB';
BYTES/1024
271360
TEST.SQL>TRUNCATE TABLE TBLOB;
Table truncated.
TEST.SQL>BEGIN
2 FOR i IN 1..100000
3 LOOP
4 INSERT INTO TBLOB VALUES ('1');
5 END LOOP;
6 END;
7 /
PL/SQL procedure successfully completed.
TEST.SQL>COMMIT;
Commit complete.
TEST.SQL>ANALYZE TABLE TBLOB COMPUTE STATISTICS;
Table analyzed.
TEST.SQL>SELECT BYTES/1024 FROM DBA_SEGMENTS WHERE SEGMENT_NAME='TBLOB';
BYTES/1024
5120Note: there is a deported blob segment for the pointers I forgot in my previous post.
HTH,
Yoann.
Message was edited by:
Yoann Mainguy
Hmm, forgot that for a full comparison of the avg linesize:
TEST.SQL>SELECT * FROM DBA_TABLES WHERE TABLE_NAME='TBLOB';
OWNER TABLE_NAME TABLESPACE_NAME CLUSTER_NAME IOT_NAME PCT_FREE PCT_USED
INI_TRANS MAX_TRANS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE FREELISTS FREELIST_GROUPS LOG B NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE CHAIN_CNT
AVG_ROW_LEN AVG_SPACE_FREELIST_BLOCKS NUM_FREELIST_BLOCKS DEGREE INSTANCES CACHE TABLE_LO SAMPLE_SIZE LAST_ANA PAR IOT_TYPE T S NES BUFFER_ ROW_MOVE GLO USE
DURATION SKIP_COR MON CLUSTER_OWNER DEPENDEN COMPRESS
YJAM TBLOB _SANITIZED_ 10
1 255 5242880 5242880 1 2147483645 0 YES N 100000 628 12 1223 0
41 0 0 1 1 N ENABLED 100000 14:56:56 NO N N NO DEFAULT DISABLED NO NO
DISABLED NO DISABLED DISABLED -
SQLite3 and BlobsI am having trouble learning how insert blobs into SQLite
I am having trouble learning how insert blobs into SQLite for the iphone. Is there a way to insert a blob into sqlite3 from the command line? I know it was possible with sql using
INSERT INTO temponly(name , pic) values( 'velan',
load_file('e:/mysql/images/Click.gif')) ;
but I don't think load_file is supported on sqlite.
Also, I need to insert the blobs from my iphone app. I saw a C program called eatblob.c which goes through the following just to INSERT a blob into sqlite
1. read the jpeg image file into memory , doing appropriate malloc based on size
2. prepare an sqlite statement with ? values
3. bind the malloc'd memory to the ?
4. execute an sqlite step
etc. etc. etc....
This is quite a bit of work just to do an INSERT ???
The reason I'm doing this is my iphone app has a lot of tiny (20x20) images that get downloaded to the phone periodically from the server. Plus, there are a number of images that come loaded with the application. I was going to save all of these in SQLite. So, I need the command line tool to load up the initial images that come with the app, then I need code to download the images from the server and load them into the database. Of course, reading them out is necessary!
Please help if you can!? Its late..and I'm blurry eyed from googling SQLIte3 blobs...Thank you for your quick reply Liam! You know, I checked the web forms list when I got that error message and the form isn't there. I was having trouble the other day when another of my forms kept getting deleted.
Sorry if this is a stupid question (I'm a BC newbie) but I want to be sure so I can get this project finished... The proper workflow would be to create this form myself in Web Forms then insert it into the Registration - Buy template using the modules toolbox?
Thanks to you I may get this done on time still... if my PayPal set up works -
RegisterOutParameter - setBinaryStream - Problems inserting Blob - setRAW
As posted in metalink (was: "Problems inserting BLOB/InputStream with ojdbc14.jar for 10g - Data size bigger than max size for this type"):
Using setBinaryStream for large Blobs works as long as I don't register outParameters.
Query that works: "INSERT INTO blobtest (attachment_id,name,data) VALUES(blobtest_SEQ.nextval,?,?)";
Query that fails = "BEGIN INSERT INTO blobtest (attachment_id,name,data) VALUES( blobtest_SEQ.nextval,?,?) RETURN attachment_id INTO ? ; END;"
The necessary tables were created by hand:
CREATE TABLE blobtest ( NAME CHAR(255), data BLOB, attachment_id NUMBER(38))
And
CREATE SEQUENCE TBL_ATTACHMENT_SEQ
The output was: <<user: SEE
pw: QD
instantiating oracle driver
query: INSERT INTO blobtest (attachment_id,name,data) VALUES(TBL_ATTACHMENT_SEQ.nextval,?,?)
uploaded no Return Parameter blob of size: 256809
query: BEGIN INSERT INTO blobtest (attachment_id,name,data) VALUES(TBL_ATTACHMENT_SEQ.nextval,?,?) RETURN attachment_id INTO ? ; END;
java.sql.SQLException: Datengr÷▀e gr÷▀er als max. Gr÷▀e f³r diesen Typ: 256809
at
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java
:125)
at
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java
:162)
at
oracle.jdbc.driver.OraclePreparedStatement.setRAW(OraclePreparedState
ment.java:5342)
at
oracle.jdbc.driver.OraclePreparedStatement.setBinaryStreamInternal(Or
aclePreparedStatement.java:6885)
at
oracle.jdbc.driver.OracleCallableStatement.setBinaryStream(OracleCall
ableStatement.java:4489)
at BlobTest.writeBlob(BlobTest.java:161)
at BlobTest.testBlob(BlobTest.java:118)
at BlobTest.main(BlobTest.java:92)
error: Datengr÷▀e gr÷▀er als max. Gr÷▀e f³r diesen Typ:
256809>>
here the java test case:
* Created on 25.08.2004 $Id: BlobTest.java,v 1.4 2005/04/22 11:21:11 hauser Exp $
* as posted in metalink jdbc forum 050405 and responses by
* [email protected]
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Types;
public class BlobTest {
private static String FILE_NAME = "c:/temp/veryLargeFile.pdf";
public BlobTest() {
final static int ORACLE = 1;
final static int MYSQL = 2;
private String jdbcUrl = "jdbc:mysql://localhost/test?user=monty&password=greatsqldb";
private int dbType = ORACLE;
private Driver driver = null;
private String user = "";
private String pw = "";
public static String SCHEME = "";
public static void main(String[] args) {
BlobTest bt = new BlobTest();
if (args[0] != null) {
System.out.println("dbType: " + args[0]);
if (args[0].toLowerCase().indexOf("oracle") != -1) {
bt.dbType = ORACLE;
if (args[0].toLowerCase().indexOf("mysql") != -1) {
bt.dbType = MYSQL;
} else {
System.out.println("not yet supported db type: " + args[0]);
System.exit(99);
if (args[1] != null) {
System.out.println("jdbcUrl: " + args[1]);
if (args[1].trim().length() != 0) {
bt.jdbcUrl = args[1].trim();
} else {
System.out.println("not yet supported jdbcUrl : " + args[1]);
System.exit(99);
if (args.length > 2 && args[2] != null) {
System.out.println("user: " + args[2]);
if (args[2].trim().length() != 0) {
bt.user = args[2].trim();
} else {
System.out.println("invalid user: " + args[2]);
System.exit(99);
if (args.length > 3 && args[3] != null) {
System.out.println("pw: " + args[3].substring(0, 2));
if (args[3].trim().length() != 0) {
bt.pw = args[3].trim();
} else {
System.out.println("invalid filename: " + args[3]);
System.exit(99);
if (args.length > 4 && args[4] != null) {
System.out.println("filename: " + args[4]);
if (args[4].trim().length() != 0) {
FILE_NAME = args[4].trim();
} else {
System.out.println("invalid filename: " + args[4]);
System.exit(99);
bt.setUp();
bt.testBlob();
public void setUp() {
try {
if (this.dbType == ORACLE) {
System.out.println("instantiating oracle driver ");
this.driver = (Driver) Class.forName(
"oracle.jdbc.driver.OracleDriver").newInstance();
} else {
this.driver = (Driver) Class.forName("com.mysql.jdbc.Driver")
.newInstance();
if (this.driver == null) {
System.out.println("oracle driver is null");
System.exit(88);
DriverManager.registerDriver(this.driver);
} catch (Exception e) {
e.printStackTrace();
System.out.println("error: " + e.getMessage());
public void testBlob() {
try {
this.writeBlob();
} catch (Exception e) {
e.printStackTrace();
System.out.println("error: " + e.getMessage());
* testfunction
private void writeBlob() throws Exception {
Connection conn = null;
PreparedStatement pStmt = null;
CallableStatement cStmt, cStmt2 = null;
InputStream in = null;
try {
File file = new File(BlobTest.FILE_NAME);
in = new FileInputStream(file);
conn = DriverManager.getConnection("jdbc:" + this.jdbcUrl,
this.user, this.pw);
conn.setAutoCommit(false);
String queryWorks = "INSERT INTO " + SCHEME
+ "blobtest (attachment_id,name,data) VALUES(" + SCHEME
+ "TBL_ATTACHMENT_SEQ.nextval,?,?)";
cStmt = conn.prepareCall(queryWorks);
System.out.println("query: " + queryWorks);
cStmt.setString(1, file.getAbsolutePath());
in = new FileInputStream(file);
cStmt.setBinaryStream(2, in, (int) file.length());
cStmt.execute();
System.out.println("uploaded no Return Parameter blob of size: "
+ file.length());
conn.commit();
String queryFails = "BEGIN INSERT INTO " + SCHEME
+ "blobtest (attachment_id,name,data) VALUES(" + SCHEME
+ "TBL_ATTACHMENT_SEQ.nextval,?,?)"
+ " RETURN attachment_id INTO ? ; END;";
cStmt2 = conn.prepareCall(queryFails);
System.out.println("query: " + queryFails);
cStmt2.setString(1, file.getAbsolutePath());
in = new FileInputStream(file);
cStmt2.setBinaryStream(2, in, (int) file.length());
cStmt2.registerOutParameter(3, Types.INTEGER);
cStmt2.execute();
System.out.println("uploaded blob of size: " + file.length()
+ " - id: " + cStmt2.getInt(3));
conn.commit();
} catch (Exception e) {
e.printStackTrace();
System.out.println("error: " + e.getMessage() + "\nname: "
+ BlobTest.FILE_NAME);
if (conn != null) {
try {
conn.rollback();
} catch (Exception e1) {
throw e;
} finally {
if (in != null) {
try {
in.close();
} catch (Exception e) {
if (pStmt != null) {
try {
pStmt.close();
} catch (Exception e) {
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
and the batch file I use to start:
@setlocal
@echo off
rem $Id: runBlobTest.bat,v 1.2 2005/04/21 15:06:22 hauser Exp $
set classpath=../WEB-INF/classes;../WEB-INF/lib/ojdbc14.jar;
echo JAVA_HOME: %JAVA_HOME%
set JAVA_HOME=C:\PROGRA~1\Java\j2re1.4.1_02\
echo classpath: %classpath%
set javaCmd=C:\PROGRA~1\Java\j2re1.4.1_02\bin\java
%javaCmd% -version
%javaCmd% BlobTest "oracle" "oracle:thin://@ORADB.yourdomain.COM:1521:t300" "username" "password" "C:\Temp\veryLargeFile.pdf"
endlocalApparently, this is partially known - with a different stacktrace though:
<<From: Oracle, Anupama Srinivasan 25-Apr-05 07:15
Can you please check on Bug:4083226?
Using the RETURNING Clause is not supported with JDBC. You could embed the statement in PL/SQL Block as in Metalink Note 124268.1 - JDBC Support for DML Returning Clause.
The Enhancement Request filed on this issue is being considered for Release 10.2
>>
And my answer to it.
Using the RETURNING Clause is not supported with JDBC.This is strange, with just "emptyblob()", it DOES work.
I guess, our work-around that hopefully is more portable than embedding a "PL/SQL Block" will be to
1) create the record with an empty blob,
2) update the blob in a second statement (now, a RETURNING statement is no longer needed) -
Insert SDO_GEOMETRY using array binding
Hi,
does anyone know howto insert the elem_info array and the ordinates array of a SDO_GEOMETRY object using array binding and ODP or if there is a way to insert the SDO_GEOMETRY object using the same technique.
/AndersThe current releases of ODP.NET do not support object types, hence no "proper" SDO_GEOMETRY support. You can retrieve the data as an XML-type as illustrated here:
Re: ODP.Net + Spatial
I know of no way to insert an SDO_GEOMETRY object using array binding at this time.
If someone else has a solution, please do post!
- Mark -
Does Oracle occi have any memory bugs when writing blobs using streams?
The function below will produce some kind of memory corruption that will cause an exception (which cannot be identified since memory is corrupted) while doing another call:
ora::Statement stmt(__cn);
string sql("BEGIN Pckg.Sp_procA(:1, :2, :3, :4, :5, :6, :7, :8, "
":9, :10, :11, :12, ":13, :14, :15, :payload); END;");
occi::Blob payload(__cn.getConnection());
occi::Environment* tempEnv = occi::Environment::createEnvironment();
occi::Timestamp reportTime(tempEnv);
reportTime.fromText(__report.report_time), "yyyy-mm-ddH24:mi:ss.ff");
stmt.setSQL(sql);
stmt.setString (1, "");
stmt.setString (2, "");
stmt.setString (3, __report.varA);
stmt.setString (4, __report.varB);
stmt.setInt (5, __report.varC);
stmt.setString (6, __report.varD);
stmt.setString (7, __report.varE);
stmt.setString (8, __report.varF);
stmt.setTimestamp(9, reportTime);
stmt.setNull (10, occi::OCCITIMESTAMP);
stmt.setString (11, __report.varG);
stmt.setString (12, __report.varH);
stmt.setString (13, __report.varI);
stmt.setString (14, __report.varK);
stmt.setString (15, __report.varX);
stmt.setBinaryStreamMode(16, __report.payload.Size(), true);
stmt.executeUpdate();
occi::Stream* streamedData = stmt.getStream(16);
streamedData->writeLastBuffer(__report.payload.GetPtr(), __report.payload.Size());
stmt.closeStream(streamedData);
occi::Environment::terminateEnvironment(tempEnv);
return true;
The function below works perfectly unless the code above is executed and looks like this:
ora::Statement stmt(__cn);
string sql("BEGIN "
"Pckg.Sp_procB(:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11); END;");
occi::Environment* tempEnv = occi::Environment::createEnvironment();
occi::Timestamp reportTime(tempEnv);
reportTime.fromText(__report.report_time, "yyyy-mm-dd HH24:mi:ss.ff");
stmt.setSQL(sql);
stmt.setString (1, "");
stmt.setString (2, "");
stmt.setString (3, __report.varA);
stmt.setString (4, __report.varB);
stmt.setInt (5, __report.varB);
stmt.setString (6, __report.varD);
stmt.setString (7, __report.varE);
stmt.setString (8, __report.varF);
stmt.setString (9, __report.varG);
stmt.setTimestamp(10, reportTime);
stmt.setNull (11, occi::OCCITIMESTAMP);
stmt.executeUpdate();
occi::Environment::terminateEnvironment(tempEnv);
return true;
I got the blob insert example from Oracle's documentation and can't see anything wrong with it. The second function also seems to be ok which got me thinking that Oracle's occi might have some kind of bug that corrupts memory. Anyone knows anything about this or has done anything similar?Does anyone insert blobs this way? Or just using the "insert -> select for update" way?
-
Inserting BLOBs Programmatically
Is it possible to insert BLOBs programmatically?
http://java.sun.com/docs/books/tutorial/jdbc/jdbc2dot0/inserting.html
has details on this, but it appears to be at odds with the "empty_blob()" mechanism used by oracle, which requires an explicit insert statement.
Thanks,
SanjayAlthough jdbc can't immediately see how the Blob/Clob needs to be implemented the database implementors should. The sequence should be as you suggest: create a new blob, write the data to it then store the OID in the database with a PreparedStatement.
Because the Blob needs to be database implementation specific new Blobs should be created from the Connection object. In the typical case writing to the Blob should write straight to the database. Copying block values from one record to another should just involve copying the OID.
As I read the Blob class description it should mean that the actual data isn't moved to or from the client unless you open a stream on it.
Looking at the postgres implementation source it's pretty crude, in fact whereas retrieving a blob works as I suggested; no reads from the database until you open the stream, when you write the blob back to the database it's creating a new OID every time. I'd assumed it would retrieve the OID from the Blob you passed to PreparedStatment.setBlob actually it creates a new OID and copies the data byte by byte (icky).
Looks, in fact, as if I can create a fake Blob with nothing but a getBinaryStream method.
setBinaryStream/setAsciiStream doesn't work properly because it seems to decide whether the field is a blob purely based on the implementation version of postgres, without regard for the field type. (I suppose you can't judge the field type in a PreparedStatement). -
Error while insert data using execute immediate in dynamic table in oracle
Error while insert data using execute immediate in dynamic table created in oracle 11g .
first the dynamic nested table (op_sample) was created using the executed immediate...
object is
CREATE OR REPLACE TYPE ASI.sub_mark AS OBJECT (
mark1 number,
mark2 number
t_sub_mark is a class of type sub_mark
CREATE OR REPLACE TYPE ASI.t_sub_mark is table of sub_mark;
create table sam1(id number,name varchar2(30));
nested table is created below:
begin
EXECUTE IMMEDIATE ' create table '||op_sample||'
(id number,name varchar2(30),subject_obj t_sub_mark) nested table subject_obj store as nest_tab return as value';
end;
now data from sam1 table and object (subject_obj) are inserted into the dynamic table
declare
subject_obj t_sub_mark;
begin
subject_obj:= t_sub_mark();
EXECUTE IMMEDIATE 'insert into op_sample (select id,name,subject_obj from sam1) ';
end;
and got the below error:
ORA-00904: "SUBJECT_OBJ": invalid identifier
ORA-06512: at line 7
then when we tried to insert the data into the dynam_table with the subject_marks object as null,we received the following error..
execute immediate 'insert into '||dynam_table ||'
(SELECT887684 wrote:
ORA-00904: "SUBJECT_OBJ": invalid identifier
ORA-06512: at line 7The problem is that your variable subject_obj is not in scope inside the dynamic SQL you are building. The SQL engine does not know your PL/SQL variable, so it tries to find a column named SUBJECT_OBJ in your SAM1 table.
If you need to use dynamic SQL for this, then you must bind the variable. Something like this:
EXECUTE IMMEDIATE 'insert into op_sample (select id,name,:bind_subject_obj from sam1) ' USING subject_obj;Alternatively you might figure out to use static SQL rather than dynamic SQL (if possible for your project.) In static SQL the PL/SQL engine binds the variables for you automatically. -
Hi everyone,
I need help with inserting values using merge.
* I need to check all the units in a parent category. For example, NF_ARTICLECATEGORYID = 7462 is a parent category.
* Im going to compare all the units in the parent category(7642) to the units in a subcategory (8053).
* If the units in parent category(7642) is not present in the subcategory(8053) then the units will be inserted in the same table.
table structure:
Table name : ARTICLECATEGORYACCESS
Fields: IP_ARTICLECATEGORYACCESSID
NF_ARTICLECATEGORYID
NF_UNITID
NF_USERID
N_VIEW
N_EDIT
Sample data:
CREATE TABLE articlecategoryaccess (
IP_ARTICLECATEGORYACCESSID NUMBER(5),
NF_ARTICLECATEGORYID NUMBER (10),
NF_UNITID NUMBER (10),
NF_USERID NUMBER (10)
N_VIEW INT,
N_EDIT INT);
INSERT INTO articlecategoryaccess VALUES (255583, 7642, 29727, NULL, 1 ,1);
INSERT INTO articlecategoryaccess VALUES (243977,7642,29728, NULL, 1 ,1);
INSERT INTO articlecategoryaccess VALUES (240770,7642,29843, NULL, 1 ,1);
INSERT INTO articlecategoryaccess VALUES (243413,7642,29844, NULL, 1 ,1);
INSERT INTO articlecategoryaccess VALUES (274828,7642,44849, NULL, 1 ,1);
INSERT INTO articlecategoryaccess VALUES (274828,8053,44849, NULL, 1 ,1);
Units ID 29727, 29728, 29843, 29844, 44849 has access to parent category 7642.
The units id 29727, 29728, 29843, 29844 dont have access to subcategory 8053.
29727, 29728, 29843, 29844 should be inserted in the same table and will have an access to 8053.
After they are inserted, it should look like this
IP_ARTICLECATEGORYACCESSID NF_ARTICLECATEGORYID NF_UNITID NF_USERID N_VIEW N_EDIT
255583 7642 29727 null 1 1
243977 7642 29728 null 1 1
240770 7642 29843 null 1 1
243413 7642 29844 null 1 1
274828 7642 44849 null 1 1
new value 8053 44849 null 1 1
new value 8053 29843 null 1 1
new value 8053 29844 null 1 1
new value 8053 29728 null 1 1
new value 8053 29727 null 1 1
NOTE: IP_ARTICLECATEGORYACCESSID is a sequence and it should be unique
DECLARE
BEGIN
MERGE INTO articlecategoryaccess b
USING (SELECT *
FROM articlecategoryaccess c
WHERE nf_articlecategoryid = 7642
MINUS
SELECT *
FROM articlecategoryaccess c
WHERE nf_articlecategoryid = 8053) e
ON (1 = 2)
WHEN NOT MATCHED THEN
INSERT (b.ip_articlecategoryaccessid, b.nf_articlecategoryid, b.nf_unitid, b.NF_USERID, b.N_VIEW, b.N_EDIT)
VALUES (articlecategoryaccessid_seq.nextval, 8053, e.nf_unitid, null, 1, 1);
END;
i got an error after running the script:
*Cause: An UPDATE or INSERT statement attempted to insert a duplicate key.
For Trusted Oracle configured in DBMS MAC mode, you may see
this message if a duplicate entry exists at a different level.
*Action: Either remove the unique restriction or do not insert the key.
why would it be duplicated? its a sequence and its unique.. I dont know, maybe there is something wrong my script..
Any help is appreciated..
EdEd,
1. What is the current value of the Sequence? Does the current value of sequence exist in the table? If yes, then increment the sequence to a value that is not present in the Table.
2. Do you have any unique constraint on any of the columns that you are inserting?
I have to ask you again, Why are you insisting on Merge statement when a simple Insert can do the job for you? Don't you feel that the below specified Merge statement is making things look more Complicated than they actually are, do you?
Think on it and then proceed. I hope these pointers help you to resolve the issue.
Regards,
P. -
Restful service unable to insert data using PL/SQL.
Hi all,
Am running: AL 2.01 standalone mode on OEL 4.8 in VM box A.
Oracle database 10.2.0.4 with Apex 4.2.0.00.27 on OEL4.8 in VM box B.
Able to performed oracle.example.hr Restful services with no problem.
Unable to insert data using AL 2.0.1 but works on AL 1.1.4.
which uses the following table (under schema: scott):
create table json_demo ( title varchar2(20), description varchar2(1000) );
grant all on json_demo to apex_public_user; and below procedure ( scott's schema ):
CREATE OR REPLACE
PROCEDURE post(
p_url IN VARCHAR2,
p_message IN VARCHAR2,
p_response OUT VARCHAR2)
IS
l_end_loop BOOLEAN := false;
l_http_req utl_http.req;
l_http_resp utl_http.resp;
l_buffer CLOB;
l_data VARCHAR2(20000);
C_USER_AGENT CONSTANT VARCHAR2(4000) := 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)';
BEGIN
-- source: http://awads.net/wp/2005/11/30/http-post-from-inside-oracle/
-- Ask UTL_HTTP not to raise an exception for 4xx and 5xx status codes,
-- rather than just returning the text of the error page.
utl_http.set_response_error_check(false);
-- Begin the post request
l_http_req := utl_http.begin_request (p_url, 'POST', utl_http.HTTP_VERSION_1_1);
-- Set the HTTP request headers
utl_http.set_header(l_http_req, 'User-Agent', C_USER_AGENT);
utl_http.set_header(l_http_req, 'content-type', 'application/json;charset=UTF-8');
utl_http.set_header(l_http_req, 'content-length', LENGTH(p_message));
-- Write the data to the body of the HTTP request
utl_http.write_text(l_http_req, p_message);
-- Process the request and get the response.
l_http_resp := utl_http.get_response (l_http_req);
dbms_output.put_line ('status code: ' || l_http_resp.status_code);
dbms_output.put_line ('reason phrase: ' || l_http_resp.reason_phrase);
LOOP
EXIT
WHEN l_end_loop;
BEGIN
utl_http.read_line(l_http_resp, l_buffer, true);
IF(l_buffer IS NOT NULL AND (LENGTH(l_buffer)>0)) THEN
l_data := l_data||l_buffer;
END IF;
EXCEPTION
WHEN utl_http.end_of_body THEN
l_end_loop := true;
END;
END LOOP;
dbms_output.put_line(l_data);
p_response:= l_data;
-- Look for client-side error and report it.
IF (l_http_resp.status_code >= 400) AND (l_http_resp.status_code <= 499) THEN
dbms_output.put_line('Check the URL.');
utl_http.end_response(l_http_resp);
-- Look for server-side error and report it.
elsif (l_http_resp.status_code >= 500) AND (l_http_resp.status_code <= 599) THEN
dbms_output.put_line('Check if the Web site is up.');
utl_http.end_response(l_http_resp);
RETURN;
END IF;
utl_http.end_response (l_http_resp);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line (sqlerrm);
raise;
END; and executing in sqldeveloper 3.2.20.09 when connecting directly to box B as scott:
SET serveroutput ON
DECLARE
l_url VARCHAR2(200) :='http://MY_IP:8585/apex/demo';
l_json VARCHAR2(20000) := '{"title":"thetitle","description":"thedescription"}';
l_response VARCHAR2(30000);
BEGIN
post( p_url => l_url, p_message =>l_json, p_response => l_response);
END;which resulted in :
anonymous block completed
status code: 200
reason phrase: OK
with data inserted. Setup using 2.0.1
Workspace : wsdemo
RESTful Service Module: demo/
URI Template: test
Method: POST
Source Type: PL/SQLand executing in sqldeveloper 3.2.20.09 when connecting directly to box B as scott:
SET serveroutput ON
DECLARE
l_url VARCHAR2(200) :='http://MY_IP:8585//apex/wsdemo/demo/test';
l_json VARCHAR2(20000) := '{"title":"thetitle","description":"thedescription"}';
l_response VARCHAR2(30000);
BEGIN
post( p_url => l_url, p_message =>l_json, p_response => l_response);
END;which resulted in :
status code: 500
reason phrase: Internal Server Error
Listener's log:
Request Path passes syntax validation
Mapping request to database pool: PoolMap [_poolName=apex, _regex=null, _workspaceIdentifier=WSDEMO, _failed=false, _lastUpdate=1364313600000, _template=/wsdemo/, _type=BASE_PATH]
Applied database connection info
Attempting to process with PL/SQL Gateway
Not processed as PL/SQL Gateway request
Attempting to process as a RESTful Service
demo/test matches: demo/test score: 0
Choosing: oracle.dbtools.rt.resource.templates.jdbc.JDBCResourceTemplateDispatcher as current candidate with score: Score [handle=JDBCURITemplate [scopeId=null, templateId=2648625079503782|2797815111031405, uriTemplate=demo/test], score=0, scope=SecurityConfig [constraint=none, realm=NONE, logonConfig=LogonConfig [logonForm=null, logonFailed=null]], originsAllowed=[], corsEnabled=true]
Determining if request can be dispatched as a Tenanted RESTful Service
Request path has one path segment, continuing processing
Tenant Principal already established, cannot dispatch
Chose oracle.dbtools.rt.resource.templates.jdbc.JDBCResourceTemplateDispatcher as the final candidate with score: Score [handle=JDBCURITemplate [scopeId=null, templateId=2648625079503782|2797815111031405, uriTemplate=demo/test], score=0, scope=SecurityConfig [constraint=none, realm=NONE, logonConfig=LogonConfig [logonForm=null, logonFailed=null]], originsAllowed=[], corsEnabled=true] for: POST demo/test
demo/test is a public resource
Using generator: oracle.dbtools.rt.plsql.AnonymousBlockGenerator
Performing JDBC request as: SCOTT
Mar 28, 2013 1:29:28 PM oracle.dbtools.common.jdbc.JDBCCallImpl execute
INFO: Error occurred during execution of: [CALL, begin
insert into scott.json_demo values(/*in:title*/?,/*in:description*/?);
end;, [title, in, class oracle.dbtools.common.stmt.UnknownParameterType], [description, in, class oracle.dbtools.common.stmt.UnknownParameterType]]with values: [thetitle, thedescription]
Mar 28, 2013 1:29:28 PM oracle.dbtools.common.jdbc.JDBCCallImpl execute
INFO: ORA-06550: line 1, column 6:
PLS-00103: Encountered the symbol "" when expecting one of the following:
begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe
The symbol "" was ignored.
ORA-06550: line 2, column 74:
PLS-00103: Encountered the symbol "" when expecting one of the following:
begin case declare end exception exit for goto if loop mod
null pragma raise return select update while with
<an identifier> <a double-quoted delimited-id
java.sql.SQLException: ORA-06550: line 1, column 6:
PLS-00103: Encountered the symbol "" when expecting one of the following:
begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe
The symbol "" was ignored.
ORA-06550: line 2, column 74:
PLS-00103: Encountered the symbol "" when expecting one of the following:
begin case declare end exception exit for goto if loop mod
null pragma raise return select update while with
<an identifier> <a double-quoted delimited-id
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:505)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:223)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:205)
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1043)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1336)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3612)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3713)
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4755)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1378)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at oracle.ucp.jdbc.proxy.StatementProxyFactory.invoke(StatementProxyFactory.java:242)
at oracle.ucp.jdbc.proxy.PreparedStatementProxyFactory.invoke(PreparedStatementProxyFactory.java:124)
at oracle.ucp.jdbc.proxy.CallableStatementProxyFactory.invoke(CallableStatementProxyFactory.java:101)
at $Proxy46.execute(Unknown Source)
at oracle.dbtools.common.jdbc.JDBCCallImpl.execute(JDBCCallImpl.java:44)
at oracle.dbtools.rt.plsql.AnonymousBlockGenerator.generate(AnonymousBlockGenerator.java:176)
at oracle.dbtools.rt.resource.templates.v2.ResourceTemplatesDispatcher$HttpResourceGenerator.response(ResourceTemplatesDispatcher.java:309)
at oracle.dbtools.rt.web.RequestDispatchers.dispatch(RequestDispatchers.java:88)
at oracle.dbtools.rt.web.HttpEndpointBase.restfulServices(HttpEndpointBase.java:412)
at oracle.dbtools.rt.web.HttpEndpointBase.service(HttpEndpointBase.java:162)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at com.sun.grizzly.http.servlet.ServletAdapter$FilterChainImpl.doFilter(ServletAdapter.java:1059)
at com.sun.grizzly.http.servlet.ServletAdapter$FilterChainImpl.invokeFilterChain(ServletAdapter.java:999)
at com.sun.grizzly.http.servlet.ServletAdapter.doService(ServletAdapter.java:434)
at oracle.dbtools.standalone.SecureServletAdapter.doService(SecureServletAdapter.java:65)
at com.sun.grizzly.http.servlet.ServletAdapter.service(ServletAdapter.java:379)
at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:179)
at com.sun.grizzly.tcp.http11.GrizzlyAdapterChain.service(GrizzlyAdapterChain.java:196)
at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:179)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:662)
Error during evaluation of resource template: ORA-06550: line 1, column 6:
PLS-00103: Encountered the symbol "" when expecting one of the following:
begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe
The symbol "" was ignored.
ORA-06550: line 2, column 74:
PLS-00103: Encountered the symbol "" when expecting one of the following:
begin case declare end exception exit for goto if loop mod
null pragma raise return select update while with
<an identifier> <a double-quoted delimited-idPlease advise.
Regards
ZackZack.L wrote:
Hi Andy,
Sorry, forgot to post the Source that's use by both AL1.1.4 and AL2.0.1.
Source
begin
insert into scott.json_demo values(:title,:description);
end;
it's failing during the insert?
Yes, it failed during insert using AL2.0.1.
So the above statement produces the following error message:
The symbol "" was ignored.
ORA-06550: line 2, column 74:
PLS-00103: Encountered the symbol "" when expecting one of the following:
begin case declare end exception exit for goto if loop mod
null pragma raise return select update while with
<an identifier> <a double-quoted delimited-idThis suggests to me that an unprintable character (notice how there is nothing between the double quotes - "") has worked its way into your PL/SQL Handler. Note how the error is reported to be a column 74 on line 2, yet line 2 of the above block should only have 58 characters, so at a pure guess somehow there's extra whitespace on line 2, that is confusing the PL/SQL compiler, I suggest re-typing the PL/SQL handler manually and seeing if that cures the problem. -
How can i put a file into blob(using sun.jdbc.odbc.JdbcOdbcDriver)
Hi
i tried to put a file into blob , but got a problem.....
My environment:windows 2000pro,JBuilder 5.0 enterprise,oracle 8.1.6,(not install oracle jdbc driver )
a part of program(my program is very uglily,if anyone want,later i paste it ba....~_~)
//Statement stmt2=null;
//Resultset rs2;
//opa1 is the blob data
void saveBlobTableToDisk(Connection con) {
try {
stmt2=con.createStatement();
sqlStr2="SELECT * FROM emp3 where id=1004";
rs2=stmt2.executeQuery(sqlStr2);
while (rs2.next()) {
Blob aBlob=rs2.getBlob("opa1");
i got the exception :
" null
java.lang.UnsupportedOperationException
at sun.jdbc.odbc.JdbcOdbcResultSet.getBlob(JdbcOdbcResultSet.java:4174)
at test3.Frame1.saveBlobTableToDisk(Frame1.java:48)
at test3.Frame1.<init>(Frame1.java:26)
at test3.Application1.<init>(Application1.java:5)
at test3.Application1.main(Application1.java:8) "
and the windows pop up a messagebox said that(about) my memory "0x09af007f" could not read, error in javaw.exe .
Later i used (ResultSet)getBinaryStream() to solve it. but getBinaryStream() only return a InputStream,so that i can make blob to a file,but i can't make a file to blob using jdbc.....
I am very stupid that installing sun java, oracle jdbc driver etc....(because i must set a lot of thing such as classpath,java_home etc), Can i only use JBuilder to do that ?
Or i must install oracle jdbc driver ?
Thanks.My guess here is that Sun's JDBC-ODBC bridge doesn't handle the BLOB datatype. Most ODBC drivers don't support that datatype, so I wouldn't expect the bridge to.
Is there a reason that you can't use the Oracle driver?
Justin -
How can i put a file into blob using jdbc !?
Hi
i tried to put a file into blob , but got a problem.....
My environment:windows 2000pro,JBuilder 5.0 enterprise,oracle 8.1.6,(not install oracle jdbc driver )
a part of program(my program is very uglily,if anyone want,later i paste it ba....~_~)
//Statement stmt2=null;
//Resultset rs2;
//opa1 is the blob data
void saveBlobTableToDisk(Connection con) {
try {
stmt2=con.createStatement();
sqlStr2="SELECT * FROM emp3 where id=1004";
rs2=stmt2.executeQuery(sqlStr2);
while (rs2.next()) {
Blob aBlob=rs2.getBlob("opa1");
i got the exception :
" null
java.lang.UnsupportedOperationException
at sun.jdbc.odbc.JdbcOdbcResultSet.getBlob(JdbcOdbcResultSet.java:4174)
at test3.Frame1.saveBlobTableToDisk(Frame1.java:48)
at test3.Frame1.<init>(Frame1.java:26)
at test3.Application1.<init>(Application1.java:5)
at test3.Application1.main(Application1.java:8) "
and the windows pop up a messagebox said that(about) my memory "0x09af007f" could not read, error in javaw.exe .
Later i used (ResultSet)getBinaryStream() to solve it. but getBinaryStream() only return a InputStream,so that i can make blob to a file,but i can't make a file to blob using jdbc.....
I am very stupid that installing sun java, oracle jdbc driver etc....(because i must set a lot of thing such as classpath,java_home etc), Can i only use JBuilder to do that ?
Or i must install oracle jdbc driver ?
Thanks.
D.T.My guess here is that Sun's JDBC-ODBC bridge doesn't handle the BLOB datatype. Most ODBC drivers don't support that datatype, so I wouldn't expect the bridge to.
Is there a reason that you can't use the Oracle driver?
Justin
Maybe you are looking for
-
My name is Janet Haynes. I have a PC and it crashed. I now have a new PC and have installed itunes. My music list appears with ! by them. How do I get my purchased music back. I have done all the online support and nothing has worked. I made an
-
Concatenate text at transfer structure
Hello Is it possible to concatenate 2 text at transfer staruture level via routine and to keep them in one infoobject. ? ANd can we pull this concatenate text in Bex analyzer and would it show the same long text in report ? Regards
-
How do I get purchased actions to work on CS6?
I am new to Photoshop. I purchased actions. I followed the directions to install it. The actions show up in my list, however, I can not get them to work. It doesnt allow me to click play on any of the new purcahased ones. I have Windows 8 operating s
-
How to insert Captivate content into Dreamvweaver
Hi, so I've finished my first movie and I want to publish it - which works, but I want to insert things into XHTML file via Dreamweaver. Is there a way how to do it? There are two swf files, one html and one javascript. How to make Dreamweaver put th
-
Reporting Agent precalculation of web templates - ctrl query
Hi, I have defined a RA setting for precalculating a web template with a control query (to filter results via a dropdown list, as in offline cockpit scenarios). However, the execution of Scheduling Package gives no result, i.e no html pages are gener