【发布时间】:2017-11-07 22:25:27
【问题描述】:
我想在 oracle 中创建一个 procedure 或 function 以向我的应用程序返回多行不同类型的数据。我在互联网上找到了一些例子,但我无法让它工作......
示例: 我在 oracle 中创建了一个自定义类型:
create type proc_selectall is object
(Mjera varchar2(50),
Status number(10,0),
Naziv varchar2(50),
Stat number(10,0));
然后:
create type ret_selectall is table of proc_selectall;
然后创建函数:
create or replace function fsp_SelectAll return ret_selectall
is
l_ret_selectall ret_selectall := ret_selectall();
n integer := 0;
BEGIN
for r in(SELECT JEDINICAMJERE.Mjera,
JEDINICAMJERE.Status,
KATEGORIJE.Naziv,
KATEGORIJE.Status as Stat
FROM JEDINICAMJERE, KATEGORIJE)
loop
l_ret_selectall.extend;
n := n + 1;
l_ret_selectall(n) := proc_selectall(r.Mjera, r.Status, r.Naziv, r.Stat);
end loop;
return l_ret_selectall;
END;
当我输入这一行时:
select * from table (fsp_SelectAll)
我得到了一个不错的预期输出:
MJERA | STATUS | NAZIV | STAT
tr 0 name1 1
fd 1 name2 1
ds 1 name3 0
.....
后来我尝试在我的应用中获取这些值。 我尝试过这样的事情:
//cmd.Parameters.Add("proc_selectall ", OracleDbType.Object);
//cmd.Parameters.Add("ret_selectall ", OracleDbType.Array);
//cmd.Parameters["ret_selectall "].Direction = ParameterDirection.ReturnValue;
//if (connection.State == ConnectionState.Closed)
// connection.Open();
//cmd.ExecuteNonQuery();
稍后...
//OracleCommand objCmd = new OracleCommand("select * from table fsp_SelectAll", connection);
//objCmd.CommandType = CommandType.StoredProcedure;
//objCmd.ExecuteNonQuery();
//int size=objCmd.ExecuteReader().FieldCount;
我也试过
//adapter = new OracleDataAdapter(cmd);...
但是关于类型,参数总是有一些错误...... (连接到 oracle 工作。我执行了插入、更新、删除过程,它们工作正常)
我也尝试创建这个程序:(这是我的第一次尝试)
CREATE OR REPLACE PROCEDURE osp_SelectAll (Mjera OUT VARCHAR2,
Status OUT NUMBER, Naziv OUT VARCHAR2,Stat OUT NUMBER) AS
BEGIN
SELECT JEDINICAMJERE.Mjera,
JEDINICAMJERE.Status,
KATEGORIJE.Naziv,
KATEGORIJE.Status as Stat INTO Mjera, Status, Naziv, Stat
FROM JEDINICAMJERE, KATEGORIJE;
END osp_SelectAll;
但它没有返回任何一行或多行......我放弃了。
请帮帮我,我需要解决这个问题。
【问题讨论】:
-
你想执行一个查询,所以
ExecuteNonQuery()是错误的方法。您需要返回阅读器的ExecuteReader(),并且您想要循环while(Reader.Read())。在该循环中,您要解析var someField = (string)Reader["SomeFieldName"]之类的字段 -
感谢重播...我创建了您的建议并符合以下要求:rdr=objCmd.ExecuteReader();我收到错误:{“ORA-06550:第 1 行,第 27 列:\nPL/SQL:ORA-00906:缺少左括号\nORA-06550:第 1 行,第 7 列:\nPL/SQL:SQL 语句被忽略”}
标签: c# oracle function connection procedure