XML DB Native Webservice - Procedure returning user defined TYPE
Hi folks,
I’ve used XML DB Native Webservice feature to expose some PLSQL Procedures and Functions as webservices.
The feature works great, however I found a situation where XML DB is not able to generate the WSDL document.
Here is an example of a procedure signature:
Procedure LISTA_ESTADO (
p_NomeEstado OUT NomeEstadoTB,
p_IdEstado OUT IdentifUnico,
vr_CodRetorno OUT CodRetorno,
batch_size IN INT,
out_batch_size IN OUT INT,
status OUT INT)
In this case, when I try to get the WSDL document, I receive the error message below.
<soap:Envelope>
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Error processing input</faultstring>
<detail>
<OracleErrors></OracleErrors>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
The problem seems to be related with the first three OUT parameters, that are based on an user created TYPE.
In this example, the TYPES are defined as:
TYPE NomeEstadoTB IS TABLE OF CHAR(25)
INDEX BY BINARY_INTEGER;
TYPE IdentifUnico IS TABLE OF NUMBER(10)
INDEX BY BINARY_INTEGER;
TYPE CodRetorno IS TABLE OF CHAR(10)
INDEX BY BINARY_INTEGER;
I’d like to know if XML DB can publish procedures like that as a webservice and if affirmative, how to do that?
Thanks In Advance,
Luis
I am very new to this. New to Oracle, PL/SQL, OO programming or testing?
set serveroutput on
declare
tst_obj ctype;
begin
tst_obj := pkg.proc(11);
dbms_output.put_line('id='||tst_obj.id||'::code='||tst_obj.code||'::usage='||tst_obj.usage);
end;
/Generally I disapprove of the use of DBMS_OUTPUT (for just about anything) but it is sufficient to demonstrate the basic principle.
Really you should start using proper testing practices, ideally with an automated test harness like QUTE.
Cheers, APC
Blog : http://radiofreetooting.blogspot.com/
Similar Messages
-
Problem calling stored procedure with user-defined type of input parameters
Hi,
I have to call a stored procedure with IN parameters, but these are user-defined types of input parameters.
function fv_createnews (
pit_groups in T_APPLICATION_USER_GROUPS,
pit_documents in T_DOCUMENTS
return varchar2;
TYPE T_APPLICATION_USER_GROUPS IS
TABLE OF varchar2(500)
INDEX BY binary_integer;
TYPE T_DOCUMENT IS record (
name varchar2(256)
,url varchar2(1024)
,lang varchar2(30)
,foldername varchar2(150)
TYPE T_DOCUMENTS IS
TABLE OF T_DOCUMENT
INDEX BY binary_integer;
How can I do this using the TopLink 10.1.3 API.
I already found following related posts, but I still can' t make it up:
Using VARRAYs as parameters to a Stored Procedure
Pass Object as In/Out Parameter in Stored Procedure
Or do I have to create my own PreparedStatement for this special stored procedure call using Java and Toplink?As the related posts suggest, you will need to use direct JDBC code for this.
Also I'm not sure JDBC supports the RECORD type, so you may need to wrap your stored functions with ones that either flatten the record out, or take OBJECT types. -
Deploying c# procedure with user-defined type
Hi
I've written a c# procedure which makes use of some Oracle user-defined types (c# classes generated using the wizard).
I will be calling the procedure from an Oracle package and one of the out parameters needs to be one of my user defined Oracle objects (basically a record object). My problem is when I come to deploy the package, it tells me "... does not contain any .NET stored procedures that can be deployed to Oracle"
If I change the user defined type (out param) to something like an Int32 or string, it works fine. AFAIK the latest version of ODT/ODAC supports user defined types. For Info I've 11g Client , .Net v4 & VS2010
quick example of procedure entry point.
works:
public static void GetOrderCost(int OrderNr, out Int32 orderCost )
Not work:
public static void GetOrderCost(int OrderNr, out ORDER_RECORD orderCost ) - Note: ORDER_RECORD is the class created using the class generation wizard.
I've spent 2 days now trying to get this to work, perhaps its not possible or perhaps my setup is not quite right but any help gratefully received.
Ianthink I have found some small print which scuppers my plan. Good if some one could confirm and nicer if someone could suggest a workaround (without resorting to writing the UDT to a Oracle table)
Oracle User-Defined Type (UDT) Support
UDTs are not supported within a context connection but they are supported with a client connection. UDTs are not supported as parameters to .NET stored procedures.
Source:
http://docs.oracle.com/cd/E14435_01/win.111/e10927/extenRest.htm#CJAHJBJI
So you can use UDT's within the body of the procedure (and can read them off the DB) but as yet its not possible to use them as parameters. -
How to read my cursor that is ref cursor returning user defined type
Hi
I have types defined as follows:
TYPE MY_RECORD IS RECORD (
COL1 TABLE1.COL1%TYPE,
COL2 TABLE1.COL2%TYPE
TYPE MY_CURSOR IS REF CURSOR
RETURN MY_RECORD;This is used as return type in a stored procedure.
I have a pl/sql block where I make a call to the SP that returns this cursor.
How can I read individual values being returned from SP?SQL> create or replace package pkg
as
type my_record is record (col1 emp.empno%type, col2 emp.ename%type);
type my_cursor is ref cursor
return my_record;
procedure p (cur out my_cursor);
end pkg;
Package created.
SQL> create or replace package body pkg
as
procedure p (cur out my_cursor)
as
begin
open cur for
select empno, ename
from emp
where rownum <= 2;
end p;
end pkg;
Package body created.
SQL> declare
cur pkg.my_cursor;
e_rec pkg.my_record;
begin
pkg.p (cur);
loop
fetch cur into e_rec;
exit when cur%notfound;
dbms_output.put ('Empno: ' || e_rec.col1);
dbms_output.put_line ('; Ename: ' || e_rec.col2);
end loop;
close cur;
end;
Empno: 7369; Ename: SMITH
Empno: 7499; Ename: ALLEN
PL/SQL procedure successfully completed. -
Return User Defined Exceptions from SP
Hi,
Is it possible to return user defined business exceptions from a stored procedure to the dotnet app. through ODP. NET( equivalent to the throw keyword in Java)?
I would prefer to handle all of the oracle expections in the try catch block of the C# code.
Thanks,
PeeyushIs your question how to return a custom exception from PLSQL? You'd use RAISE_APPLICATION_ERROR for that, and yes it would propagate via ODP to the calling application.
Here's a simple dumb example:
create or replace procedure raise_my_error as
begin
raise_application_error(-20001,'something bad happened');
end;
Hope it helps,
Greg -
Guys i am using Entity Framework 5 code first (I am not using edmx) with Oracle and all works good, Now i am trying to get data from stored procedure which is under package but stored procedure have out param which is user define type, Now my question is
how i will call stored procedure from entity framework
Thanks in advance.I agree with you, but issue is we have lots of existing store procedure, which we need to call where damn required. I am sure those will be few but still i need to find out.
If you think you are going to get existing MS Stored Procedures or Oracle Packages that had nothing to do with the ORM previously to work that are not geared to do simple CRUD operations with the ORM and the database tables, you have a rude awakening
coming that's for sure. You had better look into using ADO.NET and Oracle Command objects and call those Oracle Packages by those means and use a datareader.
You could use the EF backdoor, call Oracle Command object and use the Packages, if that's even possible, just like you can use MS SQL Server Stored Procedures or in-line T-SQL via the EF backdoor.
That's about your best shot.
http://blogs.msdn.com/b/alexj/archive/2009/11/07/tip-41-how-to-execute-t-sql-directly-against-the-database.aspx -
Using stored procedure with Oracle user-defined types in database control
Hi,
I have a requirement where I need to call an Oracle Stored Proc which has IN and OUT parameters. OUT parameters are of user-defined types in Oracle packages.
I am getting error while calling the Stored proc like below:
Procedure:
==========
create or replace
PROCEDURE AA_SAM_TEST (
col1 out types_aa.aa_tex_type ,
col2 out types_aa.aa_tex_type ,
col2 out types_aa.aa_num_type ) As
Types:
======
create or replace
package types_aa as
type aa_tex_type is table of varchar2(255) index by binary_integer;
type aa_num_type is table of char index by binary_integer;
end
Wli Code:
=========
DB Control:
===========
* @jc:sql statement="call AA_SAM_TEST(?,?,?)"
void Call_AA_SAM_TEST(SQLParameter[] param) throws SQLException;
JPD Code:
=========
param = new SQLParameter[3];
Object param1 = new String();
Object param2 = new String();
Object param3 = new String();
this.param[0] = new SQLParameter(param1 , Types.STRUCT, SQLParameter.OUT);
this.param[1] = new SQLParameter(param2, Types.STRUCT, SQLParameter.OUT);
this.param[2] = new SQLParameter(param3, Types.STRUCT, SQLParameter.OUT);
database_Update.Call_AA_SAM_TEST(this.param);
I am getting the following error...
<Jul 24, 2007 6:47:42 PM IST> <Warning> <WLW> <000000> <Id=database_Update; Method=Ctrl_files.Database_Update.Call_AA_SAM_TEST(); Failure=java.sql.SQLException: ORA-06553: PLS-:
ORA-06553: PLS-:
ORA-06553: PLS-:
ORA-06553: PLS-:
ORA-06553: PLS-:
ORA-06553: PLS-306: wrong number or typ
ORA-06553: PLS-306: wrong number or types of arguments in call to 'AA_SAM_TEST'
ORA-06553: PLS-306: wrong number or types of arguments in call to 'AA_SAM_TEST'
Can anyone know how to specify OUT parameter of USer-Defined types while using a DB control to access a Stored Proc in Oracle.
Any help is highly appreciated.
ThanksHi,
I have similar problem. Have you already solved the issue?
Thanks -
Calling procedure with user defined IN & OUT parameters
I have procedure in a package which I need to call from the JDBC. My problem is, that procedure take user-defined data types as IN parameters & gives user-defined OUT paramters. How do I call a procedure like this. Do I need to write the wrapper class. If so from where do I start, I mean I don't have any idea about writing wrapper classes. Below is the package spec which might help you uderstand my question more clearly.
CREATE OR REPLACE PACKAGE FAM_AR_SUMMARY_PKG IS
TYPE ar_summ_rec_type IS RECORD (
CUST_NAME hz_parties.party_name%TYPE,
CUST_ACCT_NO hz_cust_accounts_all.ACCOUNT_NUMBER%TYPE,
CUST_ACCT_BAL NUMBER,
CUST_PAST_DUE_BAL NUMBER,
CUST_UNAPP_REC_BAL NUMBER,
CONTRACT_NO okc_k_headers_b.CONTRACT_NUMBER%TYPE,
ANN_DATE okc_k_headers_b.END_DATE%TYPE,
TOT_CONTRACT_VALUE okc_k_headers_b.ESTIMATED_AMOUNT%TYPE,
PAST_DUE_AMT NUMBER,
DAYS_PAST_DUE NUMBER,
INV_PAST_DUE NUMBER,
DEP_INV_BAL NUMBER,
AMT_CREDITED NUMBER);
TYPE ar_summ_tbl_type IS TABLE OF ar_summ_rec_type
INDEX BY BINARY_INTEGER;
PROCEDURE FAM_GET_AR_SUMMARY(p_cust_name IN hz_parties.party_name%TYPE,
p_chr_id IN okc_k_headers_b.ID%TYPE,
x_ar_summ_tbl OUT NOCOPY ar_summ_tbl_type,
x_excp_message OUT VARCHAR2);
END FAM_AR_SUMMARY_PKG;Hi,
U cant get the type record from the DB with java. I hope u r using oracle. Instead u can create a Type object and then make it as an OUT parameter. Try reading the oracle documentation for it (JDBC Developer's Guide and Reference).
Regards,
Chandru.M -
Confused: Returning Simple User Defined Type (non-built-in)
Hi, hope you can straighten out a confused newbie! This is probably laughingly simple if you know how...
I just want my weblogic workshop web service to return an ordinary record-style object to my static client. I'm not sure what to do, I've already tried a few approaches...
If I use two services deployed on Weblogic Server everything works great. Weblogic server must handle the seriali/deseriali - zation for you.
So I tried to use the java proxy downloaded from the test page, but it doesn't contain all the classes needed.
I read the Weblogic help files which said to use autotype, which compiles but gives class cast exceptions running. I tried both automatic and manual with same error. Trying to import to Workshop gave me a "no handler defined error".
And I bought a book from Amazon about J2EE and Weblogic but it does not include a section on user defined types!
Am I supposed to use XMLBeans or something??? Please help!
Regards, Ry.> but the requirement is not allowing me to do either with ref cursor or with
returning clause. Because, in .Net development area , we are restricted for
using Returning clause.
The following is a Bad Idea (tm) where PL/SQL is used to "return data" to the caller, be that via PL/SQL record types or collection types..Net ---[calls]-------> PL/SQL
PL/SQL ---[calls]-------> SQL
PL/SQL <--[data]--------- SQL
PL/SQL [buffers] data
.Net <--[buffer data]-- PL/SQLWhy?
Because PL/SQL is a poor choice for a buffer as the db cache buffer used by the SQL engine is a very advance and sophisticated cache and core to the Oracle RDBMS.
Ain't no way you can do that better in PL/SQL than SQL.
What is the typical client-server approach in Oracle?.Net ---[calls]-------> PL/SQL
PL/SQL [constructs ref cursor]
.Net <--[ref cursor]-- PL/SQL
.Net --[fetches]----> SQL [using ref cursor]A ref cursor is a pointer the "compiled and executable SQL program" in Oracle that PL/SQL constructed for .Net in this case. Each FETCH call using the ref cursor pointer, executes the cursor "program" and returns the next row (or set of rows when using bulk processing) to the client. -
Table OF user defined type in c#
Hello
I am running C# using Oracle (PL/SQL, provider ODP.NET
11.1.0.6.20) and I have a procedure which at the moment returns a table of
records. The code below demonstrates this.
TYPE R_OutData_tab IS RECORD ( ... );
TYPE OutData_tab IS TABLE OF R_OutData_tab INDEX BY BINARY_INTEGER;
PROCEDURE PROPERTY_GET (tOutData OUT <packagename>.OutData_tab);
Since .NET doesn't support Oracle records I'm looking into rewriting the
procedure so that it returns a table of a user defined type instead. The
code below demonstrates this.
create type person_type as object (name varchar2(30), address varchar2(60),
age varchar2(3));
TYPE person_table IS TABLE OF odp_obj1_sample_person_type;
PROCEDURE PERSONS_GET(out_persons OUT person_table);
I know how to handle a single user-defined type in .NET returned from a
Oralce procedure but what I need to do now is to receive a or pass table of a user
defined type using procedure. Is this supported in .NET?Dear ,
I have posted a similar kind of reply in one of the thread which may help u defining the User Defined Tabel /Filed .Just check this Out :
For cm25/CM21 : Assuming that you have all the other set up for Capacity Requirement in place , please note the belwo steps for layout design for CM25 OR cm21 or cm22( all you will be used same overall profile )
1.Make sure that you have proper Overall profile defined in OPD0-Define Overall profile .Here u will define Time Profile , Startegy prfoile . Lay out Profile etc .
2.To paint your layout your soultion is to Goto -CY38-Pop down the menu -Select the Lay out Key which have been used as lay out -Goto Change Mode (Pencil symbol)-Now you will find the fields are high ligheted as per CM25 dipaly in a sequnce -You can un chekcde the Filed like Operation , Operation text , Setup what ever you do not want to show in Order Pool and Hit SAVE butotn and come back .
CM25 --> Settings --> Display Profiles --> Planning tab.profile --> I01 --> Layout ID ( Example : 'SAPSFCLA05') which is Main Capacity Lay out id .
If you goto CY38-Pop down the menu -You will find Main Capcitity Lay out Id : Example SAPSFCAS01 -Enter this lay out and chenage accordingly as I have explained in above
Once you save this , then go back to CM25 and execute with coupe of work centres to check how is the order pool looks now .
Refer this threade for Layout Id and option which u may need for CM25 front end
Exception messages in CM21 or CM25
I hope this should work
Regards -
Access result set in user define type of table
here is the situation. I have a stored procedure that dequeues messages of a AQ and passes them as an OUT parameter in a collection of a user defined type. The same type used to define the queues. The java code executes properly but seems like we don't/can't access the result set. We don't receive any erros but don't know how to access the results. I've included relevant parts of the problem.
I know this should be doable but........Can someone please tell us what we are doing wrong....thanks in advance.
-----create object type
create type evt_ot as object(
table_name varchar(40),
table_data varchar(4000));
---create table of object types.
create type msg_evt_table is table of evt_ot;
----create queue table with object type
begin
DBMS_AQADM.CREATE_QUEUE_TABLE (
Queue_table => 'etlload.aq_qtt_text',
Queue_payload_type => 'etlload.evt_ot');
end;
---create queues.
begin
DBMS_AQADM.CREATE_QUEUE (
Queue_name => 'etlload.aq_text_que',
Queue_table => 'etlload.aq_qtt_text');
end;
Rem
Rem Starting the queues and enable both enqueue and dequeue
Rem
EXECUTE DBMS_AQADM.START_QUEUE (Queue_name => 'etlload.aq_text_que');
----create procedure to dequeue an array and pass it OUT using msg_evt_table ---type collection.
create or replace procedure test_aq_q (
i_array_size in number ,
o_array_size out number ,
text1 out msg_evt_table) is
begin
DECLARE
message_properties_array dbms_aq.message_properties_array_t :=
dbms_aq.message_properties_array_t();
msgid_array dbms_aq.msgid_array_t;
dequeue_options dbms_aq.dequeue_options_t;
message etlload.msg_evt_table;
id pls_integer := 0;
retval pls_integer := 0;
total_retval pls_integer := 0;
ctr number :=0;
havedata boolean :=true;
java_exp exception;
no_messages exception;
pragma EXCEPTION_INIT (java_exp, -24197);
pragma exception_init (no_messages, -25228);
BEGIN
DBMS_OUTPUT.ENABLE (20000);
dequeue_options.wait :=0;
dequeue_options.correlation := 'event' ;
id := i_array_size;
-- Dequeue this message from AQ queue using DBMS_AQ package
begin
retval := dbms_aq.dequeue_array(
queue_name => 'etlload.aq_text_que',
dequeue_options => dequeue_options,
array_size => id,
message_properties_array => message_properties_array,
payload_array => message,
msgid_array => msgid_array);
text1 := message;
o_array_size := retval;
EXCEPTION
WHEN java_exp THEN
dbms_output.put_line('exception information:');
WHEN no_messages THEN
havedata := false;
o_array_size := 0;
end;
end;
END;
----below is the java code....
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Struct;
import oracle.jdbc.driver.OracleCallableStatement;
import oracle.jdbc.driver.OracleTypes;
public class TestOracleArray {
private final String SQL = "{call etlload.test_aq_q(?,?,?)}";//array size, var name for return value, MessageEventTable
private final String driverClass = "oracle.jdbc.driver.OracleDriver";
private final String serverName = "OurServerName";
private final String port = "1500";
private final String sid = "OurSid";
private final String userId = "OurUser";
private final String pwd = "OurPwd";
Connection conn = null;
public static void main(String[] args){
TestOracleArray toa = new TestOracleArray();
try {
toa.go();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
private void go() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException{
Class.forName(driverClass).newInstance();
String url = "jdbc:oracle:thin:@"+serverName+":"+port+":"+sid;
conn = DriverManager.getConnection(url,userId,pwd);
OracleCallableStatement stmt = (OracleCallableStatement)conn.prepareCall(SQL);
//set 1 input
stmt.setInt(1, 50);
//register out 1
stmt.registerOutParameter(2, OracleTypes.NUMERIC);
//register out 2
stmt.registerOutParameter(3, OracleTypes.ARRAY, "MSG_EVT_TABLE");
* This code returns a non-null ResultSet but there is no data in the ResultSet
* ResultSet rs = stmt.executeQuery();
* rs.close();
* Tried all sorts of combinations of getXXXX(1);
* All return the same error Message: Invalid column index
* So it appears that the execute statment returns no data.
stmt.execute();
Struct myObject = (Struct)stmt.getObject(1);
stmt.close();
conn.close();
}Hi,
Sorry but I'd refer you to the following sections (and code samples/snippets) in my book:
Mapping User-Defined Object Types (AD) to oracle.sql.STRUCT in section 3.3, shows how to pass user defined types as IN, OUT,IN/OUT
JMS over Streams/AQ in the Database: shows how to consume AQ
message paylod in section 4.2.4
CorporateOnine, in section 17.2, show how to exchanges user defined type objects b/w AQ and JMS
All these will hopefully help you achieve what you are trying to do.
Kuassi -
Oracle 11g AQ : problem enqueue user-defined type with varchar2 attribute
Hello.
I have a problem enqueuing a user-defined type to the queue on Oracle 10g.
I'm using jdbc driver (ojdbc5.jar, version 11.1.0.6.0) as they provide oracle.jdbc.aq package.
The type is following:
CREATE OR REPLACE TYPE FIXED_T5 AS OBJECT
(id integer,
label varchar2(100),
code integer,
today date
)I have created a java class for this type with jpub utility supplied with oracle 11g client package:
jpub -user=scott/tger -url=jdbc:oracle:thin:@host:sid-sql=FIXED_T5:ru.invito.FixedType -compile=falseIt generated FixedType.java and FixedTypeRef.java files. Don't understand why i need the latter (FixedTypeRef).
Then in test app:
package ru.invito;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;
import java.util.Properties;
import java.util.UUID;
import junit.framework.TestCase;
import oracle.jdbc.aq.AQAgent;
import oracle.jdbc.aq.AQEnqueueOptions;
import oracle.jdbc.aq.AQFactory;
import oracle.jdbc.aq.AQMessage;
import oracle.jdbc.aq.AQMessageProperties;
import oracle.jdbc.aq.AQEnqueueOptions.DeliveryMode;
import oracle.jdbc.aq.AQEnqueueOptions.VisibilityOption;
import oracle.jdbc.driver.OracleConnection;
import oracle.jdbc.driver.OracleDriver;
import oracle.sql.Datum;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class AqTest extends TestCase {
protected Log logger = LogFactory.getLog(getClass());
public void testEnqueue() throws Exception {
OracleDriver dr = new OracleDriver();
Properties prop = new Properties();
prop.setProperty("user", Config.USERNAME);
prop.setProperty("password", Config.PASSWORD);
OracleConnection connection = (OracleConnection) dr.connect(Config.JDBC_URL, prop);
assertNotNull(connection);
connection.setAutoCommit(false);
enqueueMessage(connection, "INVITO.FIXED_T5Q", null);
connection.commit();
private void enqueueMessage(OracleConnection conn, String queueName, AQAgent[] recipients) throws SQLException,
IOException {
logger.debug("----------- Enqueue start ------------");
AQMessageProperties props = makeProps(queueName);
AQMessage mesg = AQFactory.createAQMessage(props);
String msqText = String.format("Hello, %s!", queueName);
FixedType data = createData(36, msqText);
Datum d = data.toDatum(conn);
STRUCT s = (STRUCT) d;
debugStruct("s", s);
String toIdStr = byteBufferToHexString(s.getDescriptor().getOracleTypeADT().getTOID(), 20);
logger.debug("s.toIdStr: " + toIdStr);
StructDescriptor sd = StructDescriptor.createDescriptor("INVITO.FIXED_T5", conn);
logger.debug("sd.toXMLString(): " + sd.toXMLString());
mesg.setPayload(s);
AQEnqueueOptions opt = makeEnqueueOptions();
logger.debug("sending............");
// execute the actual enqueue operation:
conn.enqueue(queueName, opt, mesg);
debugMessageId(mesg);
logger.debug("----------- Enqueue done ------------");
private void debugMessageId(AQMessage mesg) throws SQLException {
byte[] mesgId = mesg.getMessageId();
if (mesgId == null) {
throw new IllegalStateException("message id is NULL");
String mesgIdStr = byteBufferToHexString(mesgId, 20);
logger.debug("Message ID from enqueue call: " + mesgIdStr);
* @return
* @throws SQLException
private FixedType createData(int ID, String label) throws SQLException {
FixedType data = new FixedType();
data._struct.setNChar(1);// initializes the flag for 'label' field
data.setId(ID);
data.setLabel(label);
data.setCode(1);
Date today = new Date();
data.setToday(new Timestamp(today.getTime()));
return data;
* @param string
* @param s
* @throws SQLException
private void debugStruct(String string, STRUCT s) throws SQLException {
logger.debug(s + ".debugString(): " + s.debugString());
logger.debug(s + "s.dump(): " + s.dump());
* @return
* @throws SQLException
private AQAgent makeAgent() throws SQLException {
AQAgent ag = AQFactory.createAQAgent();
ag.setName("AQ_TEST");
String agentAddress = null;
try {
agentAddress = InetAddress.getLocalHost().getHostAddress();
catch (UnknownHostException e) {
logger.error("cannot resolve localhost ip address. will not set it as AQ Agent address");
agentAddress = "NA";
ag.setAddress(agentAddress);
return ag;
private AQMessageProperties makeProps(String queueName) throws SQLException {
final String EXCEPTION_Q_TEMPLATE = "AQ$_%sT_E";
final int DEFAULT_DELAY = 0;
final int DEFAULT_EXPIRATION = -1;
final int DEFAULT_PRIORITY = 0;
AQMessageProperties propeties = AQFactory.createAQMessageProperties();
propeties.setCorrelation(UUID.randomUUID().toString());
propeties.setDelay(DEFAULT_DELAY);
propeties.setExceptionQueue(String.format(EXCEPTION_Q_TEMPLATE, queueName));
propeties.setExpiration(DEFAULT_EXPIRATION);
propeties.setPriority(DEFAULT_PRIORITY);
// propeties.setRecipientList(null);//should not set
propeties.setSender(makeAgent());
return propeties;
* @return
* @throws SQLException
private AQEnqueueOptions makeEnqueueOptions() throws SQLException {
AQEnqueueOptions opt = new AQEnqueueOptions();
opt.setRetrieveMessageId(true);
// these are the default settings (if none specified)
opt.setDeliveryMode(DeliveryMode.PERSISTENT);
opt.setTransformation(null);
opt.setVisibility(VisibilityOption.ON_COMMIT);
return opt;
* Form the AQ reference
* @param buffer
* @param maxNbOfBytes
* @return
private static final String byteBufferToHexString(byte[] buffer, int maxNbOfBytes) {
if (buffer == null)
return null;
int offset = 0;
StringBuffer sb = new StringBuffer();
while (offset < buffer.length && offset < maxNbOfBytes) {
String hexrep = Integer.toHexString((int) buffer[offset] & 0xFF);
if (hexrep.length() == 1)
hexrep = "0" + hexrep;
sb.append(hexrep);
offset++;
String ret = sb.toString();
return ret;
}The output is following:
[main] 2008-07-03 19:09:49,863 DEBUG [ru.invito.AqTest] - ----------- Enqueue start ------------
[main] 2008-07-03 19:09:50,348 DEBUG [ru.invito.AqTest] - [email protected](): name = INVITO.FIXED_T5 length = 4 attribute[0] = 36 attribute[1] = Hell
o, INVITO.FIXED_T5Q! attribute[2] = 1 attribute[3] = 2008-07-03 19:09:49.0
[main] 2008-07-03 19:09:50,363 DEBUG [ru.invito.AqTest] - [email protected](): name = INVITO.FIXED_T5
length = 4
ID = 36
LABEL = Hello, INVITO.FIXED_T5Q!
CODE = 1
TODAY = 2008-07-03 19:09:49.0
[main] 2008-07-03 19:09:50,363 DEBUG [ru.invito.AqTest] - s.toIdStr: 507ccce5b6e9f572e040007f01007203
[main] 2008-07-03 19:09:50,363 DEBUG [ru.invito.AqTest] - sd.toXMLString(): <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<StructDescriptor sqlName="INVITO.FIXED_T5" >
<OracleTypeADT sqlName="INVITO.FIXED_T5" typecode="0" tds_version="1"
is_embedded="false" is_top_level="true" is_upt="false" finalType="true" subtype="false">
<attributes>
<attribute name="ID" type="INTEGER" >
<OracleType typecode="2" />
</attribute>
<attribute name="LABEL" type="VARCHAR2" >
<OracleType typecode="12" />
</attribute>
<attribute name="CODE" type="INTEGER" >
<OracleType typecode="2" />
</attribute>
<attribute name="TODAY" type="DATE" >
<OracleType typecode="0" />
</attribute>
</attributes>
</OracleTypeADT>
</StructDescriptor>
[main] 2008-07-03 19:09:50,379 DEBUG [ru.invito.AqTest] - sending............
[main] 2008-07-03 19:09:50,395 DEBUG [ru.invito.AqTest] - Message ID from enqueue call: 511ff143bd4fa536e040007f01003192
[main] 2008-07-03 19:09:50,395 DEBUG [ru.invito.AqTest] - ----------- Enqueue done ------------But when dequeueing the 'label' attribute is lost:
DECLARE
dequeue_options DBMS_AQ.dequeue_options_t;
message_properties DBMS_AQ.message_properties_t;
message_handle RAW(16);
message fixed_t5;
BEGIN
dequeue_options.navigation := DBMS_AQ.FIRST_MESSAGE;
DBMS_AQ.DEQUEUE(
queue_name => 'fixed_t5q',
dequeue_options => dequeue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
DBMS_OUTPUT.PUT_LINE('ID : '||message.id);
DBMS_OUTPUT.PUT_LINE('Label: '||message.label);
DBMS_OUTPUT.PUT_LINE('Code : '||message.code);
DBMS_OUTPUT.PUT_LINE('Today: '||message.today);
COMMIT;
END;
ID : 36
Label:
Code : 1
Today: 03.07.08
Could anyone tell me what is wrong with the setup/code?
Why 'label' not saved in queue, though i saw it is not empty in STRUCT?Thank you for the reply!
I have enqueued:
[main] 2008-07-04 15:30:30,639 DEBUG [ru.invito.UserDefinedTypeAqTest$1] - [email protected](): name = INVITO.FIXED_T5
length = 4
ID = 41
LABEL = Hello, INVITO.FIXED_T5Q!
CODE = 1
TODAY = 2008-07-04 15:30:30.0and in table (select * from FIXED_T5QT) the 'label' is blank:
Q_NAME FIXED_T5Q
MSGID 51310809B5EA3728E040007F01000C79
CORRID b8f38fd3-4fa6-4e0f-85d1-2440d02d655e
PRIORITY 0
STATE 0
DELAY
EXPIRATION
TIME_MANAGER_INFO
LOCAL_ORDER_NO 0
CHAIN_NO 0
CSCN 0
DSCN 0
ENQ_TIME 04.07.2008 15:28:44
ENQ_UID INVITO
ENQ_TID 4012
DEQ_TIME
DEQ_UID
DEQ_TID
RETRY_COUNT 0
EXCEPTION_QSCHEMA AQ$_INVITO
EXCEPTION_QUEUE FIXED_T5QT_E
STEP_NO 0
RECIPIENT_KEY 0
DEQUEUE_MSGID
SENDER_NAME AQ_TEST
SENDER_ADDRESS 10.1.1.137
SENDER_PROTOCOL
USER_DATA.ID 41
USER_DATA.LABEL
USER_DATA.CODE 1
USER_DATA.TODAY 04.07.2008 15:30:30I must point to a strange thing: when the FixedType instance is created (via new operator) and then the setLabel("....") called as:
FixedType data = new FixedType();
// hack: proper initialization for 'label' field
data._struct.setNChar(1);
data.setId(ID);
data.setLabel(label);
data.setCode(1);
Date today = new Date();
data.setToday(new Timestamp(today.getTime()));
Datum d = data.toDatum(connection);
STRUCT s = (STRUCT) d;
logger.debug(s + ".debugString(): " + s.debugString());
logger.debug(s + ".dump(): " + s.dump());and if i comment line (data._struct.setNChar(1);) the debug messages for created STRUCT also shows empty value for label.
But if i explicitly call data._struct.setNChar(1) then debug contains the label i defined in call to the setLabel method. -
Selecting Columns with User Defined Types... in PHP
I've looked all over google and this forum and can't find anything about this... here's what I've got:
a User Defined Type:
CREATE TYPE "ADDRESS" AS OBJECT (
ADDRESS VARCHAR2(256),
COUNTRY VARCHAR2(256),
STATE VARCHAR2(256),
SUBURB VARCHAR2(256),
TOWNCITY VARCHAR2(256)
and it is used in a column in one of my tables:
CREATE TABLE "SUPPLIERS" (
"ID" NUMBER,
"USER_ID" NUMBER,
"NAME" VARCHAR2(50),
"ADDRESS" "ADDRESS"
so that column "address" is of type "address". I am then able to insert a row using:
INSERT INTO "SUPPLIERS" VALUES(1,1,'name',ADDRESS('address','country','state','suburb','town city'));
and that all works as expected. I can select the data using iSqlPlus and get the result I expect;
ADDRESS('address', 'country', 'state', 'suburb', 'town city')
So here's the problem. I cannot reterieve the data as expected, using PHP. If I make a select statement on the table that excludes the ADDRESS column I get the results as expected. If the ADDRESS column is included I get an error when fetching the row:
ORA-00932: inconsistent datatypes: expected CHAR got ADT
I'm assuming this is because the the cell cannot be cast to a string. How can I select the row so that the ADDRESS column is returned as an object? Can I even? If I can't, I don't see the use of Object Data Types... :(
I have found that I can select a field of the type using:
SELECT t.ADDRESS.TOWNCITY FROM SUPPLIERS t;
But this is not ideal, because the whole idea was that I could (potentially) change the format for, in my example, an address, and not need to alter my SQL statements.
Any ideas??PHP OCI8 can currently only bind simple types. Here are two possible
solutions.
-- cj
create or replace type mytype as object (myid number, mydata varchar2(20));
show errors
create or replace type mytabletype as table of mytype;
show errors
create or replace procedure mycreatedata1(outdata out mytabletype) as
begin
outdata := mytabletype();
for i in 1..10 loop
outdata.extend;
outdata(i) := mytype(i, 'some name'||i);
end loop;
end;
show errors
-- Turn the data into a ref cursor (but PHP OCI8 doesn't use prefetching for ref cursors)
create or replace procedure mywrapper1(rcemp out sys_refcursor) as
data mytabletype;
begin
mycreatedata1(data);
open rcemp for select * from table(cast(data as mytabletype));
end mywrapper1;
show errors
-- Turn the data into two collections
-- This might be faster than returning a ref cursor because you can
-- use oci_bind_array_by_name() on each parameter.
create or replace procedure mywrapper2(pempno out dbms_sql.NUMBER_table, pename out dbms_sql.VARCHAR2_table) as
data mytabletype;
begin
mycreatedata1(data);
select myid, mydata
bulk collect into pempno, pename
from table(cast(data as mytabletype));
end mywrapper2;
show errorsThen in PHP you could do:
// Use a Ref Cursor
$s = oci_parse($c, "begin mywrapper1(:myid); end;");
$rc = oci_new_cursor($c);
oci_bind_by_name($s, ':myid', $rc, -1, OCI_B_CURSOR);
oci_execute($s);
oci_execute($rc);
oci_fetch_all($rc, $res);
var_dump($res);
// Use Collections
$s = oci_parse($c, "begin mywrapper2(:myid, :mydata); end;");
oci_bind_array_by_name($s, ":myid", $myid, 10, -1, SQLT_INT);
oci_bind_array_by_name($s, ":mydata", $mydata, 10, 20, SQLT_CHR);
oci_execute($s);
var_dump($myid);
var_dump($mydata); -
User Defined Types menuitem not appears in Server Explorer at Remote Server
Hi,
I'm working on oracle 10g,odp.net with 2.0. i created two types which are input and output parameters for a function. I installed odp.net (ORACLE DATA PROVIDER FOR .NET 11.1.0.6.20) and generated UDT custom class code. It's working in my system. But when i installed odp.net (ORACLE DATA PROVIDER FOR .NET 11.1.0.6.20) in my remote server, its not showing the UDT Custom Class Code Generation Wizard to create UDT Custom Class Code. I have installed oracle Client 10g,.Net Framework 2.0 and ODP.Net(11.1.0.6.20) in the server.
In my Local system server explorer it's showing
Tables
Views
Procedures
Functions
Packages
Synonyms
Sequences
XML Databases
Java Classes
User-Defined Types
In server explorer it's showing only
Tables
Views
Synonyms
Sequences
Procedures
Functions
Packages
Package Bodies
Why its not showing User-Defined Types.
Pls Help.
Ideas are highly appreciated.
AnilAs you noticed, not all database objects are available in Server Explorer, and because of this they can't have scripts generated for them, nor can they be compared with Schema Compare.
In a pinch, you should be able to use SQL Developer to do this. -
We have recently updated our libraries to the latest version (2.102.2.20) - and have lost access to the critical objects and methods that were accessing our User Defined Types on Oracle.
In particular, this code:
OracleUdtDescriptor descriptor = OracleUdtDescriptor.GetOracleUdtDescriptor((OracleConnection)conn, "MY_USER.MYTYPE");
OracleArray items = new OracleArray(descriptor);
foreach (string s in testArrayItems)
items.Append(s);
IDbDataParameter itemsParam = cmd.OracleParameters.Add("items", OracleDbType.VArray, items, ParameterDirection.Input);
simply doesn't work anymore. The 'OracleUdtDescriptor' and 'OracleArray' references no longer exist. This has brought all development on a critical application to a halt. (Doesn't it always.)
How can I get the same functionality using the new version (2.102.2.20) of the Oracle.DataAccess library?Hi,
Here's what I was referring to... say you wanted to execute the same procedure from PLSQL via an anonymous block. Execute the same anonymous block via ODP.NET.
Here's a simple dumb example that passes an object type to a stored procedure, hope it helps. Hokey example, but hopefully points out what I was trying to say.
Greg
SQL
========
create or replace type person_typ as object (name varchar2(50), age number(4))
create table person_tab(col1 number, col2 person_typ);
create or replace procedure insert_person_proc(v1 in number, v2 in person_typ) as
begin
insert into person_tab values(v1,v2);
end;
You could execute that via PLSQL as follows
=================================
declare
myperson person_typ;
begin
myperson := person_typ('melody',5);
insert_person_proc(1,myperson);
end;
/And do the same thing via ODP.NET
=============================
using System;
using System.Data;
using Oracle.DataAccess.Client;
class Program
static void Main(string[] args)
using (OracleConnection con = new OracleConnection("data source=orcl;user id=scott;password=tiger"))
con.Open();
using (OracleCommand cmd = new OracleCommand("",con))
string strsql = "declare " +
"myperson person_typ; " +
"begin " +
"myperson := person_typ(:1,:2); " +
"insert_person(:3,myperson); " +
"end; ";
cmd.CommandText = strsql;
cmd.Parameters.Add(new OracleParameter("", "Melody"));
cmd.Parameters.Add(new OracleParameter("", 5));
cmd.Parameters.Add(new OracleParameter("", 1));
cmd.ExecuteNonQuery();
}
Maybe you are looking for
-
Type on a path doesn't show up in PDF when exported/printed
I have a file with leader lines that I typed text onto the paths. It looks fine onscreen in InDesign, but when printed or exported to PDF, the lines show up and the text does not. Any ideas? Windows XP SP3 InDesign CS4 6.0.3
-
Hi I have invoked jvm using C++. I called the main method of my application and it is running fine. When I try to invoke another method of the same class that is not static by GetMethodID(..) and then CallVoidMethod(..), the ID is coming out fine but
-
Restricting the partner address change in both VA01 & VA02
Hi All, In Sales Order Creation / Change i need to make the partner address fields editable but want a restriction on save. For that i am doing the following: Change: This is possible by restricting the update comparing YVBPA & XVBPA table using para
-
Using the Audit Provider to log ejb security events
I would like use the audit provider to log security events for ejbs that use container managed security. Specifically I want to record the name of the ejb being accessed, the method the user is accessing, the time of the event and the user name of th
-
I can't install "Contact Sheet II" from the optional plug-ins
I went to this page to download, install and most importantly of all use the "contact sheet" feature (a feature that was - for some mysterious reason - "removed as an update" on CS5!) http://www.adobe.com/support/downloads/detail.jsp?ftpID=4965 When