【问题标题】:Oracle Stored Procedure Return Recordset with Field NamesOracle 存储过程返回带有字段名称的记录集
【发布时间】:2014-12-30 11:32:03
【问题描述】:

我是 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;

【问题讨论】:

  • sys_refcursor 将产生任何查询的结果,这里的一个字段是什么意思。参考oracle-base.com/articles/misc/…
  • 示例中的字段是“@Firstname”和“@Company”(在 Oracle 中,:Firstname, :Company)。调用程序需要带有字段的记录集。如果我返回其中一个,它可以工作,但如果我返回两个,我只会得到我的代码中提到的第一个。在 SQL Developer 中,我可以看到这两个变量。可以理解吗?
  • 在 Plsql 上发布您的示例代码,这可能有助于回答
  • 我在上面编辑了我的问题。谢谢

标签: oracle stored-procedures recordset


【解决方案1】:

用于 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 字段;例如

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;

分享和享受。

【讨论】:

  • 非常感谢。这真的帮助了我很多。但是,即使我的系统目前也无法访问。只是出于好奇和未来的问题。如果一开始不知道表,是否有任何可能,如何解决?我需要确定程序中的表格,然后交出所有“字段”。 “字段”的数量在任何表格中都是无关紧要的。
猜你喜欢
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 2014-05-23
  • 1970-01-01
相关资源
最近更新 更多