场景为字符串长度超过4000,无法在数据库内单独处理,需结合编程工具如C#编程读取文本/EXCEL数据,用于将格式如下的数据做空间化入库。
1:POLYGON((12.0041696,22.4982501,12.7017899999999,22.0981097,12.9995904,22.49800979999997,......))
以下是数据库端存储过程:
sql
CREATE OR REPLACE PROCEDURE PROC_UPDATE_POLYGON(OBJECTID IN INTEGER,POLYTEXT IN CLOB,res out number)
IS
GEOM SDE.ST_GEOMETRY;
BEGIN
res :=0;
--GEOM:=SDE.ST_POLYFROMTEXT(POLYTEXT,2);
GEOM:=SDE.st_geomfromtext (POLYTEXT,2);
--INSERT INTO GRID (OBJECTID,SHAPE) VALUES(OBJECTID,GEOM);
update GRID t set t.shape=GEOM WHERE id=OBJECTID AND SHAPE IS NULL;
res := SQL%ROWCOUNT;
END PROC_UPDATE_POLYGON;
以下是文本格式数据处理的C#主要代码:
cs
private void UPDATE_POLYGON()
{
string filePath = textBox1.Text;
try
{
string[] lines = File.ReadAllLines(filePath);
richTextBox1.AppendText("总行数:" + lines.Length.ToString() + Environment.NewLine);
btnstart.Enabled = btnopenfile.Enabled = false;
oracle ora = new oracle();
int line_total = lines.Length;
int line_id = 1;
int success = 0;
int error = 0;
foreach (string line in lines)
{
//Console.WriteLine(line);
// 在此处可以对每一行的内容进行处理
string[] colsval = line.Split(':'); int id = int.Parse(colsval[3]);
string text1 = colsval[0];
string text2 = colsval[1];
string procname = "PROC_UPDATE_POLYGON";
OracleParameter[] pars = {
new OracleParameter("OBJECTID", OracleDbType.Int32),
new OracleParameter("POLYTEXT", OracleDbType.Clob),
new OracleParameter("res", OracleDbType.Int32),
};
pars[0].Value = id;
pars[0].Direction = ParameterDirection.Input;
pars[1].Value = text1;
pars[1].Direction = ParameterDirection.Input;
pars[2].Value = 0;
pars[2].Direction = ParameterDirection.Output;
int res1=ora.ExecProc(procname, pars);
int res = Int32.Parse(pars[4].Value.ToString());
if (res1 == -2)
{
error++;
Console.WriteLine(line);
string[] zbstr = text1.Split(',');
string[] zbstrnew = new string[zbstr.Length];
for (int i = 0;i<zbstr.Length;i++)
{
string[] z = zbstr[i].Split(' ');
for (int j = 0;j<z.Length;j++)
{
if (!z[j].Contains(".")) continue;
int pos1 = z[j].IndexOf(".");
int pos2 = z[j].Substring(z[j].IndexOf(".")).Length;
if (pos2 >= 8)
z[j] = z[j].Substring(0, pos1 + 8);
else
;
}
zbstrnew[i] = string.Join(" ", z);
}
pars[1].Value = string.Join(",", zbstrnew);
res1 = ora.ExecProc(procname, pars);
res = Int32.Parse(pars[4].Value.ToString());
}
else if (res > 0)
success++;
richTextBox1.AppendText(line_id.ToString() + "/" + line_total + ":::ID:" + id.ToString() + ":::RES:" + res + Environment.NewLine);
Thread.Sleep(10);
line_id++;
}
richTextBox1.AppendText("total:"+ line_total + ":::success:" + success+ ":::error:" + error + Environment.NewLine);
}
catch (Exception ex)
{
Console.WriteLine("文件读取出错:" + ex.Message);
}
btnstart.Enabled = btnopenfile.Enabled = true;
}
/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procname">存储过程名称</param>
/// <param name="parameters">存储过程参数</param>
/// <returns></returns>
public int ExecProc(string procname, OracleParameter[] parameters)
{
OracleConnection conn = OpenConn();
if (conn == null) { return -1; }
try
{
var cmd = conn.CreateCommand();
if (parameters != null)
{
// 添加参数
cmd.Parameters.AddRange(parameters);
}
conn.Open();
cmd.CommandText = procname;
cmd.CommandType = CommandType.StoredProcedure;
return cmd.ExecuteNonQuery();
}
catch (Exception e)
{
;
//throw new Exception(e.Message);
//MessageBox.Show(e.Message);
Console.WriteLine(e.Message);
Console.WriteLine("ERROR:" + parameters[0].Value);
return -2;
}
finally { CloseConn(conn); }
}
excel格式数据的处理流程相同,只是读取数据的步骤超有差异。