在作为REF CURSOR返回.NET之前先处理日期

时间:2019-04-11 06:03:45

标签: oracle plsql cursor

我有一个通过ODAC从VB.NET调用的plsql过程。 过程进行简单选择:

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中添加几列。

我考虑过一次循环,一次处理一条记录到array类型的表中,然后将其转换为REF CURSOR。

我该怎么做?非常感谢任何建议,在此先感谢。

2 个答案:

答案 0 :(得分:0)

与在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;

答案 1 :(得分:0)

我非常确定这些计算可以在一个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对象的嵌套表(它将代表整个结果集):

create or replace type MY_TYPE_LIST as table of MY_TYPE;

现在您可以编写管道函数以返回所需的结果集了。

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;

此函数将返回一个包含MY_TYPE对象值的新光标。