¿Cómo es mejor enviar datos usando Dapper en c # a las variables de scripts PL / SQL de tipo RECORD?

c# dapper plsql

Pregunta

Tengo un procedimiento PL / SQL que usa 3 variables de tipo RECORD como parámetros, que tengo que completar con mis datos (desde la aplicación c #) para ejecutar un procedimiento.

Primero, intenté construir la misma estructura con estos registros a través de c # y pasarla como parámetro a través de Dapper, pero no funciona, ya que dapper solo funciona con tipos de datos escalares.

Luego intenté pasar mis datos como matrices y a.NAME := ('aaaaaa','sdasd'); dentro del procedimiento, pero el tipo RECORD no puede aceptar conjuntos de datos como a.NAME := ('aaaaaa','sdasd'); funciona solo de esta manera:

a.NAME(1) := 'aaaaaa';
a.NAME(2) := 'sdasd';

Lo único que tengo en mente ahora es generar tales cadenas en el texto del procedimiento, pero siento que debería haber una mejor manera. ¿Qué estoy haciendo mal?

PD: no puedo cambiar el script que se debe ejecutar después de todo, así que no puedo cambiar el tipo de datos que acepta.

Actualización: para hacerlo más fácil, digamos, he decidido hacer un ejemplo:

Tenemos 2 tipos personalizados

TYPE A_REC IS RECORD (NAME dbms_sql.Varchar2_Table);
TYPE B_REC IS RECORD (NAME dbms_sql.Varchar2_Table
                         , ID dbms_sql.Number_Table);

y un procedimiento, que podría usarse algo así como

declare
a c_pck.a_rec;
b c_pck.b_rec;
begin

a.NAME(1) := 'aaaaa';
b.NAME(1) := 'sssss';
b.NAME(2) := 'ddddd';
b.ID(1) := 111;
b.ID(2) := 222;


c_pck.pr(a => a, b => b);
end;

¿Cómo puedo ejecutar este procedimiento a través de Dapper?

Respuesta popular

Necesitas manejar dos cosas separadas aquí.

  1. Instruya al controlador de Oracle sobre sus tipos de datos personalizados

Aquí, vas a necesitar una buena cantidad de repetitivo. IOracleCustomType escribir el código de asignación para sus UDT, utilizando la interfaz IOracleCustomType . Aquí está la documentación oficial. Esta guía parece un buen recurso.

  1. Instruye a Dapper sobre tus tipos de datos personalizados

Dapper tiene una lista codificada de tipos .NET mapeados a DbTypes. Puede agregar a esta lista, pero solo a los DbTypes genéricos. Para utilizar la funcionalidad específica de la base de datos, su parámetro debe implementar SqlMapper.ICustomQueryParameter (así es como funcionan las cosas con valores de tabla para el servidor SQL). En su implementación AddParameter , puede construir manualmente un OracleParameter y establecer el nombre tipo UDT correctamente. El valor de retorno debería ser manejado muy bien por Dapper, ya que esto es solo mapear un conjunto de resultados como



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué