带有字段名称的Oracle存储过程返回记录集

时间:2014-12-30 11:32:04

标签: oracle stored-procedures recordset

我是Oracle和存储过程的新手。我只是想知道它是否可能(如在SQL Server中)将具有字段名称的记录集返回给外部程序。我读了一些文件,但我不确定我是否走在正确的轨道上。当我使用Sys_Refcursor时,我只能返回一个字段而不是我想要的数量。

我需要返回多个字段名称,并且我有一个输入参数。

在该程序的文档中,我有一个SQL Server的示例,我希望我的Oracle存储过程具有相同的功能:

Use
Go
Set Ansi_Nulls ON
Go
Alter Procedure
   @InputLocation Varchar(255)
As
Begin
   Set Nocount On;
   select FirstName as '@FirstName', Company as '@Company' from dbo.company where Location = @InputLocation
End

我有什么建议可以做到吗?如果您需要一些额外的信息,请告诉我。感谢。

/编辑:

我的示例代码(在第一步中不使用输入参数,只是为了生成输出以查看它是否有效):

create or replace 
PROCEDURE TEST_PROZEDUR1 (
  Input_Location IN Varchar2, 
  First_Name OUT SYS_Refcursor, 
  Company OUT Sys_Refcursor) IS 
BEGIN
  open First_Name For Select FirstName from dbo.company;
  open Company For Select Company from dbo.company;
END TEST_PROZEDUR1;

1 个答案:

答案 0 :(得分:0)

用于PL / SQL和TSQL的编程模型是不同的。在TSQL中可能返回记录集的位置,在PL / SQL中,您将返回一个游标。游标只是一个指向打开并可以读取的SQL语句的指针。它不仅限于返回单个列。粗略地说,上面的TSQL过程的PL / SQL等价物如下:

CREATE OR REPLACE FUNCTION GET_INPUT_LOCATION(pinInput_location IN VARCHAR2(255))
  RETURN SYS_REFCURSOR
IS
  cCursor  SYS_REFCURSOR;
BEGIN
  OPEN cCursor FOR
    SELECT FIRSTNAME,
           COMPANY
      FROM COMPANY
      WHERE LOCATION = pinInput_location;

  RETURN cCursor;
END GET_INPUT_LOCATION;

然后调用者将调用此函数:

DECLARE
  cCursor       SYS_REFCURSOR;
  strFirstname  COMPANY.FIRSTNAME%TYPE;
  strCompany    COMPANY.COMPANY%TYPE;
BEGIN
  cCursor := GET_INPUT_LOCATION('SOMEWHERE OVER THE RAINBOW, INC.');

  FETCH cCursor
    INTO strFirstname,
         strCompany;

  CLOSE cCursor;
END;

但是,我可能不会这样编码。如果COMPANY.LOCATION是唯一的,那么返回一个游标将会很麻烦,调用者在完成游戏时需要记住关闭游标,这可能是他们忘记做的。相反,我只是使用输出参数返回FIRSTNAME和COMPANY字段; e.g。

CREATE OR REPLACE PROCEDURE GET_INPUT_LOCATION
  (pinInput_location IN  VARCHAR2(255),
   poutFirst_name    OUT COMPANY.FIRSTNAME%TYPE,
   poutCompany       OUT COMPANY.COMPANY%TYPE)
IS
  cCursor  SYS_REFCURSOR;
BEGIN
  SELECT FIRSTNAME,
         COMPANY
    INTO poutFirst_name,
         poutCompany
    FROM COMPANY
    WHERE LOCATION = pinInput_location;
END GET_INPUT_LOCATION;

分享并享受。