正如@mustaccio說,你調用一個過程有三個參數,但只有通過一個在您需要通過外部用於填充OUT參數的定義變量。
既然你似乎可以用SQL * Plus或SQL Developer,您可以創建一個variable
命令客戶端綁定變量,並通過這些,然後打印它們的值:
variable lCountry varchar2(30);
variable lRegion varchar2(30);
execute sp_getregions (1, :lCountry, :lRegion);
print lCountry
print lRegion
這只是真的是有用的測試程序。你會更容易定義PL/SQL變量,從塊或其他程序等調用過程:
declare
lCountry COUNTRIES.COUNTRY_NAME%TYPE;
lRegion REGIONS.REGION_NAME%TYPE;
begin
sp_getregions (1, lCountry, lRegion);
-- do something with the local variables
end;
/
但是,你的程序只會在有一個國家的工作地區。如果該地區沒有國家(這不太可能),那麼你會得到一個沒有數據發現的例外;如果該地區有多個國家(很有可能),你會得到一個太多的例外。 The select ... into
construct必須得到結果集中的一行數據。
因爲它要如何使用或消費返回的數據,如果你確實需要一個返回REF遊標,或a collection一個功能我不能告訴不明顯。
使用OUT REF遊標的基本程序是:
create or replace PROCEDURE SP_GetRegions
(
pRegionID IN REGIONS.REGION_ID%TYPE,
pCursor OUT SYS_REFCURSOR
)
IS
BEGIN
OPEN pCursor FOR
SELECT c.Country_Name,
r.Region_Name
FROM COUNTRIES c
INNER JOIN REGIONS r
ON r.REGION_ID = c.REGION_ID
WHERE r.REGION_ID = pRegionID
;
END SP_GetRegions;
/
然後你可以調用,使用綁定變量並打印結果:
variable lCursor refcursor;
exec SP_GetRegions(1, :lCursor);
print lCursor;
這將是更常見到使用函數:
drop PROCEDURE SP_GetRegions;
create or replace FUNCTION SP_GetRegions
(
pRegionID IN REGIONS.REGION_ID%TYPE
)
RETURN SYS_REFCURSOR
IS
lCursor SYS_REFCURSOR;
BEGIN
OPEN lCursor FOR
SELECT c.Country_Name,
r.Region_Name
FROM COUNTRIES c
INNER JOIN REGIONS r
ON r.REGION_ID = c.REGION_ID
WHERE r.REGION_ID = pRegionID
;
RETURN lCursor;
END SP_GetRegions;
/
您可以從PL/SQL或普通SQL中調用它:
select SP_GetRegions(1) from dual;
COUNTRY_NAME REGION_NAME
---------------------------------------- -------------------------
Belgium Europe
Switzerland Europe
Germany Europe
Denmark Europe
France Europe
Italy Europe
Netherlands Europe
United Kingdom Europe
您已經使用三個參數定義了過程,但只用一個參數調用它。你認爲'pCountry'和'pRegion'會在哪裏返回? – mustaccio
列c.Country_Name,r.Region_Name? – giantLincecum
這是我在進程內的最後一個版本: 創建或替換PROCEDURE SP_GetRegions ( pRegionID IN REGIONS.REGION_ID%TYPE ) IS BEGIN SELECT c.Country_Name, r.Region_Name 各國Ç INNER JOIN REGIONS r ON r.REGION_ID = c.REGION_ID WHERE r。REGION_ID = pRegionID ; END SP_GetRegions; 但我檢索到這個錯誤:錯誤(9,3):PLS-00428:INTO子句預計在這個SELECT語句,我不知道爲什麼D: – giantLincecum