【问题标题】:manipulate date before returning as REF CURSOR to .NET在作为 REF CURSOR 返回到 .NET 之前操作日期
【发布时间】:2019-04-11 06:03:44
【问题描述】:

我有一个通过 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 添加几列。

我想过做一个循环,一次将一条记录处理成一个数组类型的表,然后将其转换为 REF CURSOR。

我该怎么做?任何建议都非常感谢,非常感谢提前。

【问题讨论】:

  • 如果你想在游标上加几列,只要把它加到你select语句中,照常返回即可。
  • 是的,我想过,但逻辑有点混乱和冗长。
  • 您不能只向光标添加一列。您可以创建一个循环遍历第一个游标的新游标,或者使用一个游标并在其中提供您需要的所有数据。您可能应该解释一下“一些逻辑”是什么。
  • 是的,我想在循环通过我的第一个选择光标时创建一个新的 REF CURSOR。我该怎么做?

标签: oracle plsql cursor


【解决方案1】:

我很确定这些计算可以在一个 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 对象值的新游标。

【讨论】:

  • 非常感谢您的建议,管道应该运行良好。干杯。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多