我正在寻求帮助重写程序。我很确定我在这里的某处使用了错误的数据类型,所以请让我知道如何改进以下内容。
我正在尝试使用此表中的seq #s:
create table myschema.file_path_table
(
encrypt_file_path_seq_nbr NUMBER(15) not null,
file_path VARCHAR2(1000)
)
我在oracle中创建了这个包:
TYPE file_paths IS TABLE OF myschema.file_path_table.file_path%TYPE INDEX BY BINARY_INTEGER;
TYPE path_seq_nbrs IS TABLE OF myschema.file_path_table.encrypt_file_path_seq_nbr%TYPE INDEX BY BINARY_INTEGER;
PROCEDURE GETFILEPATHSEQNBRS(IN_FILE_PATHS IN FILE_PATHS,
OUT_FILE_PATH_SEQ OUT PATH_SEQ_NBRS)
IS
V_FILE_PATH myschema.file_path_table.FILE_PATH%TYPE;
V_FILE_PATH_SEQ myschema.file_path_table.ENCRYPT_FILE_PATH_SEQ_NBR%TYPE;
BEGIN
IF IN_FILE_PATHS.COUNT < 1 THEN
RAISE_APPLICATION_ERROR(-20999, 'in_file_paths.COUNT: ' || IN_FILE_PATHS.COUNT);
END IF;
FOR INDX IN 1 .. IN_FILE_PATHS.COUNT LOOP
GETFILEPATHSEQNBR(IN_FILE_PATHS(INDX), V_FILE_PATH_SEQ);
OUT_FILE_PATH_SEQ(INDX) := V_FILE_PATH_SEQ;
END LOOP;
END GETFILEPATHSEQNBRS;
内部GETFILEPATHSEQNBR()在file_path_table上执行查找以获取文件路径的序列,或者如果路径当前没有序列#,则在那里插入新行。所以我不能只是批量选择#的序列。我的变量IN_FILE_PATHS和OUT_FILE_PATH_SEQ是我正在尝试做的正确数据类型吗?我觉得我不在这里,有更简单的方法吗?
收集完所有序列号后,我需要将此列表返回给我的C#app。该代码如下所示:
private static void GetFilePathSeqNbrs(ref EncryptFilesTable table)
{
IEnumerable<string> pathQuery = (from row in table.rowArray
select row.path).Distinct();
try
{
using (OracleCommand cmd = new OracleCommand("myschema.PKG_ENCRYPT.GETFILEPATHSEQNBRS", EncryptUtils.connection))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.BindByName = true;
OracleParameter p_out_values = new OracleParameter();
p_out_values.ParameterName = "OUT_FILE_PATH_SEQ";
p_out_values.OracleDbType = OracleDbType.Int64;
p_out_values.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
p_out_values.Size = pathQuery.Count();
p_out_values.Value = pathQuery.ToArray();
p_out_values.Direction = ParameterDirection.Output;
cmd.Parameters.Add(p_out_values);
OracleParameter p_in_values = new OracleParameter();
p_in_values.ParameterName = "IN_FILE_PATHS";
p_in_values.OracleDbType = OracleDbType.Varchar2;
p_in_values.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
p_in_values.Size = pathQuery.Count();
p_in_values.Value = pathQuery.ToArray();
p_in_values.Direction = ParameterDirection.Input;
cmd.Parameters.Add(p_in_values);
//cmd.ExecuteNonQuery();
OracleDataAdapter da = new OracleDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt); //the datatable here is always empty.
foreach (System.Data.DataRow dr in dt.Rows)
{
foreach (System.Data.DataColumn dc in dt.Columns)
{
Console.Write(dr[dc].ToString());
}
}
}
}
catch (Exception e)
{
EncryptUtils.Log(Const.LogMsgType.Error, e.GetBaseException().ToString());
}
}
运行此代码集完成没有错误,但我的结果数据表为空。如果我只通过PL / SQL中的测试窗口运行该过程,它将返回我期望的OUT_FILE_PATH_SEQ。为什么我的数据表为空?谢谢你的帮助。