Quantcast
Channel: SQL Server Migration Assistant (SSMA) Team's Blog
Viewing all articles
Browse latest Browse all 38

Migrating Oracle to SQL Server using SSMA - Error O2SS0339 Cannot Convert Standalone User-Defined Types

$
0
0

By Bill Ramos and Ankit Matta, Advaiya Inc.

This blog post covers the reasons why SQL Server Migration Assistant (SSMA) for Oracle Cannot Convert Standalone User-Defined Types.

 

A User Defined Type (UDT) is an entitled data type that is made in the database by the user. A UDT can be a distinct type which segments a common representation with a built-in data type.

Error O2SS0339 Cannot Convert Standalone User-Defined Types

Background

Whenever you create a User Defined data type and make a reference of that data type in a packaged query to declare a variable, SSMA does not recognize this data type and hence does not convert it to corresponding SQL Server code. This is because the user defined data type is not defined in the scope of the code where the variable is being declared and hence generates error “Error O2SS0339 Cannot Convert Usage of Standalone User-Defined Types”

Possible Remedies

Consider the below example, where we have created two different UDTs and then created a package specification followed by a package body. These UDTs are used to declare variables in the package code.

CREATEORREPLACETYPE TO_TEXT ASOBJECT(Text_Id NUMBER, Line NUMBER, Text VARCHAR2(2000))

 

CREATEORREPLACETYPE TT_TEXT ASTABLEOF To_Text

 

CREATEORREPLACEPACKAGE PKG_UDTVAR_TEST IS

  g_Text  Tt_Text;

END PKG_UDTVAR_TEST;

 

CREATEORREPLACEPACKAGEBODY PKG_UDTVAR_TEST IS

BEGIN

  g_Text:=Tt_Text();

END PKG_UDTVAR_TEST;

 

 

clip_image001

The solution of the above error is to rewrite the code in Oracle. Just create the user defined data types inside the package specification keeping the remaining code as is.

When you define the UDTs inside the package specification, the UDTs comes in the scope of the Package and hence the error is resolved.

CREATEORREPLACEPACKAGE PKG_UDTVAR_TEST IS

TYPE TO_TEXT IS RECORD (Text_Id NUMBER, Line NUMBER, Text VARCHAR2(2000));

TYPE TT_TEXT ISTABLEOF TO_TEXT;

      g_Text  Tt_Text;

END PKG_UDTVAR_TEST;

/

 

CREATEORREPLACEPACKAGEBODY PKG_UDTVAR_TEST IS

BEGIN

  g_Text:=Tt_Text();

END PKG_UDTVAR_TEST;

/

Corresponding SQL Server code generated by SSMA

CREATEPROCEDURE dbo.PKG_UDTVAR_TEST$SSMA_Initialize_Package

AS

   DECLARE

     @CollectionIndexInt$TYPE varchar(max) = ' TABLE OF ( RECORD ( TEXT_ID DOUBLE , LINE DOUBLE , TEXT STRING ) )'

   EXECUTE sysdb.ssma_oracle.db_clean_storage

   DECLARE

      @g_Text dbo.CollectionIndexInt

   EXECUTE sysdb.ssma_oracle.set_pv_collection_int

      'PROSEWARE',

      'DBO',

      'PKG_UDTVAR_TEST',

      'G_TEXT',

      @g_Text

   DECLARE

      @temp dbo.CollectionIndexInt

      SET @temp = dbo.CollectionIndexInt ::[Null].SetType(@CollectionIndexInt$TYPE)

      EXECUTE sysdb.ssma_oracle.set_pv_collection_int

      'PROSEWARE',

      'DBO',

      'PKG_UDTVAR_TEST',

      'G_TEXT',

      @temp

GO

Related Errors

There are several other errors related to “User defined Types” that you may encounter. These include the following:

·         Emulating Records and Collections using CLR UDTs

References

For more information, check out the following references:

Migrating Oracle to SQL Server 2008 White Paper

SSMA Blog: Converting Oracle UDT to SQL Server TVP


Viewing all articles
Browse latest Browse all 38

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>