在PL / SQL存储过程中返回自定义类型

时间:2018-02-25 03:09:08

标签: sql oracle stored-procedures plsql oracle12c

我的目标是在PL / SQL中编写一个函数或一个存储过程,它返回一个表供用户立即查看。我有几十个历史表,想要给自己一张所有表中单个用户历史的快照。但我遇到了一个错误,我不确定这是否是最好的方法。

我目前的做法是将表格中的所有信息收集到一个自定义的"汇总表中。键入然后返回它。但是,当我使用我的自定义" userTable"作为我的out参数的类型

CREATE OR REPLACE PROCEDURE GetUserSnapShot(myid in Number, numdays in Number,
 myTable out userTable)
AS 
BEGIN
  /*maybe insert a row into the table here?*/
  myTable := null;
END;


DECLARE
   TYPE userChanges IS RECORD (
       historyTable VARCHAR(100),
       historyId NUMBER,
       changeType VARCHAR(6),
       changeDate DATE
     );
  TYPE userTable IS TABLE OF userChanges INDEX BY BINARY_INTEGER;
  myTable userTable;
 BEGIN
   GetUserSnapShot(5, 7, myTable);
END;

这是我在尝试运行时遇到的错误:标识符' USERTABLE'因为我已经声明了userTable

,所以必须声明这让我感到困惑

1 个答案:

答案 0 :(得分:2)

您已在匿名块中定义了类型USERTABLE,但该过程不知道匿名块中的内容,因此无法查看类型。

我建议您最好使用一个包,这样您就可以将记录类型,表类型和过程放在包中。一个例子是:

CREATE PACKAGE MY_PACKAGE AS  -- define the package spec
  TYPE userChanges IS RECORD
    (
    historyTable VARCHAR(100),
    historyId NUMBER,
    changeType VARCHAR(6),
    changeDate DATE
    );

  TYPE userTable IS TABLE OF userChanges
    INDEX BY BINARY_INTEGER;

  PROCEDURE GetUserSnapShot(myid    in     Number,
                            numdays in     Number,
                            myTable in out userTable);
END MY_PACKAGE;

CREATE PACKAGE BODY MY_PACKAGE AS  -- define the package body
  PROCEDURE GetUserSnapShot(myid    in     Number,
                            numdays in     Number,
                            myTable in out userTable)
  AS
    rec  userChanges; 
  BEGIN
    rec.historyTable := 'SOMEWHERE';
    rec.historyId    := 1;
    rec.changeType   := 'ABCDEF';
    rec.changeDate   := SYSDATE;

    myTable(1) := rec;
  END;
END MY_PACKAGE;

现在您可以引用打包的过程并在匿名块中键入:

DECLARE
  MY_PACKAGE.myTable userTable;
BEGIN
  MY_PACKAGE.GetUserSnapShot(5, 7, myTable);
END;

祝你好运。