SQL Server 2008에서 테이블을 유형으로 만들었습니다.
SQL Server 2008은 테이블 값 매개 변수를 IN 매개 변수로 저장 프로 시저에 전달할 수 있도록 지원합니다. 잘 작동하고 있습니다.
이제 Oracle에서 동일한 접근 방식을 수행해야합니다.
나는PLSQLAssociativeArray
를 통해 그것을했다
그러나 연관 배열의 한계는 동 질적입니다 (모든 요소는 동일한 유형이어야합니다).
SQL Server 2008의 테이블 반환 매개 변수의 경우 가능합니다.
Oracle에서 동일하게 달성하는 방법?
다음은 SQL Server 2008의 유형 및 저장 프로 시저입니다.
CREATE TYPE [dbo].[EmployeeType] AS TABLE(
[EmployeeID] [int] NULL,
[EmployeeName] [nvarchar](50) NULL
)
GO
CREATE PROCEDURE [dbo].[TestCustom] @location EmployeeType READONLY
AS
insert into Employee (EMP_ID,EMP_NAME)
SELECT EmployeeID,EmployeeName
FROM @location;
GO
NHibernate에서 전화
var dt = new DataTable();
dt.Columns.Add("EmployeeID", typeof(int));
dt.Columns.Add("EmployeeName", typeof(string));
dt.Rows.Add(new object[] { 255066, "Nachi11" });
dt.Rows.Add(new object[] { 255067, "Nachi12" });
ISQLQuery final = eventhistorysession.CreateSQLQuery("Call TestCustom @pLocation = :id");
IQuery result = final.SetStructured("id", dt);
IList finalResult = result.List();
- 답변 # 1
- 답변 # 2
nHibernate 또는 ODP.NET을 사용하여 Oracle 객체 테이블 매개 변수 (예 : @Quassnoi의 답변 참조)를 사용할 수 없음을 이해합니다. ODP.NET에서 지원하는 유일한 컬렉션 유형은
그러나 연관 배열을 사용하는 SQL Server TVP와 동일한 결과를 쉽게 얻을 수 있습니다. 비결은 전체 테이블에 단일 매개 변수 대신 각 매개 변수에 대한 배열을 정의하는 것입니다.PLSQLAssociativeArray
입니다. .찾을 수 없었던 완벽한 개념 증명 솔루션을 게시하고 있습니다.
오라클 스키마스키마에는 테이블 및 패키지 삽입 절차가 포함됩니다. 각 매개 변수를 열로 취급하고 각 배열이 최소한 첫 번째 배열만큼 길다고 가정합니다.
n 최대 절전 모드 매핑create table test_table ( foo number(9), bar nvarchar2(64) ); / create or replace package test_package as type number_array is table of number(9) index by pls_integer; type nvarchar2_array is table of nvarchar2(64) index by pls_integer; procedure test_proc(p_foo number_array, p_bar nvarchar2_array); end test_package; / create or replace package body test_package as procedure test_proc(p_foo number_array, p_bar nvarchar2_array) as begin forall i in p_foo.first .. p_foo.last insert into test_table values (p_foo(i), p_bar(i)); end; end test_package; /
n 최대 절전 모드 사용자 정의 IType<sql-query name="test_proc"> begin test_package.test_proc(:foo, :bar); end; </sql-query>
저는 훌륭한 SQL Server 관련 답변에서 개념을 빌려 ODP.NET에서 작동하도록 클래스를 약간 수정했습니다.
IType
로 엄청 나서 구현 된 메소드 만 보여줍니다. 나머지는NotImplementedException
를 던졌습니다. .이 코드를 프로덕션 코드에서 사용하려면 즉시 필요한 작업을 수행하더라도이 클래스를 광범위하게 테스트하지 않았다는 점에 유의하십시오.
생성자 매개 변수는 기본 배열 유형의 유형을 지정합니다 (즉, 문자열 배열을 전달하는 경우public class OracleArrayType<T> : IType { private readonly OracleDbType _dbType; public OracleArrayType(OracleDbType dbType) { _dbType = dbType; } public SqlType[] SqlTypes(IMapping mapping) { return new []{ new SqlType(DbType.Object) }; } public bool IsCollectionType { get { return true; } } public int GetColumnSpan(IMapping mapping) { return 1; } public void NullSafeSet(IDbCommand st, object value, int index, ISessionImplementor session) { var s = st as OracleCommand; var v = value as T[]; if (s != null && v != null) { s.Parameters[index].CollectionType = OracleCollectionType.PLSQLAssociativeArray; s.Parameters[index].OracleDbType = _dbType; s.Parameters[index].Value = value; s.Parameters[index].Size = v.Length; } else { throw new NotImplementedException(); } } // IType boiler-plate implementation follows.
OracleDbType.NVarchar2
를 전달하십시오) . 값 유형에서 DB 유형을 추론하는 방법이있을 수 있지만 아직 방법을 잘 모르겠습니다. IQuery 확장 방법이것은 타입 생성을 마무리합니다 :
사용법public static class OracleExtensions { public static IQuery SetArray<T>(this IQuery query, string name, OracleDbType dbType, T[] value) { return query.SetParameter(name, value, new OracleArrayType<T>(dbType)); } }
이 모든 것을 하나로 묶기 위해 다음과 같이 수업이 사용됩니다 :
using (var sessionFactory = new Configuration().Configure().BuildSessionFactory()) using (var session = sessionFactory.OpenSession()) { session .GetNamedQuery("test_proc") .SetArray("foo", OracleDbType.Int32, new[] { 11, 21 }) .SetArray("bar", OracleDbType.NVarchar2, new [] { "bar0", "bar1" }) .ExecuteUpdate(); }
select * from test_table
의 결과 코드를 실행 한 후 :FOO BAR ---------------- 11 bar0 21 bar1
관련 자료
- .net - SQL Server에서 호출 저장 프로 시저를 확인하는 방법
- 최대 절전 모드 엔티티 관리자를 사용하여 스프링 부트에서 출력 매개 변수로 MySQL 저장 프로 시저를 호출하는 방법
- MS SQL Server에서 저장 프로 시저에 대한 참조 쿼리
- 날짜 매개 변수를 전달하는 SQL Server 저장 프로 시저
- sql - 매개 변수 저장 프로 시저가있는 조건부 쿼리
- SQL Server 2008 R2 Express에서 테이블 반환 매개 변수 READONLY 오류
- amazon redshift - 저장 프로 시저에서 null 인 경우 동적 매개 변수 처리
- Azure 서버에서 저장 프로 시저 실행
- oracle - OUT 매개 변수로 저장 프로 시저를 호출하는 방법은 무엇입니까?
- sql server express - 동적 저장 프로 시저 및 페이지 매김
- mariadb - 저장 프로 시저에 오류가 발생하면 매개 변수를 설정하는 방법은 무엇입니까?
- c# - ASPNET의 MySQL 저장 프로 시저에서 출력 매개 변수를 호출하는 방법
- SQL Server 저장 프로시 저는 연결된 서버에서 테이블에 삽입하고 최대 ID로 다른 테이블을 업데이트합니다
- c# - 매개 변수가있는 Dapper Postgres 저장 프로 시저
- sql - 비어 있지 않은 문자열에 대한 스토어드 프로 시저 매개 변수 검사
- sql - 저장 프로 시저에서 뷰의 사용 된 열을 식별하는 방법
- plsql - 다른 쿼리로 참조 커서를 열기 위해 저장 프로 시저를 호출하는 방법
- java - 커밋하지 않고 두 번째 저장 프로 시저에서 첫 번째 실행 저장 프로 시저에 삽입 된 데이터를 읽습니까?
- Oracle SQL Developer에서 Amazon Redshift JDBC 저장 프로 시저 지원
- plsql - Oracle의 저장 프로 시저에 그룹 트랜잭션을 커밋하는 방법
- sql : 정수 열에 "좋아요"를 지정하는 방법은 무엇입니까?
- SQL Server 저장 프로 시저는 'ntext /nchar /nvarchar'유형의 '@params'매개 변수를 기대합니다.
- MS SQL Server 저장 프로 시저에서 배열을 선언하는 방법은 무엇입니까?
- SQL Server에서의 오프셋을 대체합니다
- c# : 엔티티에서만 삭제할 수있는 저장 프로 시저 사용
- 기본 SQL에 대해 null을 가져옵니다
- T-SQL에서는 저장 프로 시저에서 PRINT 문으로 오류가 발생합니다.
- ALTER 프로 시저를 실행할 때 절차 변경 사항이 저장되지 않습니다.
- SQL Server 2008의 XML 및 저장 프로 시저를 사용하여 테이블에 데이터 삽입
- asp.net : 관리 프로 시저는 웹에서 호출 될 때 느리게만큼 관리 스튜디오에서 빠른