Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Convert byte array to table of int

744464Aug 18 2011 — edited Aug 21 2011
[http://www.codeproject.com/KB/database/PassingArraysIntoSPs.aspx?display=Print|http://www.codeproject.com/KB/database/PassingArraysIntoSPs.aspx?display=Print] Hello friends.
I'm pretty new with PL/SQL.
I have code that run well on MSSQL and I want to convert it to PL/SQL with no luck.

The code converts byte array to table of int.
The byte array is actually array of int that was converted to bytes in C# for sending it as parameter.

The TSQL code is:
--------------------------------------------------------------------------------------
CREATE FUNCTION dbo.GetTableVarchar(@Data image)

RETURNS @DataTable TABLE (RowID int primary key IDENTITY ,
Value Varchar(8000))
AS
BEGIN
--First Test the data is of type Varchar.

IF(dbo.ValidateExpectedType(103, @Data)<>1) RETURN

--Loop thru the list inserting each

-- item into the variable table.

DECLARE @Ptr int, @Length int,
@VarcharLength smallint, @Value Varchar(8000)
SELECT @Length = DataLength(@Data), @Ptr = 2
WHILE(@Ptr<@Length)
BEGIN
--The first 2 bytes of each item is the length of the

--varchar, a negative number designates a null value.

SET @VarcharLength = SUBSTRING(@Data, @ptr, 2)
SET @Ptr = @Ptr + 2
IF(@VarcharLength<0)
SET @Value = NULL
ELSE
BEGIN
SET @Value = SUBSTRING(@Data, @ptr, @VarcharLength)
SET @Ptr = @Ptr + @VarcharLength
END
INSERT INTO @DataTable (Value) VALUES(@Value)
END
RETURN
END
--------------------------------------------------------------------------------------
It's taken from http://www.codeproject.com/KB/database/PassingArraysIntoSPs.aspx?display=Print.


The C# code is:
--------------------------------------------------------------------------------------
public byte[] Convert2Bytes(int[] list)
{
if (list == null || list.Length == 0)
return new byte[0];
byte[] data = new byte[list.Length * 4];
int k = 0;
for (int i = 0; i < list.Length; i++)
{
byte[] intBytes = BitConverter.GetBytes(list);
for (int j = intBytes.Length - 1; j >= 0; j--)
data[k++] = intBytes[j];
}
return data;
}
--------------------------------------------------------------------------------------

I tryied to convert the TSQL code to PL/SQL and thats what I've got:

--------------------------------------------------------------------------------------
FUNCTION GetTableInt(p_Data blob)
RETURN t_array --t_array is table of int
AS
l_Ptr number;
l_Length number;
l_ID number;
l_data t_array;
BEGIN
l_Length := dbms_lob.getlength(p_Data);
l_Ptr := 1;
WHILE(l_Ptr<=l_Length)
loop
l_ID := to_number( DBMS_LOB.SUBSTR (p_Data, 4, l_ptr));
IF(l_ID<-2147483646)THEN
IF(l_ID=-2147483648)THEN
l_ID := NULL;
ELSE
l_Ptr := l_Ptr + 4;
l_ID := to_number( DBMS_LOB.SUBSTR(p_Data, 4,l_ptr));
END IF;
END IF;
l_data(l_data.count) := l_ID;

l_Ptr := l_Ptr + 4;
END loop;
RETURN l_data;
END GetTableInt;
--------------------------------------------------------------------------------------

This isn't work.
This is the error:

Error report:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
06502. 00000 - "PL/SQL: numeric or value error%s"

I think the problem is in this line:
l_ID := to_number( DBMS_LOB.SUBSTR (p_Data, 4, l_ptr));
but I don't know how to fix that.

Thanks,
MTs.
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Sep 18 2011
Added on Aug 18 2011
2 comments
948 views