你尝试一下, 使用 函数 来处理, 应该就可以避免掉 存储过程参数没法写的问题。
10年积累的网站建设、做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有小店免费网站建设让你可以放心的选择与我们合作。
创建返回结果集的函数
SQL create or replace package pkg_HelloWorld as
2 -- 定义ref cursor类型
3 type myrctype is ref cursor;
4 --函数申明
5 function getHelloWorld return myrctype;
6 end pkg_HelloWorld;
7 /
程序包已创建。
SQL CREATE OR REPLACE package body pkg_HelloWorld as
2 function getHelloWorld return myrctype
3 IS
4 return_cursor myrctype;
5 BEGIN
6 OPEN return_cursor FOR
7 SELECT 'Hello 1' AS a, 'World 1' AS B FROM dual
8 UNION ALL
9 SELECT 'Hello 2' AS a, 'World 2' AS B FROM dual;
10 return return_cursor;
11 END getHelloWorld;
12 end pkg_HelloWorld;
13 /
程序包体已创建。
注:Oracle 这里的函数,是一个返回游标类型的函数, 不是像 SQL Server 的那种叫 “表值函数” 的东西。
因此下面的写法会报错。
SQL SELECT * FROM pkg_HelloWorld.getHelloWorld();
SELECT * FROM pkg_HelloWorld.getHelloWorld()
*
第 1 行出现错误:
ORA-00933: SQL 命令未正确结束
SQL SELECT pkg_HelloWorld.getHelloWorld() FROM dual;
PKG_HELLOWORLD.GETHE
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
A B
------- -------
Hello 1 World 1
Hello 2 World 2
C# 如何调用上面的 返回结果集的例子:
/// summary
/// 测试 调用 Oracle 返回结果集的函数.
/// /summary
private void CallFuncWithTable(OracleConnection conn)
{
// 创建一个 Command.
OracleCommand testCommand = conn.CreateCommand();
// 定义需要执行的SQL语句. testCommand.CommandText = "pkg_HelloWorld.getHelloWorld";
// 定义好,本次执行的类型,是存储过程. testCommand.CommandType = CommandType.StoredProcedure;
// 定义好,我这个参数,是 游标 + 返回值.
OracleParameter para = new OracleParameter("c", OracleType.Cursor);
para.Direction = ParameterDirection.ReturnValue;
testCommand.Parameters.Add(para);
// 执行SQL命令,结果存储到Reader中.
OracleDataReader testReader = testCommand.ExecuteReader();
// 处理检索出来的每一条数据.
while (testReader.Read())
{
// 将检索出来的数据,输出到屏幕上.
Console.WriteLine("调用函数:{0}; 返回:{1} - {2}",
testCommand.CommandText, testReader[0], testReader[1]
);
}
// 关闭Reader.
testReader.Close();
}
判断sql语句是否查出数据不用游标操作,只需要判断运行的sql结果的行数是否为0,如果为0,则无数据,如果非0,则有数据。
示例代码如下:
declare
v_count int;--定义变量
begin
select count(*) into v_count from test;--取出表中数据导变量
if v_count=0 --判断有无数据
then dbms_output.put_line('表中无数据');
else
dbms_output.put_line('表中有数据,数据条数为'||v_count);
end if;
end;
运行结果:
Oracle中的游标分为显示游标和隐式游标。
显示游标:
显示游标是用cursor...is命令定义的游标,它可以对查询语句(select)返回的多条记录进行处理;显示游标的操作:打开游标、操作游标、关闭游标;
隐式游标:
隐式游标是在执行插入(insert)、删除(delete)、修改(update)和返回单条记录的查询(select)语句时由PL/SQL自动定义的。PL/SQL隐式地打开SQL游标,并在它内部处理SQL语句,然后关闭它。