我是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;
答案 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;
分享并享受。