반응형
C# 및 ODP.NET에서 패키지의 함수를 호출하기 위한 코드
저는 ODP로 C# 코드를 작성하려고 했습니다.패키지의 함수를 호출하는 NET.아래 두 가지 오류가 있습니다.
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to INSERT_FUNC'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
ORA-06550: line 1, column 7:
PLS-00221: 'INSERT_FUNC' is not a procedure or is undefined
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
나의OracleCommand
는 다음과 같이 설정됩니다.
cmd.CommandText = "PKG_NAME.INSERT_FUNC";
cmd.CommandType = CommandType.StoredProcedure;
- 아래 함수에 매개 변수를 전달하는 방법은 무엇입니까?
- 추가해야 합니까?
ReturnValue
매개 변수?추가할 필요성에 대해 논의하는 많은 포럼을 보았습니다.ReturnValue
첫 번째 매개 변수OracleParameter
에서OracleCommand
물건.
어떤 제안이라도 해주시면 감사하겠습니다.
CREATE OR REPLACE
PACKAGE BODY pkg_name IS
FUNCTION insert_func (
i_description IN tableName.description%TYPE,
i_theme IN tableName.theme%TYPE,
o_id OUT tableName.id%TYPE,
o_error_msg OUT VARCHAR2 )
RETURN NUMBER
IS
l_program VARCHAR2(100) := 'PKG_NAME.INSERT_FUNC';
BEGIN
INSERT INTO tablea ( event_id, id, description, theme, lock_version )
VALUES ( rms12.tablea_seq.NEXTVAL, rms12.tablea_id_seq.NEXTVAL, i_description, i_theme, NULL );
INSERT INTO tableb ( id, description, theme )
VALUES ( rms12.id_seq.CURRVAL, i_description, i_theme );
SELECT rms12.id_seq.CURRVAL
INTO o_id
FROM dual;
RETURN 1;
EXCEPTION
WHEN OTHERS THEN
o_error_msg := sql_lib.create_msg(
'PACKAGE_ERROR', SQLERRM, l_program, TO_CHAR( SQLCODE ) );
RETURN 0;
END insert_func;
END pkg_name;
이것은 이 포럼에 대한 저의 첫 번째 질문이며 저는 제 답변에 기꺼이 글을 올립니다.
우리는 ODP를 사용하여 오라클 패키지 함수를 호출할 수 있습니다.설정별 NETCommandType.StoredProcedure
.
ORA-06550: line 1, column 7:
PLS-00221: 'INSERT_FUNC' is not a procedure or is undefined
ORA-06550: line 1, column 7: PL/SQL: Statement ignored
이 오류가 발생하면 이 행을 명령 개체의 첫 번째 매개 변수로 추가하십시오.
cmd.Parameters.Add("Return_Value", OracleDbType.Int16,
ParameterDirection.ReturnValue);
작동 코드는 다음과 같습니다.
using (var conn = new OracleConnection(oradb))
using (var cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "PKG_NAME.INSERT_FUNC";
cmd.BindByName = true;
cmd.Parameters.Add("Return_Value", OracleDbType.Int16,
ParameterDirection.ReturnValue);
cmd.Parameters.Add("i_description", OracleDbType.Varchar2, 1000,
promotionEventSetupDetails.PromotionDescription,
ParameterDirection.Input);
cmd.Parameters.Add("i_theme", OracleDbType.Varchar2, 80,
promotionEventSetupDetails.PromotionTheme,
ParameterDirection.Input);
cmd.Parameters.Add("o_id", OracleDbType.Varchar2,
ParameterDirection.Output);
cmd.Parameters.Add("o_error_msg", OracleDbType.Varchar2,
ParameterDirection.Output);
conn.Open();
using (var dr = cmd.ExecuteReader())
{
// do some work here
}
}
최신 Oracle 버전에서는 이 버전이 새 버전이어야 합니다.이전에는 C# 코드의 모든 입력 매개 변수 뒤에 나열된 반환 값 매개 변수로 이 작업을 수행할 수 있었지만, 12c에서 이 작업을 실행한 후 정확한 문제가 발생했습니다. 이제 반환 값 매개 변수를 먼저 지정하는 제안과 함께 작동합니다.
기능 결과를 얻을 수 있는 일반적인 방법을 만들었습니다.
var result = await
dbManager.ExecuteFunctionResultAsync<Oracle.ManagedDataAccess.Types.OracleDecimal>(
functionName, parameters.List);
public async Task<T> ExecuteFunctionResultAsync<T>(string spName, IEnumerable<OracleParameter> paramaters)
{
using (OracleConnection connection = new OracleConnection(this.connectionString))
{
connection.Open();
using (OracleCommand comm = new OracleCommand(spName, connection))
{
comm.CommandType = CommandType.StoredProcedure;
comm.BindByName = true;
string returnParam = "return_value";
comm.Parameters.Add(new OracleParameter() {
ParameterName = returnParam,
Direction = ParameterDirection.ReturnValue,
OracleDbType = OracleDbType.Int16,
});
this.SetCommandParameters(comm, paramaters);
await comm.ExecuteNonQueryAsync();
var result = (T)comm.Parameters[returnParam].Value;
return result;
}
}
}
private void SetCommandParameters(OracleCommand command, IEnumerable<OracleParameter> paramaters)
{
if (paramaters != null)
{
foreach (OracleParameter p in paramaters)
{
command.Parameters.Add(p);
}
}
}
언급URL : https://stackoverflow.com/questions/18788509/code-for-calling-a-function-in-a-package-from-c-sharp-and-odp-net
반응형
'programing' 카테고리의 다른 글
소켓 - 할당된 포트 및 주소를 확인하는 방법 (0) | 2023.07.27 |
---|---|
SSL 오류("SSL 모듈을 사용할 수 없기 때문에 HTTPS URL에 연결할 수 없습니다.")로 인해 발생합니다. (0) | 2023.07.27 |
목표 C HTML 이스케이프/에스케이프 해제 (0) | 2023.07.27 |
PL/SQL 컴파일러의 버그입니까? (0) | 2023.07.27 |
MariaDB Connector v1.0.5 및/또는 Mysql Connection v 5.3.4 컴파일 (0) | 2023.07.27 |