在作为 REF CURSOR 返回到 .NET 之前操作日期
manipulate date before returning as REF CURSOR to .NET
我有一个通过 ODAC 从 VB.NET 调用的 plsql 过程。
程序做一个简单的 select:
cursor C_emp is select name, surname from employees;
过程必须有一个 OUT 参数作为 REF CURSOR。
我知道我可以做一个简单的:
declare
L_cursor sys_refcursor;
begin
open L_cursor for select name, surname from employees;
...
end;
但是我需要根据 select 语句中的一些逻辑向 OUT REF CURSOR 添加几列。
我想做一个循环,一次将一条记录处理成数组类型的 table,然后将其转换成 REF CURSOR。
我该怎么做?非常感谢任何建议,非常感谢。
与在 select 语句中使用任何逻辑的方式相同。
declare
L_cursor sys_refcursor;
begin
OPEN l_cursor FOR SELECT name,
CASE
WHEN name LIKE 'Jack%' THEN 'Jack the Ripper'
END AS nick_name,
surname FROM employees;
...
end;
我很确定这些计算可以在一个 select 语句中完成,无需创建额外的游标。但是,如果您仍然想要它,我将向您展示一个如何实现它的可能示例。
首先,您必须声明一个对象TYPE
。 (它将代表结果查询中的一行):
create or replace type MY_TYPE as object (
name varchar2(64),
surname varchar2(64),
calculatedValue varchar2(64) --your calculated column. You may add as many columns as needed, but for simplicity, I'll stick to only one column
);
现在,创建 MY_TYPE
个对象的嵌套 table(它将代表整个结果集):
create or replace type MY_TYPE_LIST as table of MY_TYPE;
现在您已准备好将管道函数编写到return您想要的结果集。
create or replace function MY_FUNC return MY_TYPE_LIST pipelined as
cursor cur is
select name, surname from employees;
name varchar2(64);
surname varchar2(64);
calculatedColumn varchar2(64);
begin
open cur;
loop
fetch cur into name, surname;
exit when cur%notfound;
--do something here, calculate new columns
calculatedColumn := ...; --assign a value you want
pipe row (MY_TYPE(name, surname, calculatedColumn)); --the moment of truth. Pipe a row containing the new column
end loop;
end;
此函数将 return 一个包含 MY_TYPE
对象值的新游标。
我有一个通过 ODAC 从 VB.NET 调用的 plsql 过程。 程序做一个简单的 select:
cursor C_emp is select name, surname from employees;
过程必须有一个 OUT 参数作为 REF CURSOR。
我知道我可以做一个简单的:
declare
L_cursor sys_refcursor;
begin
open L_cursor for select name, surname from employees;
...
end;
但是我需要根据 select 语句中的一些逻辑向 OUT REF CURSOR 添加几列。
我想做一个循环,一次将一条记录处理成数组类型的 table,然后将其转换成 REF CURSOR。
我该怎么做?非常感谢任何建议,非常感谢。
与在 select 语句中使用任何逻辑的方式相同。
declare
L_cursor sys_refcursor;
begin
OPEN l_cursor FOR SELECT name,
CASE
WHEN name LIKE 'Jack%' THEN 'Jack the Ripper'
END AS nick_name,
surname FROM employees;
...
end;
我很确定这些计算可以在一个 select 语句中完成,无需创建额外的游标。但是,如果您仍然想要它,我将向您展示一个如何实现它的可能示例。
首先,您必须声明一个对象TYPE
。 (它将代表结果查询中的一行):
create or replace type MY_TYPE as object (
name varchar2(64),
surname varchar2(64),
calculatedValue varchar2(64) --your calculated column. You may add as many columns as needed, but for simplicity, I'll stick to only one column
);
现在,创建 MY_TYPE
个对象的嵌套 table(它将代表整个结果集):
create or replace type MY_TYPE_LIST as table of MY_TYPE;
现在您已准备好将管道函数编写到return您想要的结果集。
create or replace function MY_FUNC return MY_TYPE_LIST pipelined as
cursor cur is
select name, surname from employees;
name varchar2(64);
surname varchar2(64);
calculatedColumn varchar2(64);
begin
open cur;
loop
fetch cur into name, surname;
exit when cur%notfound;
--do something here, calculate new columns
calculatedColumn := ...; --assign a value you want
pipe row (MY_TYPE(name, surname, calculatedColumn)); --the moment of truth. Pipe a row containing the new column
end loop;
end;
此函数将 return 一个包含 MY_TYPE
对象值的新游标。