Oracle type record e table

Tenho um tipo TABLE na entrada e na saída da procedure. Dentro da table tem records:

TYPE Item_Rec_Type IS RECORD(
Transaction_Type VARCHAR2(30)
,Return_Status VARCHAR2(1) := G_MISS_CHAR
,Language_Code VARCHAR2(4) := G_MISS_CHAR);

TYPE Item_Tbl_Type IS TABLE OF Item_Rec_Type INDEX BY BINARY_INTEGER;

// Parâmetros da procedure
PROCEDURE Process_Items(
p_api_version IN NUMBER
,p_Item_Tbl IN EGO_Item_PUB.Item_Tbl_Type
,x_Item_Tbl OUT NOCOPY EGO_Item_PUB.Item_Tbl_Type
,x_return_status OUT NOCOPY VARCHAR2
,x_msg_count OUT NOCOPY NUMBER);

No java estou tentando dessa maneira:

[code]System.out.println(">>>>>>>>>> Conexão feita >>>>>…");
CallableStatement cstmt = con
.prepareCall("{call APPS.EGO_ITEM_PUB.PROCESS_ITEMS(?, ?, ?, ?, ?, ?, ?, ?)}");

		// Mapeamento de tipos do oracle
		StructDescriptor structDescItemTableEntrada = StructDescriptor.createDescriptor("APPS.EGO_ITEM_PUB.ITEM_TBL_TYPE", con);
		System.out.println("Passou por um descriptor");
		StructDescriptor structDescItemTableSaida = StructDescriptor.createDescriptor("APPS.EGO_ITEM_PUB.ITEM_TBL_TYPE", con);
		StructDescriptor structDescRoleGrantEntrada = StructDescriptor.createDescriptor("APPS.EGO_ITEM_PUB.ROLE_GRANT_TBL_TYPE", con);
		Object[] atributosItemTabelaEntrada = new Object[368];
		Object[] atributosItemTabelaSaida = new Object[368];
		String[] passagemParametro = new String[1];
		passagemParametro[0] = "CREATE";
		atributosItemTabelaEntrada[0] = passagemParametro[0];
		STRUCT itemTabelaTypeEntrada = new STRUCT(structDescItemTableEntrada, con, atributosItemTabelaEntrada);
		STRUCT itemTabelaTypeSaida = new STRUCT(structDescItemTableSaida, con, atributosItemTabelaEntrada);
		
		System.out.println("Entrará para setar query!!!");
		
		// Setar dados procedure
		cstmt.setString(1, boEntrada.getString("p_api_version"));
		cstmt.setString(2, boEntrada.getString("p_init_msg_list"));
		cstmt.setString(3, boEntrada.getString("p_commit"));
		cstmt.setObject(4, atributosItemTabelaEntrada);
		cstmt.registerOutParameter(5, oracle.jdbc.driver.OracleTypes.STRUCT, "APPS.EGO_ITEM_PUB.ITEM_TBL_TYPE");
		cstmt.setObject(6, null);
		cstmt.registerOutParameter(7, oracle.jdbc.driver.OracleTypes.VARCHAR);
		cstmt.registerOutParameter(8, oracle.jdbc.driver.OracleTypes.VARCHAR);
		
		cstmt.execute();
		
		System.out.println("Passou execute");
		String count = (String) cstmt.getObject(9);
		if (count != null) {
			System.out.println("Veio resultado: " + count);				
			if (Integer.parseInt(count)>0){
				return "falha";
			}
		}
		// Fechar conexão
		con.close();[/code]

Essa é a maneira de inserir dados em um RECORD dentro de um TABLE?

E como devo tratar a saída?

Ainda não cheguei na parte da query, está ocorrendo o erro:

java.sql.SQLException: invalid name pattern: APPS.EGO_ITEM_PUB.ITEM_TBL_TYPE

Mas esse tipo está dentro desse pacote que está dentro desse schema.

Desde já grato pela ajuda. :smiley:

Se alguém como tratar um tipo table na entrada já ficarei muito agradecido.

Passar dados do tipo table do java para procedure oracle é um parto.
Se você não puder alterar a procedure para que receba dados somente do tipos varchar2, number, etc… você não poderá usar PreparedStatement para setar esses dados.
Você terá montar uma String como se fosse um sql para rodar no SQL*Plus e mandar executar via jdbc.

Entendi, obrigado.

Mas ainda tenho uma dúvida. Depois de montar uma string para executar algo assim:

[code]DECLARE
P_API_VERSION NUMBER;
P_INIT_MSG_LIST VARCHAR2(200);
P_COMMIT VARCHAR2(200);
P_ITEM_TBL APPS.EGO_ITEM_PUB.ITEM_TBL_TYPE;
X_ITEM_TBL APPS.EGO_ITEM_PUB.ITEM_TBL_TYPE;
P_ROLE_GRANT_TBL APPS.EGO_ITEM_PUB.ROLE_GRANT_TBL_TYPE;
X_RETURN_STATUS VARCHAR2(200);
X_MSG_COUNT NUMBER;
BEGIN
P_API_VERSION := ‘1’;
P_INIT_MSG_LIST := ‘T’;
P_COMMIT := ‘T’;
– Modify the code to initialize the variable
– P_ITEM_TBL := NULL;
P_ITEM_TBL(1).Transaction_Type := ‘CREATE’;
P_ITEM_TBL(1).Language_Code := ‘PTB’;
P_ITEM_TBL(1).Template_Name := ‘@item_base’;
P_ITEM_TBL(1).Organization_Code := ‘SCH’;
P_ITEM_TBL(1).Item_Number := ‘100’;
P_ITEM_TBL(1).FULL_LEAD_TIME := 0;
P_ITEM_TBL(1).Global_Attribute_Category := ‘JL.BR.INVIDITM.XX.Fiscal’;
P_ITEM_TBL(1).Global_Attribute2 := ‘USO E CONSUMO’;
P_ITEM_TBL(1).Global_Attribute3 := ‘0’;
P_ITEM_TBL(1).Global_Attribute4 := ‘B’;
P_ITEM_TBL(1).Global_Attribute5 := ‘00’;
P_ITEM_TBL(1).Global_Attribute6 := ‘0’;
P_ITEM_TBL(1).Global_Attribute8 := ‘INV’;
P_ITEM_TBL(1).Global_Attribute9 := ‘INV’;
P_ITEM_TBL(1).Created_By := NULL;
P_ITEM_TBL(1).Last_Update_Date := SYSDATE;
P_ITEM_TBL(1).Last_Updated_By := NULL;
P_ITEM_TBL(1).Description := ‘TUBO DE ACO 1.020 ESPECIAL 32MM - ESP 2MM’;
P_ITEM_TBL(1).Long_Description := ‘100’;
P_ITEM_TBL(1).Primary_Uom_Code := ‘KG’;
P_ITEM_TBL(1).SECONDARY_UOM_CODE := ‘KG’;
P_ITEM_TBL(1).INVENTORY_ITEM_STATUS_CODE := ‘INACTIVE’;
P_ITEM_TBL(1).Segment1 := ‘API TST SEGM’;
P_ITEM_TBL(1).Organization_Id := 83;

– Modify the code to initialize the variable
– P_ROLE_GRANT_TBL := NULL;

APPS.EGO_ITEM_PUB.PROCESS_ITEMS(
P_API_VERSION => P_API_VERSION,
P_INIT_MSG_LIST => P_INIT_MSG_LIST,
P_COMMIT => P_COMMIT,
P_ITEM_TBL => P_ITEM_TBL,
X_ITEM_TBL => X_ITEM_TBL,
P_ROLE_GRANT_TBL => P_ROLE_GRANT_TBL,
X_RETURN_STATUS => X_RETURN_STATUS,
X_MSG_COUNT => X_MSG_COUNT
);
– Modify the code to output the variable
– DBMS_OUTPUT.PUT_LINE('X_ITEM_TBL(1).Return_Status = ’ || X_ITEM_TBL(1).Return_Status);
DBMS_OUTPUT.PUT_LINE('X_RETURN_STATUS = ’ || X_RETURN_STATUS);
DBMS_OUTPUT.PUT_LINE('X_MSG_COUNT = ’ || X_MSG_COUNT);
END;[/code]

Como vou tratar o retorno disso? Na saída também vem um table, mas se souberem como obtenho um varchar, number depois de fazer um executeQuery disso já ajuda bastante.

furutani, obrigado pela idéia de executar tudo isso em jdbc.

Se a saida é um table, uma alternativa é criar uma procedure para transformar o table em um ref cursor usando funções pipelined.
Dá uma olhada aqui http://www.furutani.com.br/2008/05/oracle-pipelined-table-function/

Blz. Quanto ao table ok. Mas a procedure tem 3 parâmetros de saída. Além da table tem um varchar e um number.

Depois de executar a query, como pego esses valores de retorno da procedure? Essa é a última dúvida… :smiley:

com cstmt.getString() na procedure que transformar a table em ref cursor.